diff --git a/app/Http/Controllers/SubscriptionController.php b/app/Http/Controllers/SubscriptionController.php index 2bd12f2f..b719f668 100644 --- a/app/Http/Controllers/SubscriptionController.php +++ b/app/Http/Controllers/SubscriptionController.php @@ -136,6 +136,12 @@ class SubscriptionController extends Controller ->withErrors(['demo' => 'Billing management is not available on the demo account.']); } - return $request->user()->redirectToBillingPortal(route('settings.billing')); + $user = $request->user(); + + if (! $user->hasStripeId()) { + $user->createAsStripeCustomer(); + } + + return $user->redirectToBillingPortal(route('settings.billing')); } } diff --git a/tests/Feature/SubscriptionTest.php b/tests/Feature/SubscriptionTest.php index 3768c0e2..0831408e 100644 --- a/tests/Feature/SubscriptionTest.php +++ b/tests/Feature/SubscriptionTest.php @@ -1,11 +1,13 @@ where('canUseFreePlan', false) ); }); + +test('billing portal creates stripe customer when user has no stripe id', function () { + $user = Mockery::mock(User::class)->shouldIgnoreMissing(); + $user->shouldReceive('isDemoAccount')->andReturn(false); + $user->shouldReceive('hasStripeId')->once()->andReturn(false); + $user->shouldReceive('createAsStripeCustomer')->once(); + $user->shouldReceive('redirectToBillingPortal') + ->with(route('settings.billing')) + ->once() + ->andReturn(new RedirectResponse(route('settings.billing'))); + + $this->withoutMiddleware(HandleInertiaRequests::class); + $this->actingAs($user); + + $this->get(route('settings.billing.portal'))->assertRedirect(); +}); + +test('billing portal skips stripe customer creation when user already has a stripe id', function () { + $user = Mockery::mock(User::class)->shouldIgnoreMissing(); + $user->shouldReceive('isDemoAccount')->andReturn(false); + $user->shouldReceive('hasStripeId')->once()->andReturn(true); + $user->shouldNotReceive('createAsStripeCustomer'); + $user->shouldReceive('redirectToBillingPortal') + ->with(route('settings.billing')) + ->once() + ->andReturn(new RedirectResponse(route('settings.billing'))); + + $this->withoutMiddleware(HandleInertiaRequests::class); + $this->actingAs($user); + + $this->get(route('settings.billing.portal'))->assertRedirect(); +});