From e03e6b19a622646536dc938471abd50413b2cb7b Mon Sep 17 00:00:00 2001 From: Dan Harrin Date: Tue, 9 Jul 2024 21:16:01 +0100 Subject: [PATCH] fix: Testing grouped action visibility with grouped authorization --- .../actions/src/Concerns/BelongsToGroup.php | 17 +++++++++++++++++ .../tables/src/Table/Concerns/HasActions.php | 2 +- packages/tables/src/Testing/TestsActions.php | 17 +++++++++++++++++ tests/src/Tables/Actions/ActionTest.php | 6 +++++- tests/src/Tables/Fixtures/PostsTable.php | 7 +++++++ 5 files changed, 47 insertions(+), 2 deletions(-) diff --git a/packages/actions/src/Concerns/BelongsToGroup.php b/packages/actions/src/Concerns/BelongsToGroup.php index 55ad0c033c..3129394b5c 100644 --- a/packages/actions/src/Concerns/BelongsToGroup.php +++ b/packages/actions/src/Concerns/BelongsToGroup.php @@ -19,4 +19,21 @@ trait BelongsToGroup { return $this->group; } + + public function getRootGroup(): ?ActionGroup + { + $group = $this->getGroup(); + + while ($group) { + $parentGroup = $group->getGroup(); + + if (! $parentGroup) { + break; + } + + $group = $parentGroup; + } + + return $group; + } } diff --git a/packages/tables/src/Table/Concerns/HasActions.php b/packages/tables/src/Table/Concerns/HasActions.php index 300124da51..6170d326b8 100644 --- a/packages/tables/src/Table/Concerns/HasActions.php +++ b/packages/tables/src/Table/Concerns/HasActions.php @@ -131,7 +131,7 @@ trait HasActions return null; } - if (($actionGroup = $action->getGroup()) instanceof HasRecord) { + if (($actionGroup = $action->getRootGroup()) instanceof HasRecord) { $actionGroup->record($mountedRecord); } diff --git a/packages/tables/src/Testing/TestsActions.php b/packages/tables/src/Testing/TestsActions.php index 9822b6436c..038669c6e8 100644 --- a/packages/tables/src/Testing/TestsActions.php +++ b/packages/tables/src/Testing/TestsActions.php @@ -3,6 +3,7 @@ namespace Filament\Tables\Testing; use Closure; +use Filament\Actions\Contracts\HasRecord; use Filament\Actions\Testing\TestsActions as BaseTestsActions; use Filament\Tables\Actions\Action; use Filament\Tables\Contracts\HasTable; @@ -277,6 +278,10 @@ class TestsActions $action = $this->instance()->getTable()->getAction($name); $action->record($record); + if (($actionGroup = $action->getRootGroup()) instanceof HasRecord) { + $actionGroup->record($record); + } + Assert::assertFalse( $action->isHidden(), message: filled($record) ? @@ -309,6 +314,10 @@ class TestsActions $action = $this->instance()->getTable()->getAction($name); $action->record($record); + if (($actionGroup = $action->getRootGroup()) instanceof HasRecord) { + $actionGroup->record($record); + } + $livewireClass = $this->instance()::class; $prettyName = implode(' > ', $name); @@ -348,6 +357,10 @@ class TestsActions $action = $this->instance()->getTable()->getAction($name); $action->record($record); + if (($actionGroup = $action->getRootGroup()) instanceof HasRecord) { + $actionGroup->record($record); + } + Assert::assertFalse( $action->isDisabled(), message: filled($record) ? @@ -380,6 +393,10 @@ class TestsActions $action = $this->instance()->getTable()->getAction($name); $action->record($record); + if (($actionGroup = $action->getRootGroup()) instanceof HasRecord) { + $actionGroup->record($record); + } + $livewireClass = $this->instance()::class; $prettyName = implode(' > ', $name); diff --git a/tests/src/Tables/Actions/ActionTest.php b/tests/src/Tables/Actions/ActionTest.php index f4e816cf44..9ca0da4b98 100644 --- a/tests/src/Tables/Actions/ActionTest.php +++ b/tests/src/Tables/Actions/ActionTest.php @@ -76,9 +76,13 @@ it('can call an action and halt', function () { }); it('can hide an action', function () { + $post = Post::factory()->create(); + livewire(PostsTable::class) ->assertTableActionVisible('visible') - ->assertTableActionHidden('hidden'); + ->assertTableActionHidden('hidden') + ->assertTableActionVisible('groupedWithVisibleGroupCondition', $post) + ->assertTableActionHidden('groupedWithHiddenGroupCondition', $post); }); it('can disable an action', function () { diff --git a/tests/src/Tables/Fixtures/PostsTable.php b/tests/src/Tables/Fixtures/PostsTable.php index 1b46d3533f..e14ded3202 100644 --- a/tests/src/Tables/Fixtures/PostsTable.php +++ b/tests/src/Tables/Fixtures/PostsTable.php @@ -11,6 +11,7 @@ use Filament\Tables\Table; use Filament\Tests\Models\Post; use Illuminate\Contracts\View\View; use Illuminate\Database\Eloquent\Builder as EloquentBuilder; +use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Query\Builder; use Livewire\Component; @@ -129,6 +130,12 @@ class PostsTable extends Component implements HasForms, Tables\Contracts\HasTabl Tables\Actions\Action::make('enabled'), Tables\Actions\Action::make('disabled') ->disabled(), + Tables\Actions\ActionGroup::make([ + Tables\Actions\Action::make('groupedWithVisibleGroupCondition'), + ])->visible(fn (?Model $record): bool => $record !== null), + Tables\Actions\ActionGroup::make([ + Tables\Actions\Action::make('groupedWithHiddenGroupCondition'), + ])->hidden(fn (?Model $record): bool => $record !== null), Tables\Actions\Action::make('hasIcon') ->icon('heroicon-m-pencil-square'), Tables\Actions\Action::make('hasLabel')