diff --git a/README.md b/README.md index 2bb324b8..e0a160d3 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 e5639e2b..ec424f67 100644 --- a/src/Commands/FilamentTestsCommand.php +++ b/src/Commands/FilamentTestsCommand.php @@ -16,6 +16,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; @@ -71,6 +73,8 @@ protected function getRenderers(): array CanSearchColumnTest::class, CanDeleteRecordTest::class, CanNotDisplayTrashedRecordsByDefault::class, + ColumnHasCorrectStateTest::class, + ColumnHasCorrectFormattedStateTest::class, CanPaginateRecordsTest::class, ]; } diff --git a/src/Concerns/Resources/InteractsWithTables.php b/src/Concerns/Resources/InteractsWithTables.php index feff0e5b..4d860da3 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(); + } +}