create([ 'paddle_customer_id' => 'cus_123', ]); $user = User::factory()->for($tenant)->create(); $package = Package::factory()->create([ 'paddle_price_id' => 'pri_123', 'paddle_product_id' => 'pro_123', 'price' => 120, ]); $coupon = Coupon::factory()->create([ 'code' => 'SAVE15', 'paddle_discount_id' => 'dsc_123', ]); $coupon->packages()->attach($package); $couponServiceMock = Mockery::mock(CouponService::class); $couponServiceMock->shouldReceive('preview') ->once() ->andReturn([ 'coupon' => $coupon, 'pricing' => [ 'currency' => 'EUR', 'subtotal' => 120.0, 'discount' => 18.0, 'tax' => 0, 'total' => 102.0, 'formatted' => [ 'subtotal' => '€120.00', 'discount' => '-€18.00', 'tax' => '€0.00', 'total' => '€102.00', ], 'breakdown' => [], ], 'source' => 'manual', ]); $this->instance(CouponService::class, $couponServiceMock); $paddleServiceMock = Mockery::mock(PaddleCheckoutService::class); $paddleServiceMock->shouldReceive('createCheckout') ->once() ->andReturn([ 'checkout_url' => 'https://example.com/checkout/test', 'id' => 'chk_123', ]); $this->instance(PaddleCheckoutService::class, $paddleServiceMock); $this->be($user); $response = $this->postJson(route('paddle.checkout.create'), [ 'package_id' => $package->id, 'coupon_code' => 'SAVE15', ]); $response->assertOk() ->assertJsonPath('checkout_url', 'https://example.com/checkout/test'); $this->assertDatabaseHas('checkout_sessions', [ 'package_id' => $package->id, 'coupon_code' => 'SAVE15', ]); } }