feature: page action testing helpers

This commit is contained in:
Ryan Chandler
2022-04-22 15:40:14 +01:00
parent 757ecad965
commit 97ed9f87dc
7 changed files with 96 additions and 0 deletions
+7
View File
@@ -0,0 +1,7 @@
<?php
namespace Livewire\Testing {
class TestableLivewire {
public function callPageAction(string $name, array $formData = []): static {}
}
}
@@ -14,6 +14,7 @@ use Filament\Http\Responses\Auth\LogoutResponse;
use Filament\Pages\Dashboard;
use Filament\Pages\Page;
use Filament\Resources\Resource;
use Filament\Testing\TestsPages;
use Filament\Widgets\AccountWidget;
use Filament\Widgets\FilamentInfoWidget;
use Filament\Widgets\Widget;
@@ -22,6 +23,7 @@ use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use Livewire\Component;
use Livewire\Livewire;
use Livewire\Testing\TestableLivewire;
use ReflectionClass;
use Spatie\LaravelPackageTools\Package;
use Spatie\LaravelPackageTools\PackageServiceProvider;
@@ -90,6 +92,8 @@ class FilamentServiceProvider extends PackageServiceProvider
public function packageBooted(): void
{
TestableLivewire::mixin(new TestsPages);
$this->bootLivewireComponents();
}
+31
View File
@@ -0,0 +1,31 @@
<?php
namespace Filament\Testing;
/**
* @mixin \Livewire\Testing\TestableLivewire
*/
class TestsPages
{
public function callPageAction()
{
return function (string $name, array $formData = []) {
$this
->call('mountAction', $name)
->assertSet('mountedAction', $name)
->set('mountedActionData', $formData);
$action = $this->instance()->getMountedAction();
if ($action->shouldOpenModal()) {
$this
->assertDispatchedBrowserEvent('open-modal', [
'id' => 'page-action'
])
->call('callMountedAction');
}
return $this->call('callMountedAction');
};
}
}
@@ -0,0 +1,27 @@
<?php
namespace Filament\Tests\Admin\Fixtures\Pages;
use Filament\Forms\Components\TextInput;
use Filament\Pages\Actions\ButtonAction;
use Filament\Pages\Page;
use Illuminate\Contracts\View\View;
class Actions extends Page
{
protected static string $view = 'fixtures.pages.actions';
protected function getActions(): array|View|null
{
return [
ButtonAction::make('foo')
->action(fn () => $this->dispatchBrowserEvent('foo-called')),
ButtonAction::make('foo-form')
->form([
TextInput::make('name')
->required()
])
->action(fn (array $data) => $this->dispatchBrowserEvent('foo-form-called', $data)),
];
}
}
+25
View File
@@ -0,0 +1,25 @@
<?php
use Filament\Tests\Admin\Fixtures\Pages\Actions;
use Filament\Tests\Admin\Pages\TestCase;
use Livewire\Livewire;
uses(TestCase::class);
it('can call a page action', function () {
Livewire::test(Actions::class)
->callPageAction('foo')
->assertSuccessful()
->assertDispatchedBrowserEvent('foo-called');
});
it('can call a page action with data', function () {
Livewire::test(Actions::class)
->callPageAction('foo-form', [
'name' => 'Ryan',
])
->assertHasNoErrors()
->assertDispatchedBrowserEvent('foo-form-called', [
'name' => 'Ryan',
]);
});
@@ -3,6 +3,7 @@
namespace Filament\Tests\Admin\Pages;
use Filament\PluginServiceProvider;
use Filament\Tests\Admin\Fixtures\Pages\Actions;
use Filament\Tests\Admin\Fixtures\Pages\Settings;
class PagesServiceProvider extends PluginServiceProvider
@@ -13,6 +14,7 @@ class PagesServiceProvider extends PluginServiceProvider
{
return [
Settings::class,
Actions::class,
];
}
}