Сторінка списку ресурсу - Livewire-компонент, тож її тестують через livewire() з хелперами Filament.
use App\Filament\Resources\Orders\Pages\ListOrders;
use App\Models\Order;
use App\Models\User;
use Filament\Actions\Testing\TestAction;
use function Pest\Livewire\livewire;
beforeEach(fn () => $this->actingAs(User::factory()->admin()->create()));
it('lists, searches and sorts orders', function () {
$orders = Order::factory()->count(5)->create();
livewire(ListOrders::class)
->assertCanSeeTableRecords($orders)
->searchTable($orders->first()->number)
->assertCanSeeTableRecords($orders->take(1))
->assertCanNotSeeTableRecords($orders->skip(1));
livewire(ListOrders::class)
->sortTable('total', 'desc')
->assertCanSeeTableRecords($orders->sortByDesc('total'), inOrder: true);
});
it('filters by status', function () {
$paid = Order::factory()->paid()->count(2)->create();
$new = Order::factory()->count(3)->create();
livewire(ListOrders::class)
->filterTable('status', 'paid')
->assertCanSeeTableRecords($paid)
->assertCanNotSeeTableRecords($new);
});
it('archives an order from the row action', function () {
$order = Order::factory()->create();
livewire(ListOrders::class)
->callAction(TestAction::make('archive')->table($order))
->assertNotified();
expect($order->fresh()->archived_at)->not->toBeNull();
});
Масові дії - спершу вибрати рядки:
livewire(ListOrders::class)
->selectTableRecords($orders->pluck('id')->all())
->callAction(TestAction::make('archive')->table()->bulk());
Пастки:
- автентифікація обов'язкова - без
actingAs()тест отримає редирект на вхід чи 403, і зовсім не те, що перевіряє; deferLoading()- таблиця з відкладеним завантаженням не містить рядків, доки не викликати->loadTable(). Без цьогоassertCanSeeTableRecordsпадає на, здавалося б, робочому коді;- збережений у сесії стан (фільтри, сортування) може перетікати між викликами
livewire()в одному тесті; - видимість дій для різних ролей варто тестувати окремо:
assertActionHidden(TestAction::make('delete')->table($order))для користувача без прав; - тестувати варто свою логіку (власні фільтри, дії, скоупи), а не те, що Filament уміє сортувати колонку.