get('/dashboard')->assertRedirect('/login'); }); it('shows the dashboard to authenticated users', function () { $user = User::factory()->create(); $this->actingAs($user)->get('/dashboard') ->assertOk() ->assertSee('CluPilot') ->assertSee(__('dashboard.title')); }); it('shows no next invoice once the customer has given notice', function () { // Cancelling leaves the subscription active until the term runs out, so // `current_period_end` becomes the day service ENDS rather than the day the // next charge falls. Billing a renewal that will never happen, on the sheet // a customer checks their invoices against, is the worst line this page // could carry. $user = App\Models\User::factory()->create(); $customer = App\Models\Customer::factory()->create(['user_id' => $user->id]); $instance = App\Models\Instance::factory()->create([ 'customer_id' => $customer->id, 'status' => 'cancellation_scheduled', 'cancel_requested_at' => now(), 'service_ends_at' => now()->addMonth(), ]); App\Models\Subscription::factory()->create([ 'customer_id' => $customer->id, 'instance_id' => $instance->id, 'status' => 'active', 'price_cents' => 17900, 'currency' => 'EUR', 'term' => 'monthly', 'current_period_end' => now()->addMonth(), ]); Livewire::actingAs($user) ->test(App\Livewire\Dashboard::class) ->assertViewHas('nextInvoice', null) // The price is still on the master record — they pay it until the end. ->assertViewHas('planPrice', fn (?array $p) => $p !== null && $p['cents'] === 17900) ->assertDontSee(__('dashboard.invoice.label')); });