Дії тестують через livewire() на тій сторінці чи компоненті, де вони розміщені.
Дія на сторінці (наприклад, у шапці сторінки редагування):
use App\Filament\Resources\Orders\Pages\EditOrder;
use App\Models\Order;
use function Pest\Livewire\livewire;
it('cancels an order', function () {
$order = Order::factory()->paid()->create();
livewire(EditOrder::class, ['record' => $order->getRouteKey()])
->callAction('cancel', data: ['reason' => 'Клієнт передумав'])
->assertHasNoFormErrors()
->assertNotified('Замовлення скасовано');
expect($order->refresh()->status)->toBe(OrderStatus::Cancelled);
});
Дія в рядку таблиці - через TestAction:
use Filament\Actions\Testing\TestAction;
livewire(ListOrders::class)
->callAction(TestAction::make('cancel')->table($order), data: ['reason' => '...']);
// масова дія
livewire(ListOrders::class)
->selectTableRecords($orders->pluck('id')->all())
->callAction(TestAction::make('cancel')->table()->bulk());
Валідація даних модального вікна:
livewire(EditOrder::class, ['record' => $order->getRouteKey()])
->callAction('cancel', data: ['reason' => ''])
->assertHasFormErrors(['reason' => 'required']);
Зупинка дії ($action->halt() у хуку):
livewire(EditOrder::class, ['record' => $shipped->getRouteKey()])
->callAction('cancel')
->assertActionHalted('cancel');
Видимість і права:
$this->actingAs(User::factory()->support()->create());
livewire(ListOrders::class)
->assertActionHidden(TestAction::make('refund')->table($order))
->assertActionVisible(TestAction::make('view')->table($order));
Сповіщення:
->assertNotified()/->assertNotified('Заголовок')/->assertNotNotified()- для сповіщень через сесію;- сповіщення в базі даних - це звичайні сповіщення Laravel:
Notification::fake()(фасад Laravel) іassertSentTo($user, \Filament\Notifications\DatabaseNotification::class).
Що варто перевіряти обов'язково:
- заборону, а не лише успіх: користувач без прав не бачить дію, а підроблений виклик нічого не змінює в базі;
- побічні ефекти через фейки:
Mail::fake(),Queue::fake(),Bus::fake(), - а не реальні листи й джоби; - для дій у шапці таблиці -
TestAction::make('export')->table()без запису.