Testing
Overview
All examples in this guide will be written using Pest. However, you can easily adapt this to PHPUnit.
Since the Form Builder works on Livewire components, you can use the Livewire testing helpers. However, we have custom testing helpers that you can use with forms:
Filling a form
To fill a form with data, pass the data to fillform()
:
use function Pest\Livewire\livewire;
livewire(CreatePost::class)
->fillForm([
'title' => fake()->sentence(),
// ...
]);
If you have multiple forms on a Livewire component, you can specify which form you want to fill using
fillForm([...], 'createPostForm')
.
To check that a form has data, use assertFormSet()
:
use Illuminate\Support\Str;
use function Pest\Livewire\livewire;
it('can automatically generate a slug from the title', function () {
$title = fake()->sentence();
livewire(CreatePost::class)
->fillForm([
'title' => $title,
])
->assertFormSet([
'slug' => Str::slug($title),
]);
});
If you have multiple forms on a Livewire component, you can specify which form you want to check using
assertFormSet([...], 'createPostForm')
.
Validation
Use assertHasFormErrors()
to ensure that data is properly validated in a form:
use function Pest\Livewire\livewire;
it('can validate input', function () {
livewire(CreatePost::class)
->fillForm([
'title' => null,
])
->assertHasFormErrors(['title' => 'required']);
});
And assertHasNoFormErrors()
to ensure there are no validation errors:
use function Pest\Livewire\livewire;
livewire(CreatePost::class)
->fillForm([
'title' => fake()->sentence(),
// ...
])
->call('save')
->assertHasNoFormErrors();
If you have multiple forms on a Livewire component, you can pass the name of a specific form as the second parameter like
assertHasFormErrors(['title' => 'required'], 'createPostForm')
orassertHasNoFormErrors([], 'createPostForm')
.
Form existence
To check that a Livewire component has a form, use assertFormExists()
:
use function Pest\Livewire\livewire;
it('has a form', function () {
livewire(CreatePost::class)
->assertFormExists();
});
If you have multiple forms on a Livewire component, you can pass the name of a specific form like
assertFormExists('createPostForm')
.
Fields
To ensure that a form has a given field, pass the field name to assertFormFieldExists()
:
use function Pest\Livewire\livewire;
it('has a title field', function () {
livewire(CreatePost::class)
->assertFormFieldExists('title');
});
You may pass a function as an additional argument in order to assert that a field passes a given "truth test". This is useful for asserting that a field has a specific configuration:
use function Pest\Livewire\livewire;
it('has a title field', function () {
livewire(CreatePost::class)
->assertFormFieldExists('title', function (TextInput $field): bool {
return $input->isDisabled();
});
});
If you have multiple forms on a Livewire component, you can specify which form you want to check for the existence of the field like
assertFormFieldExists('title', 'createPostForm')
.
Hidden fields
To ensure that a field is visible, pass the name to assertFormFieldIsVisible()
:
use function Pest\Livewire\livewire;
test('title is visible', function () {
livewire(CreatePost::class)
->assertFormFieldIsVisible('title');
});
Or to ensure that a field is hidden you can pass the name to assertFormFieldIsHidden()
:
use function Pest\Livewire\livewire;
test('title is hidden', function () {
livewire(CreatePost::class)
->assertFormFieldIsHidden('title');
});
For both
assertFormFieldIsHidden()
andassertFormFieldIsVisible()
you can pass the name of a specific form the field belongs to as the second argument likeassertFormFieldIsHidden('title', 'createPostForm')
.
Disabled fields
To ensure that a field is enabled, pass the name to assertFormFieldIsEnabled()
:
use function Pest\Livewire\livewire;
test('title is enabled', function () {
livewire(CreatePost::class)
->assertFormFieldIsEnabled('title');
});
Or to ensure that a field is disabled you can pass the name to assertFormFieldIsDisabled()
:
use function Pest\Livewire\livewire;
test('title is disabled', function () {
livewire(CreatePost::class)
->assertFormFieldIsDisabled('title');
});
For both
assertFormFieldIsEnabled()
andassertFormFieldIsDisabled()
you can pass the name of a specific form the field belongs to as the second argument likeassertFormFieldIsEnabled('title', 'createPostForm')
.