Replaces the disabled "Coming soon" buttons on the pricing page with a waitlist band so visitors can be notified when alerts launch — separate from registered users. - waitlist_subscribers table (name, email unique, source, referrer) - WaitlistService::subscribe — normalises email, idempotent - Public POST /api/waitlist (throttle:10,1), thin controller + form request - Read-only Filament resource with streamed CSV export - Vue: useWaitlist composable + WaitlistForm, rendered below the grid while any tier is still "coming soon"; sends source + document.referrer Announcement send mechanism deferred to a later task. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
32 lines
934 B
PHP
32 lines
934 B
PHP
<?php
|
|
|
|
use App\Filament\Resources\WaitlistSubscriberResource\Pages\ListWaitlistSubscribers;
|
|
use App\Models\User;
|
|
use App\Models\WaitlistSubscriber;
|
|
use Livewire\Livewire;
|
|
|
|
beforeEach(function () {
|
|
$this->actingAs(User::factory()->admin()->create());
|
|
});
|
|
|
|
it('lists waitlist subscribers', function () {
|
|
$subscribers = WaitlistSubscriber::factory()->count(3)->create();
|
|
|
|
Livewire::test(ListWaitlistSubscribers::class)
|
|
->assertOk()
|
|
->assertCanSeeTableRecords($subscribers);
|
|
});
|
|
|
|
it('exposes a CSV export header action', function () {
|
|
Livewire::test(ListWaitlistSubscribers::class)
|
|
->assertActionExists('export');
|
|
});
|
|
|
|
it('exports a CSV download when the action runs against real subscribers', function () {
|
|
WaitlistSubscriber::factory()->count(2)->create();
|
|
|
|
Livewire::test(ListWaitlistSubscribers::class)
|
|
->callAction('export')
|
|
->assertFileDownloaded('waitlist.csv');
|
|
});
|