From b479c0377b56ddf9a3ad1ea9553f6a31289154cc Mon Sep 17 00:00:00 2001 From: dissto <11778632+dissto@users.noreply.github.com> Date: Sun, 7 Sep 2025 18:27:41 +0200 Subject: [PATCH] Add tests for column state and formatted state validation --- README.md | 2 ++ ...lumn-has-correct-formatted-state.blade.php | 20 +++++++++++++++++++ .../index/column-has-correct-state.blade.php | 19 ++++++++++++++++++ src/Commands/FilamentTestsCommand.php | 4 ++++ .../Resources/InteractsWithTables.php | 11 ++++++++++ .../ColumnHasCorrectFormattedStateTest.php | 16 +++++++++++++++ .../Pages/Index/ColumnHasCorrectStateTest.php | 16 +++++++++++++++ 7 files changed, 88 insertions(+) create mode 100644 resources/views/resources/pages/index/column-has-correct-formatted-state.blade.php create mode 100644 resources/views/resources/pages/index/column-has-correct-state.blade.php create mode 100644 src/TestRenderers/Resources/Pages/Index/ColumnHasCorrectFormattedStateTest.php create mode 100644 src/TestRenderers/Resources/Pages/Index/ColumnHasCorrectStateTest.php diff --git a/README.md b/README.md index c218731e..dae1fe21 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,8 @@ This package generates comprehensive PEST tests for your Filament resources. Her - **ShowsColumnTest** - Tests that explicitly visible columns are shown - **HidesColumnTest** - Tests that explicitly hidden columns are hidden - **CanNotDisplayTrashedRecordsByDefault** - Tests that trashed records are not displayed by default if soft deletes are enabled +- **ColumnHasCorrectStateTest** - Tests that columns has the correct state +- **ColumnHasCorrectFormattedStateTest** - Tests that columns has the correct formatted state (additional user input required) ### Table Functionality Tests - **CanSearchColumnTest** - Tests that searchable columns work correctly diff --git a/resources/views/resources/pages/index/column-has-correct-formatted-state.blade.php b/resources/views/resources/pages/index/column-has-correct-formatted-state.blade.php new file mode 100644 index 00000000..34793800 --- /dev/null +++ b/resources/views/resources/pages/index/column-has-correct-formatted-state.blade.php @@ -0,0 +1,20 @@ +it('`:dataset` column has the correct formatted state', function (string $column): void { + $records = {{ $getResourceModel() }}::factory(3)->create(); + + $record = $records->first(); + + $value = data_get($record, $column); + +// if ($value instanceof Carbon\Carbon || $value instanceof Carbon\CarbonImmutable ) { +// $value = $value->format('Y-m-d H:i:s'); +// } + + livewire({{ $getPageClass('index') }}::class) + ->assertTableColumnFormattedStateSet($column, $value, record: $record) + ->assertTableColumnFormattedStateNotSet($column, 'non-existent-value', record: $record); +{{-- TODO: support all column types --}} +})->with([@foreach ($getResourceTableTextColumnKeys() as $column)'{{ $column }}',@endforeach]) +@if(count($diff = array_diff($getResourceTableVisibleColumnKeys(), $getResourceTableTextColumnKeys())) > 0) + ->todo('The following columns were skipped during generation as their state could not be determined automatically: {{ implode(", ", $diff) }}') +@endif + ->skip('This test requires additional attention because the formatted state is likely to differ from the raw state.'); diff --git a/resources/views/resources/pages/index/column-has-correct-state.blade.php b/resources/views/resources/pages/index/column-has-correct-state.blade.php new file mode 100644 index 00000000..34b0c23d --- /dev/null +++ b/resources/views/resources/pages/index/column-has-correct-state.blade.php @@ -0,0 +1,19 @@ +it('`:dataset` column has the correct state', function (string $column): void { + $records = {{ $getResourceModel() }}::factory(3)->create(); + + $record = $records->first(); + + $value = data_get($record, $column); + + if ($value instanceof Carbon\Carbon || $value instanceof Carbon\CarbonImmutable ) { + $value = $value->toDateTimeString(); + } + + livewire({{ $getPageClass('index') }}::class) + ->assertTableColumnStateSet($column, $value, record: $record) + ->assertTableColumnStateNotSet($column, 'non-existent-value', record: $record); +})@if(count($diff = array_diff($getResourceTableVisibleColumnKeys(), $getResourceTableTextColumnKeys())) > 0) + ->todo('The following columns were skipped during generation as their state could not be determined automatically: {{ implode(", ", $diff) }}') +@endif +{{-- TODO: support all column types --}} +->with([@foreach ($getResourceTableTextColumnKeys() as $column)'{{ $column }}',@endforeach]); diff --git a/src/Commands/FilamentTestsCommand.php b/src/Commands/FilamentTestsCommand.php index b47e023e..0b0c911d 100644 --- a/src/Commands/FilamentTestsCommand.php +++ b/src/Commands/FilamentTestsCommand.php @@ -15,6 +15,8 @@ use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Index\CanRenderIndexPageTest; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Index\CanSearchColumnTest; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Index\CanSortColumnTest; +use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Index\ColumnHasCorrectFormattedStateTest; +use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Index\ColumnHasCorrectStateTest; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Index\HasColumnTest; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Index\HidesColumnTest; use CodeWithDennis\FilamentTests\TestRenderers\Resources\Pages\Index\ShowsColumnTest; @@ -70,6 +72,8 @@ protected function getRenderers(): array CanSearchColumnTest::class, CanDeleteRecordTest::class, CanNotDisplayTrashedRecordsByDefault::class, + ColumnHasCorrectStateTest::class, + ColumnHasCorrectFormattedStateTest::class, ]; } } diff --git a/src/Concerns/Resources/InteractsWithTables.php b/src/Concerns/Resources/InteractsWithTables.php index d7b2a318..7d46b9c3 100644 --- a/src/Concerns/Resources/InteractsWithTables.php +++ b/src/Concerns/Resources/InteractsWithTables.php @@ -64,6 +64,17 @@ public function getResourceTableVisibleColumns(): Collection ->filter(fn (Column $column): bool => $column->isVisible()); } + public function getResourceTableTextColumns(): Collection + { + return $this->getResourceTableColumns() + ->filter(fn (Column $column): bool => $column instanceof \Filament\Tables\Columns\TextColumn); + } + + public function getResourceTableTextColumnKeys(): array + { + return $this->getResourceTableColumnKeysFrom($this->getResourceTableTextColumns()); + } + public function getResourceTableVisibleColumnKeys(): array { return $this->getResourceTableColumnKeysFrom($this->getResourceTableVisibleColumns()); diff --git a/src/TestRenderers/Resources/Pages/Index/ColumnHasCorrectFormattedStateTest.php b/src/TestRenderers/Resources/Pages/Index/ColumnHasCorrectFormattedStateTest.php new file mode 100644 index 00000000..d6eb1481 --- /dev/null +++ b/src/TestRenderers/Resources/Pages/Index/ColumnHasCorrectFormattedStateTest.php @@ -0,0 +1,16 @@ +hasPage('index') + && $this->getResourceTableVisibleColumns()->isNotEmpty(); + } +} diff --git a/src/TestRenderers/Resources/Pages/Index/ColumnHasCorrectStateTest.php b/src/TestRenderers/Resources/Pages/Index/ColumnHasCorrectStateTest.php new file mode 100644 index 00000000..71eed9f1 --- /dev/null +++ b/src/TestRenderers/Resources/Pages/Index/ColumnHasCorrectStateTest.php @@ -0,0 +1,16 @@ +hasPage('index') + && $this->getResourceTableVisibleColumns()->isNotEmpty(); + } +}