Сторінки створення й редагування ресурсу - Livewire-компоненти, і Filament додає до livewire() хелпери для форм.
Створення запису:
use App\Filament\Resources\Posts\Pages\CreatePost;
use App\Filament\Resources\Posts\Pages\EditPost;
use App\Models\Post;
use App\Models\User;
use function Pest\Laravel\assertDatabaseHas;
use function Pest\Livewire\livewire;
beforeEach(fn () => $this->actingAs(User::factory()->admin()->create()));
it('creates a post', function () {
livewire(CreatePost::class)
->fillForm([
'title' => 'Нова стаття',
'slug' => 'nova-stattia',
'status' => 'draft',
])
->call('create')
->assertHasNoFormErrors()
->assertNotified()
->assertRedirect();
assertDatabaseHas(Post::class, ['slug' => 'nova-stattia']);
});
Валідація:
it('rejects a duplicate slug', function () {
Post::factory()->create(['slug' => 'taken']);
livewire(CreatePost::class)
->fillForm(['title' => 'X', 'slug' => 'taken'])
->call('create')
->assertHasFormErrors(['slug' => 'unique']);
});
Редагування й заповнення форми:
it('fills the edit form', function () {
$post = Post::factory()->create();
livewire(EditPost::class, ['record' => $post->getRouteKey()])
->assertSchemaStateSet([
'title' => $post->title,
])
->fillForm(['title' => 'Оновлено'])
->call('save')
->assertHasNoFormErrors();
expect($post->refresh()->title)->toBe('Оновлено');
});
Видимість і реактивність:
livewire(CreatePost::class)
->fillForm(['status' => 'draft'])
->assertFormFieldHidden('published_at')
->fillForm(['status' => 'scheduled'])
->assertFormFieldVisible('published_at');
Майстри: goToNextWizardStep() і assertWizardCurrentStep(2); помилки кроку перевіряються тим самим assertHasFormErrors().
На що звернути увагу:
- тестуйте валідацію
Select: Filament за замовчуванням не приймає значення поза списком варіантів, і тест підтверджує, що підставлений id не пройде; - права: окремий тест, що користувач без політики
createотримує 403 на сторінці створення; mutateFormDataBeforeCreate()перевіряється через стан бази: чи записавсяuser_id, якого у формі немає;- ключ запису передається як
getRouteKey(), а неid, якщо ресурс використовує slug у маршрутах.