'price_test_basic_monthly', 'services.stripe.prices.basic.annual' => 'price_test_basic_annual', 'services.stripe.prices.plus.monthly' => 'price_test_plus_monthly', 'services.stripe.prices.plus.annual' => 'price_test_plus_annual', 'services.stripe.prices.pro.monthly' => null, 'services.stripe.prices.pro.annual' => null, ]); }); it('requires authentication for the checkout route', function (): void { $this->get('/billing/checkout/basic/monthly')->assertRedirect('/login'); }); it('requires authentication for the portal route', function (): void { $this->get('/billing/portal')->assertRedirect('/login'); }); it('rejects an unknown tier', function (): void { $this->actingAs(User::factory()->create()) ->get('/billing/checkout/titanium/monthly') ->assertNotFound(); }); it('rejects an unknown cadence', function (): void { $this->actingAs(User::factory()->create()) ->get('/billing/checkout/basic/weekly') ->assertNotFound(); }); it('returns 404 when no price is configured for the tier + cadence', function (): void { $this->actingAs(User::factory()->create()) ->get('/billing/checkout/pro/monthly') ->assertNotFound(); }); it('redirects the success route to the dashboard', function (): void { $this->actingAs(User::factory()->create()) ->get('/billing/success') ->assertRedirect(route('dashboard')) ->assertSessionHas('status', 'subscription_started'); }); it('redirects the cancel route to the dashboard', function (): void { $this->actingAs(User::factory()->create()) ->get('/billing/cancel') ->assertRedirect(route('dashboard')) ->assertSessionHas('status', 'subscription_cancelled'); });