From 5322591f0d628ee97016c1003290fc92d9f720ec Mon Sep 17 00:00:00 2001 From: CodeWithDennis Date: Wed, 10 Sep 2025 14:54:32 +0200 Subject: [PATCH 01/19] Add CanCreateRecordTest to list of test classes --- src/Commands/FilamentTestsCommand.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Commands/FilamentTestsCommand.php b/src/Commands/FilamentTestsCommand.php index 61b1d635..fd36f155 100644 --- a/src/Commands/FilamentTestsCommand.php +++ b/src/Commands/FilamentTestsCommand.php @@ -6,6 +6,7 @@ use CodeWithDennis\FilamentTests\Concerns\Commands\InteractsWithUserInput; use CodeWithDennis\FilamentTests\TestRenderers\BaseTest; use CodeWithDennis\FilamentTests\TestRenderers\BeforeEach; +use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Create\CanCreateRecordTest; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Create\CanRenderCreatePageTest; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Edit\CanDeleteRecordTest; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Edit\CanRenderEditPageTest; @@ -89,6 +90,7 @@ protected function getRenderers(): array ShowsHeaderActionTest::class, HidesHeaderActionTest::class, HasFilterTest::class, + CanCreateRecordTest::class, ]; } } From dad12f29f74b914fb6763eb11d476faa88a81955 Mon Sep 17 00:00:00 2001 From: CodeWithDennis Date: Wed, 10 Sep 2025 15:00:44 +0200 Subject: [PATCH 02/19] Add test for creating a record in CanCreateRecordTest --- .../pages/create/can-create-record.blade.php | 19 +++++++++++++++++++ .../Pages/Create/CanCreateRecordTest.php | 15 +++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 resources/views/resources/pages/create/can-create-record.blade.php create mode 100644 src/TestRenderers/Resources/Pages/Create/CanCreateRecordTest.php diff --git a/resources/views/resources/pages/create/can-create-record.blade.php b/resources/views/resources/pages/create/can-create-record.blade.php new file mode 100644 index 00000000..d78f18ea --- /dev/null +++ b/resources/views/resources/pages/create/can-create-record.blade.php @@ -0,0 +1,19 @@ +@php use Illuminate\Support\Facades\Log; @endphp +it('can create a record', function (): void { +$record = {{ $getResourceModel() }}::factory()->make(); + +livewire({{ $getPageClass('create') }}::class) + ->fillForm([ + @foreach($getResourceFormFields() as $key => $field) + '{{ $key }}' => $record->{{ $key }}, + @endforeach + ]) + ->call('create') + ->assertNotified(); + + $this->assertDatabaseHas({{ $getResourceModel() }}::class, [ + @foreach($getResourceFormFields() as $key => $field) + '{{ $key }}' => $record->{{ $key }}, + @endforeach + ]); +}); diff --git a/src/TestRenderers/Resources/Pages/Create/CanCreateRecordTest.php b/src/TestRenderers/Resources/Pages/Create/CanCreateRecordTest.php new file mode 100644 index 00000000..3927738a --- /dev/null +++ b/src/TestRenderers/Resources/Pages/Create/CanCreateRecordTest.php @@ -0,0 +1,15 @@ +hasPage('create'); + } +} From 3c455272af1c57c93313b22ba4c37855d25d0aa5 Mon Sep 17 00:00:00 2001 From: CodeWithDennis Date: Wed, 10 Sep 2025 15:04:10 +0200 Subject: [PATCH 03/19] Refactor test for creating a record in Laravel Livewire --- .../pages/create/can-create-record.blade.php | 29 +++++++++---------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/resources/views/resources/pages/create/can-create-record.blade.php b/resources/views/resources/pages/create/can-create-record.blade.php index d78f18ea..164112ca 100644 --- a/resources/views/resources/pages/create/can-create-record.blade.php +++ b/resources/views/resources/pages/create/can-create-record.blade.php @@ -1,19 +1,18 @@ -@php use Illuminate\Support\Facades\Log; @endphp it('can create a record', function (): void { -$record = {{ $getResourceModel() }}::factory()->make(); + $record = {{ $getResourceModel() }}::factory()->make(); -livewire({{ $getPageClass('create') }}::class) - ->fillForm([ - @foreach($getResourceFormFields() as $key => $field) - '{{ $key }}' => $record->{{ $key }}, - @endforeach - ]) - ->call('create') - ->assertNotified(); + livewire({{ $getPageClass('create') }}::class) + ->fillForm([ + @foreach($getResourceFormFields() as $key => $field) + '{{ $key }}' => $record->{{ $key }}, + @endforeach + ]) + ->call('create') + ->assertNotified(); - $this->assertDatabaseHas({{ $getResourceModel() }}::class, [ - @foreach($getResourceFormFields() as $key => $field) - '{{ $key }}' => $record->{{ $key }}, - @endforeach - ]); + $this->assertDatabaseHas({{ $getResourceModel() }}::class, [ + @foreach($getResourceFormFields() as $key => $field) + '{{ $key }}' => $record->{{ $key }}, + @endforeach + ]); }); From b97c299b7c5557251e21c4cc1cbc9bcf40ad2265 Mon Sep 17 00:00:00 2001 From: CodeWithDennis Date: Wed, 10 Sep 2025 15:18:59 +0200 Subject: [PATCH 04/19] Add support for RichEditor in create record test --- .../pages/create/can-create-record.blade.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/resources/views/resources/pages/create/can-create-record.blade.php b/resources/views/resources/pages/create/can-create-record.blade.php index 164112ca..58104695 100644 --- a/resources/views/resources/pages/create/can-create-record.blade.php +++ b/resources/views/resources/pages/create/can-create-record.blade.php @@ -1,10 +1,16 @@ +@php use Filament\Forms\Components\RichEditor; @endphp it('can create a record', function (): void { $record = {{ $getResourceModel() }}::factory()->make(); livewire({{ $getPageClass('create') }}::class) ->fillForm([ @foreach($getResourceFormFields() as $key => $field) + @if($field instanceof RichEditor) + // TODO: RichEditor expects a very specific array structure for its data and Filament tests do not currently support this. + // '{{ $key }}' => $record->{{ $key }}, + @else '{{ $key }}' => $record->{{ $key }}, + @endif @endforeach ]) ->call('create') @@ -12,7 +18,12 @@ $this->assertDatabaseHas({{ $getResourceModel() }}::class, [ @foreach($getResourceFormFields() as $key => $field) + @if($field instanceof RichEditor) + // TODO: RichEditor expects a very specific array structure for its data and Filament tests do not currently support this. + // '{{ $key }}' => $record->{{ $key }}, + @else '{{ $key }}' => $record->{{ $key }}, + @endif @endforeach ]); }); From 586e6107f24d86533be8cacb791c77212f45669c Mon Sep 17 00:00:00 2001 From: CodeWithDennis Date: Wed, 10 Sep 2025 15:23:19 +0200 Subject: [PATCH 05/19] Refactor indentation for record creation method --- .../views/resources/pages/create/can-create-record.blade.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/views/resources/pages/create/can-create-record.blade.php b/resources/views/resources/pages/create/can-create-record.blade.php index 58104695..71b06b60 100644 --- a/resources/views/resources/pages/create/can-create-record.blade.php +++ b/resources/views/resources/pages/create/can-create-record.blade.php @@ -9,7 +9,7 @@ // TODO: RichEditor expects a very specific array structure for its data and Filament tests do not currently support this. // '{{ $key }}' => $record->{{ $key }}, @else - '{{ $key }}' => $record->{{ $key }}, + '{{ $key }}' => $record->{{ $key }}, @endif @endforeach ]) @@ -22,7 +22,7 @@ // TODO: RichEditor expects a very specific array structure for its data and Filament tests do not currently support this. // '{{ $key }}' => $record->{{ $key }}, @else - '{{ $key }}' => $record->{{ $key }}, + '{{ $key }}' => $record->{{ $key }}, @endif @endforeach ]); From f86a301ee2fab0a6e4abc5f27ff1ea1089e1836d Mon Sep 17 00:00:00 2001 From: CodeWithDennis Date: Wed, 10 Sep 2025 15:38:11 +0200 Subject: [PATCH 06/19] Add CanValidateFormData test renderer for validation --- resources/views/form-validation-rules.blade.php | 4 ++-- .../pages/create/can-validate-form-data.blade.php | 15 +++++++++++++++ src/Commands/FilamentTestsCommand.php | 2 ++ src/Concerns/Resources/InteractsWithSchemas.php | 7 +++++++ .../Pages/Create/CanValidateFormData.php | 15 +++++++++++++++ 5 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 resources/views/resources/pages/create/can-validate-form-data.blade.php create mode 100644 src/TestRenderers/Resources/Pages/Create/CanValidateFormData.php diff --git a/resources/views/form-validation-rules.blade.php b/resources/views/form-validation-rules.blade.php index 39cba1ac..c0a44bde 100644 --- a/resources/views/form-validation-rules.blade.php +++ b/resources/views/form-validation-rules.blade.php @@ -1,5 +1,5 @@ describe('validation', function (): void { - it('validates the form data', function (array $data, array $errors): void { + it('validates the form :dataset:', function (array $data, array $errors): void { $record = {{ $modelClass }}::factory()->create(); $newRecordData = {{ $modelClass }}::factory()->make(); @@ -16,4 +16,4 @@ '`name` is max 255 characters' => [['name' => Str::random(256)], ['name' => 'max']], '`description` is max 255 characters' => [['description' => Str::random(256)], ['description' => 'max']], ]); -}); \ No newline at end of file +}); diff --git a/resources/views/resources/pages/create/can-validate-form-data.blade.php b/resources/views/resources/pages/create/can-validate-form-data.blade.php new file mode 100644 index 00000000..67b79769 --- /dev/null +++ b/resources/views/resources/pages/create/can-validate-form-data.blade.php @@ -0,0 +1,15 @@ +it('validates form data field :dataset', function (array $data, array $errors): void { + $record = {{ $getResourceModel() }}::factory()->make(); + + livewire({{ $getPageClass('create') }}::class) + ->fillForm([ + ...$data + ]) + ->call('create') + ->assertHasFormErrors($errors) + ->assertNotified(); +})->with([ + @foreach($getResourceRequiredFormFields() as $key => $field) + '`{{ $key }}` is required' => [['{{ $key }}' => null], ['{{ $key }}' => 'required']], + @endforeach +]); diff --git a/src/Commands/FilamentTestsCommand.php b/src/Commands/FilamentTestsCommand.php index fd36f155..a60f84df 100644 --- a/src/Commands/FilamentTestsCommand.php +++ b/src/Commands/FilamentTestsCommand.php @@ -8,6 +8,7 @@ use CodeWithDennis\FilamentTests\TestRenderers\BeforeEach; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Create\CanCreateRecordTest; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Create\CanRenderCreatePageTest; +use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Create\CanValidateFormData; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Edit\CanDeleteRecordTest; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Edit\CanRenderEditPageTest; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Edit\HasHeaderActionTest; @@ -91,6 +92,7 @@ protected function getRenderers(): array HidesHeaderActionTest::class, HasFilterTest::class, CanCreateRecordTest::class, + CanValidateFormData::class, ]; } } diff --git a/src/Concerns/Resources/InteractsWithSchemas.php b/src/Concerns/Resources/InteractsWithSchemas.php index 52c0428c..b53bed8d 100644 --- a/src/Concerns/Resources/InteractsWithSchemas.php +++ b/src/Concerns/Resources/InteractsWithSchemas.php @@ -22,6 +22,13 @@ public function getResourceFormFields(): array return $this->getResourceForm()->getFlatFields(true); } + public function getResourceRequiredFormFields(): array + { + return collect($this->getResourceFormFields()) + ->filter(fn (Field $field): bool => $field->isRequired()) + ->all(); + } + public function getResourceFormFieldKeys(): array { return collect($this->getResourceFormFields()) diff --git a/src/TestRenderers/Resources/Pages/Create/CanValidateFormData.php b/src/TestRenderers/Resources/Pages/Create/CanValidateFormData.php new file mode 100644 index 00000000..1ff75689 --- /dev/null +++ b/src/TestRenderers/Resources/Pages/Create/CanValidateFormData.php @@ -0,0 +1,15 @@ +hasPage('create'); + } +} From bb896876f385def4734ce4cfabd14141c0296eec Mon Sep 17 00:00:00 2001 From: CodeWithDennis Date: Wed, 10 Sep 2025 15:42:31 +0200 Subject: [PATCH 07/19] Delete form validation rules test file --- .../views/form-validation-rules.blade.php | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 resources/views/form-validation-rules.blade.php diff --git a/resources/views/form-validation-rules.blade.php b/resources/views/form-validation-rules.blade.php deleted file mode 100644 index c0a44bde..00000000 --- a/resources/views/form-validation-rules.blade.php +++ /dev/null @@ -1,19 +0,0 @@ -describe('validation', function (): void { - it('validates the form :dataset:', function (array $data, array $errors): void { - $record = {{ $modelClass }}::factory()->create(); - $newRecordData = {{ $modelClass }}::factory()->make(); - - livewire({{ $editPageClass }}::class, ['record' => $record->id]) - ->fillForm([ - 'name' => $newRecordData->name, - ...$data, - ]) - ->call('save') - ->assertHasFormErrors($errors) - ->assertNotNotified(); - })->with([ - '`name` is required' => [['name' => null], ['name' => 'required']], - '`name` is max 255 characters' => [['name' => Str::random(256)], ['name' => 'max']], - '`description` is max 255 characters' => [['description' => Str::random(256)], ['description' => 'max']], - ]); -}); From 90b654d4bc4d6ba4feac5f96d61600cf38ece910 Mon Sep 17 00:00:00 2001 From: CodeWithDennis Date: Wed, 10 Sep 2025 15:42:58 +0200 Subject: [PATCH 08/19] Rename CanValidateFormData to CanValidateFormDataTest --- src/Commands/FilamentTestsCommand.php | 4 ++-- .../{CanValidateFormData.php => CanValidateFormDataTest.php} | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/TestRenderers/Resources/Pages/Create/{CanValidateFormData.php => CanValidateFormDataTest.php} (87%) diff --git a/src/Commands/FilamentTestsCommand.php b/src/Commands/FilamentTestsCommand.php index a60f84df..ae1de1e0 100644 --- a/src/Commands/FilamentTestsCommand.php +++ b/src/Commands/FilamentTestsCommand.php @@ -8,7 +8,7 @@ use CodeWithDennis\FilamentTests\TestRenderers\BeforeEach; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Create\CanCreateRecordTest; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Create\CanRenderCreatePageTest; -use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Create\CanValidateFormData; +use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Create\CanValidateFormDataTest; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Edit\CanDeleteRecordTest; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Edit\CanRenderEditPageTest; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Edit\HasHeaderActionTest; @@ -92,7 +92,7 @@ protected function getRenderers(): array HidesHeaderActionTest::class, HasFilterTest::class, CanCreateRecordTest::class, - CanValidateFormData::class, + CanValidateFormDataTest::class, ]; } } diff --git a/src/TestRenderers/Resources/Pages/Create/CanValidateFormData.php b/src/TestRenderers/Resources/Pages/Create/CanValidateFormDataTest.php similarity index 87% rename from src/TestRenderers/Resources/Pages/Create/CanValidateFormData.php rename to src/TestRenderers/Resources/Pages/Create/CanValidateFormDataTest.php index 1ff75689..c45f04d3 100644 --- a/src/TestRenderers/Resources/Pages/Create/CanValidateFormData.php +++ b/src/TestRenderers/Resources/Pages/Create/CanValidateFormDataTest.php @@ -4,7 +4,7 @@ use CodeWithDennis\FilamentTests\TestRenderers\BaseTest; -class CanValidateFormData extends BaseTest +class CanValidateFormDataTest extends BaseTest { public ?string $view = 'filament-tests::resources.pages.create.can-validate-form-data'; From 3bdfdfa3cb44b2034c11ea82c028894e4b546bfc Mon Sep 17 00:00:00 2001 From: CodeWithDennis Date: Wed, 10 Sep 2025 15:43:49 +0200 Subject: [PATCH 09/19] Rename form validation tests to match new naming convention --- ...data.blade.php => can-validate-create-form-data.blade.php} | 0 src/Commands/FilamentTestsCommand.php | 4 ++-- ...ValidateFormDataTest.php => CanValidateCreateFormData.php} | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename resources/views/resources/pages/create/{can-validate-form-data.blade.php => can-validate-create-form-data.blade.php} (100%) rename src/TestRenderers/Resources/Pages/Create/{CanValidateFormDataTest.php => CanValidateCreateFormData.php} (78%) diff --git a/resources/views/resources/pages/create/can-validate-form-data.blade.php b/resources/views/resources/pages/create/can-validate-create-form-data.blade.php similarity index 100% rename from resources/views/resources/pages/create/can-validate-form-data.blade.php rename to resources/views/resources/pages/create/can-validate-create-form-data.blade.php diff --git a/src/Commands/FilamentTestsCommand.php b/src/Commands/FilamentTestsCommand.php index ae1de1e0..b8d3ce6e 100644 --- a/src/Commands/FilamentTestsCommand.php +++ b/src/Commands/FilamentTestsCommand.php @@ -8,7 +8,7 @@ use CodeWithDennis\FilamentTests\TestRenderers\BeforeEach; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Create\CanCreateRecordTest; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Create\CanRenderCreatePageTest; -use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Create\CanValidateFormDataTest; +use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Create\CanValidateCreateFormData; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Edit\CanDeleteRecordTest; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Edit\CanRenderEditPageTest; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Edit\HasHeaderActionTest; @@ -92,7 +92,7 @@ protected function getRenderers(): array HidesHeaderActionTest::class, HasFilterTest::class, CanCreateRecordTest::class, - CanValidateFormDataTest::class, + CanValidateCreateFormData::class, ]; } } diff --git a/src/TestRenderers/Resources/Pages/Create/CanValidateFormDataTest.php b/src/TestRenderers/Resources/Pages/Create/CanValidateCreateFormData.php similarity index 78% rename from src/TestRenderers/Resources/Pages/Create/CanValidateFormDataTest.php rename to src/TestRenderers/Resources/Pages/Create/CanValidateCreateFormData.php index c45f04d3..379e56a6 100644 --- a/src/TestRenderers/Resources/Pages/Create/CanValidateFormDataTest.php +++ b/src/TestRenderers/Resources/Pages/Create/CanValidateCreateFormData.php @@ -4,9 +4,9 @@ use CodeWithDennis\FilamentTests\TestRenderers\BaseTest; -class CanValidateFormDataTest extends BaseTest +class CanValidateCreateFormData extends BaseTest { - public ?string $view = 'filament-tests::resources.pages.create.can-validate-form-data'; + public ?string $view = 'filament-tests::resources.pages.create.can-validate-create-form-data'; public function getShouldRender(): bool { From f1fb07f9bb064ffd24364198812c87f4c7778e71 Mon Sep 17 00:00:00 2001 From: CodeWithDennis Date: Thu, 18 Sep 2025 13:39:20 +0200 Subject: [PATCH 10/19] Remove example file --- resources/views/can-create-record.blade.php | 19 ------------------- 1 file changed, 19 deletions(-) delete mode 100644 resources/views/can-create-record.blade.php diff --git a/resources/views/can-create-record.blade.php b/resources/views/can-create-record.blade.php deleted file mode 100644 index ff48f6d1..00000000 --- a/resources/views/can-create-record.blade.php +++ /dev/null @@ -1,19 +0,0 @@ -it('can create a record', function (): void { -$record = {{ $modelClass }}::factory()->make(); -$image = UploadedFile::fake()->image('gold.jpg'); - -livewire({{ $createPageClass }}::class) -->fillForm([ -'name' => $record->name, -'description' => $record->description, -'image' => $image, -]) -->call('create') -->assertNotified(); - -assertDatabaseHas({{ $modelClass }}, [ -'name' => $record->name, -'description' => $record->description, -'image' => 'images/badges/'.str($record->name)->slug().'-badge-gold.jpg', -]); -}); \ No newline at end of file From 293bff7280fb2bd85013a84698ad288abfbccb64 Mon Sep 17 00:00:00 2001 From: CodeWithDennis Date: Thu, 18 Sep 2025 14:00:45 +0200 Subject: [PATCH 11/19] Add Form Record Tests description to README.md --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 0fa89c3f..6982fc3c 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,10 @@ The `make:filament-test` command supports the following options: This package generates comprehensive PEST tests for your Filament resources. Here's a complete list of currently working tests: +### Form Record Tests +- **CanCreateRecordTest** - Tests that a record can be created +- **CanValidateCreateFormTest** - Tests that the create form validates input correctly + ### Page Rendering Tests - **CanRenderCreatePageTest** - Tests that the create page renders correctly - **CanRenderEditPageTest** - Tests that the edit page renders correctly @@ -73,6 +77,9 @@ This package generates comprehensive PEST tests for your Filament resources. Her All tests are automatically generated based on your Filament resource configuration and will only run when the relevant features are present in your resource (e.g., search tests only run if you have searchable columns). +## Known Issues +- Creating or validation RichEditor fields is not supported, this is due to the complexity of handling rich text content in tests. +- ## Credits - [CodeWithDennis](https://github.com/CodeWithDennis) From f68602bb8a91eafd9122363f3207041e5b75ceb3 Mon Sep 17 00:00:00 2001 From: CodeWithDennis Date: Thu, 18 Sep 2025 14:00:54 +0200 Subject: [PATCH 12/19] Add method to get form fields with max length filter --- src/Concerns/Resources/InteractsWithSchemas.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Concerns/Resources/InteractsWithSchemas.php b/src/Concerns/Resources/InteractsWithSchemas.php index b53bed8d..2a92cbcc 100644 --- a/src/Concerns/Resources/InteractsWithSchemas.php +++ b/src/Concerns/Resources/InteractsWithSchemas.php @@ -29,6 +29,13 @@ public function getResourceRequiredFormFields(): array ->all(); } + public function getResourceMaxLengthFormFields(): array + { + return collect($this->getResourceFormFields()) + ->filter(fn (Field $field): bool => method_exists($field, 'getMaxLength') && $field->getMaxLength() !== null) + ->all(); + } + public function getResourceFormFieldKeys(): array { return collect($this->getResourceFormFields()) From ad4a0a41d970e48c44d1e8940fb5376a3c0f5902 Mon Sep 17 00:00:00 2001 From: CodeWithDennis Date: Thu, 18 Sep 2025 14:01:01 +0200 Subject: [PATCH 13/19] Add form data max length validation test case --- .../pages/create/can-create-record.blade.php | 15 +++------------ .../can-validate-create-form-data.blade.php | 3 +++ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/resources/views/resources/pages/create/can-create-record.blade.php b/resources/views/resources/pages/create/can-create-record.blade.php index 71b06b60..2b8801d6 100644 --- a/resources/views/resources/pages/create/can-create-record.blade.php +++ b/resources/views/resources/pages/create/can-create-record.blade.php @@ -5,25 +5,16 @@ livewire({{ $getPageClass('create') }}::class) ->fillForm([ @foreach($getResourceFormFields() as $key => $field) - @if($field instanceof RichEditor) - // TODO: RichEditor expects a very specific array structure for its data and Filament tests do not currently support this. - // '{{ $key }}' => $record->{{ $key }}, - @else - '{{ $key }}' => $record->{{ $key }}, - @endif + '{{ $key }}' => $record->{{ $key }}, @endforeach ]) ->call('create') + ->assertHasNoFormErrors() ->assertNotified(); $this->assertDatabaseHas({{ $getResourceModel() }}::class, [ @foreach($getResourceFormFields() as $key => $field) - @if($field instanceof RichEditor) - // TODO: RichEditor expects a very specific array structure for its data and Filament tests do not currently support this. - // '{{ $key }}' => $record->{{ $key }}, - @else - '{{ $key }}' => $record->{{ $key }}, - @endif + '{{ $key }}' => $record->{{ $key }}, @endforeach ]); }); diff --git a/resources/views/resources/pages/create/can-validate-create-form-data.blade.php b/resources/views/resources/pages/create/can-validate-create-form-data.blade.php index 67b79769..47cbf645 100644 --- a/resources/views/resources/pages/create/can-validate-create-form-data.blade.php +++ b/resources/views/resources/pages/create/can-validate-create-form-data.blade.php @@ -12,4 +12,7 @@ @foreach($getResourceRequiredFormFields() as $key => $field) '`{{ $key }}` is required' => [['{{ $key }}' => null], ['{{ $key }}' => 'required']], @endforeach + @foreach($getResourceMaxLengthFormFields() as $key => $field) + '`{{ $key }}` is max {{ $field->getMaxLength() }} characters' => [['{{ $key }}' => Illuminate\Support\Str::random({{ $field->getMaxLength() + 1 }})], ['{{ $key }}' => 'max']], + @endforeach ]); From b2d3e10432d89d9fc66eda87ccc681ecd5aaf322 Mon Sep 17 00:00:00 2001 From: CodeWithDennis Date: Thu, 18 Sep 2025 14:16:54 +0200 Subject: [PATCH 14/19] Refactor form field rule prefix retrieval method --- .../can-validate-create-form-data.blade.php | 6 ++--- .../Resources/InteractsWithSchemas.php | 24 ++++++++++++++----- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/resources/views/resources/pages/create/can-validate-create-form-data.blade.php b/resources/views/resources/pages/create/can-validate-create-form-data.blade.php index 47cbf645..796c144f 100644 --- a/resources/views/resources/pages/create/can-validate-create-form-data.blade.php +++ b/resources/views/resources/pages/create/can-validate-create-form-data.blade.php @@ -9,10 +9,10 @@ ->assertHasFormErrors($errors) ->assertNotified(); })->with([ - @foreach($getResourceRequiredFormFields() as $key => $field) + @foreach($getResourceFormFieldsByRulePrefix('required') as $key => $field) '`{{ $key }}` is required' => [['{{ $key }}' => null], ['{{ $key }}' => 'required']], @endforeach - @foreach($getResourceMaxLengthFormFields() as $key => $field) - '`{{ $key }}` is max {{ $field->getMaxLength() }} characters' => [['{{ $key }}' => Illuminate\Support\Str::random({{ $field->getMaxLength() + 1 }})], ['{{ $key }}' => 'max']], + @foreach($getResourceFormFieldsByRulePrefix('max') as $key => $field) + '`{{ $key }}` is max {{ $getRuleValue($field, 'max') }} characters' => [['{{ $key }}' => Illuminate\Support\Str::random({{ $getRuleValue($field, 'max') + 1 }})], ['{{ $key }}' => 'max']], @endforeach ]); diff --git a/src/Concerns/Resources/InteractsWithSchemas.php b/src/Concerns/Resources/InteractsWithSchemas.php index 2a92cbcc..805bd25d 100644 --- a/src/Concerns/Resources/InteractsWithSchemas.php +++ b/src/Concerns/Resources/InteractsWithSchemas.php @@ -2,6 +2,7 @@ namespace CodeWithDennis\FilamentTests\Concerns\Resources; +use Closure; use Filament\Forms\Components\Field; use Filament\Infolists\Components\Entry; use Filament\Resources\Pages\EditRecord; @@ -22,18 +23,29 @@ public function getResourceFormFields(): array return $this->getResourceForm()->getFlatFields(true); } - public function getResourceRequiredFormFields(): array + public function getResourceFormFieldsByRulePrefix(string $prefix): array { return collect($this->getResourceFormFields()) - ->filter(fn (Field $field): bool => $field->isRequired()) + ->filter( + fn (Field $field): bool => array_any( + $field->getValidationRules(), + fn (Closure|string $rule): bool => is_string($rule) && str_starts_with($rule, $prefix) + ) + ) ->all(); } - public function getResourceMaxLengthFormFields(): array + public function getRuleValue(Field $field, string $ruleName): ?string { - return collect($this->getResourceFormFields()) - ->filter(fn (Field $field): bool => method_exists($field, 'getMaxLength') && $field->getMaxLength() !== null) - ->all(); + foreach ($field->getValidationRules() as $rule) { + if (is_string($rule) && str_starts_with($rule, $ruleName.':')) { + [, $value] = explode(':', $rule, 2); + + return $value; + } + } + + return null; } public function getResourceFormFieldKeys(): array From 875376b4c69bb2d66026d0ed8917ec1f2bec6d6b Mon Sep 17 00:00:00 2001 From: CodeWithDennis Date: Thu, 18 Sep 2025 14:18:18 +0200 Subject: [PATCH 15/19] Add validation for form data minimum character length --- .../pages/create/can-validate-create-form-data.blade.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/resources/views/resources/pages/create/can-validate-create-form-data.blade.php b/resources/views/resources/pages/create/can-validate-create-form-data.blade.php index 796c144f..5dcf24d9 100644 --- a/resources/views/resources/pages/create/can-validate-create-form-data.blade.php +++ b/resources/views/resources/pages/create/can-validate-create-form-data.blade.php @@ -15,4 +15,7 @@ @foreach($getResourceFormFieldsByRulePrefix('max') as $key => $field) '`{{ $key }}` is max {{ $getRuleValue($field, 'max') }} characters' => [['{{ $key }}' => Illuminate\Support\Str::random({{ $getRuleValue($field, 'max') + 1 }})], ['{{ $key }}' => 'max']], @endforeach + @foreach($getResourceFormFieldsByRulePrefix('min') as $key => $field) + '`{{ $key }}` is min {{ $getRuleValue($field, 'min') }} characters' => [['{{ $key }}' => Illuminate\Support\Str::random({{ $getRuleValue($field, 'min') - 1 }})], ['{{ $key }}' => 'min']], + @endforeach ]); From 24144dfc8856d95f1d2deb5cbf98da9d6ecd05a7 Mon Sep 17 00:00:00 2001 From: CodeWithDennis Date: Thu, 18 Sep 2025 14:37:39 +0200 Subject: [PATCH 16/19] Update README to clarify RichEditor field validation --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6982fc3c..4e71024d 100644 --- a/README.md +++ b/README.md @@ -78,7 +78,7 @@ This package generates comprehensive PEST tests for your Filament resources. Her All tests are automatically generated based on your Filament resource configuration and will only run when the relevant features are present in your resource (e.g., search tests only run if you have searchable columns). ## Known Issues -- Creating or validation RichEditor fields is not supported, this is due to the complexity of handling rich text content in tests. +- Validation of RichEditor fields is not supported, this is due to the complexity of handling rich text content in tests. - ## Credits From e5161783e3d54ec1cedbce3076e79d8ab455c0c9 Mon Sep 17 00:00:00 2001 From: CodeWithDennis Date: Thu, 18 Sep 2025 14:38:55 +0200 Subject: [PATCH 17/19] Add validation notes for RichEditor fields in test suite --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 4e71024d..dd5f64b0 100644 --- a/README.md +++ b/README.md @@ -36,6 +36,10 @@ This package generates comprehensive PEST tests for your Filament resources. Her ### Form Record Tests - **CanCreateRecordTest** - Tests that a record can be created - **CanValidateCreateFormTest** - Tests that the create form validates input correctly + - [x] Max + - [x] Min + - [x] Required + - Note: RichEditor fields are not validated due to complexity ### Page Rendering Tests - **CanRenderCreatePageTest** - Tests that the create page renders correctly From 79bf7816c52ee5fc9dcd1848ae612f76f8e84e65 Mon Sep 17 00:00:00 2001 From: CodeWithDennis Date: Thu, 18 Sep 2025 14:39:38 +0200 Subject: [PATCH 18/19] Remove unnecessary note about RichEditor field validation --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index dd5f64b0..fb1c4adc 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,6 @@ This package generates comprehensive PEST tests for your Filament resources. Her - [x] Max - [x] Min - [x] Required - - Note: RichEditor fields are not validated due to complexity ### Page Rendering Tests - **CanRenderCreatePageTest** - Tests that the create page renders correctly From eaeba4d97a5ba8076377600af418fd19d7103246 Mon Sep 17 00:00:00 2001 From: CodeWithDennis Date: Thu, 18 Sep 2025 14:43:04 +0200 Subject: [PATCH 19/19] Update README file with Credits section --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fb1c4adc..7b05abae 100644 --- a/README.md +++ b/README.md @@ -82,7 +82,7 @@ All tests are automatically generated based on your Filament resource configurat ## Known Issues - Validation of RichEditor fields is not supported, this is due to the complexity of handling rich text content in tests. -- + ## Credits - [CodeWithDennis](https://github.com/CodeWithDennis)