diff --git a/packages/forms/.stubs.php b/packages/forms/.stubs.php index 1e83e672c7..9f74a46519 100644 --- a/packages/forms/.stubs.php +++ b/packages/forms/.stubs.php @@ -32,16 +32,6 @@ namespace Livewire\Features\SupportTesting { public function assertFormComponentExists(string $componentKey, string | Closure $schema = 'form', ?Closure $checkComponentUsing = null): static {} public function assertFormComponentDoesNotExist(string $componentKey, string $schema = 'form'): static {} - - public function goToWizardStep(int $step, string $schema = 'form'): static {} - - public function goToNextWizardStep(string $schema = 'form'): static {} - - public function goToPreviousWizardStep(string $schema = 'form'): static {} - - public function assertWizardStepExists(int $step, string $schema = 'form'): static {} - - public function assertWizardCurrentStep(int $step, string $schema = 'form'): static {} } } diff --git a/packages/forms/src/Testing/TestsForms.php b/packages/forms/src/Testing/TestsForms.php index 7deed1c474..ddf3813912 100644 --- a/packages/forms/src/Testing/TestsForms.php +++ b/packages/forms/src/Testing/TestsForms.php @@ -31,20 +31,20 @@ class TestsForms $livewire = $this->instance(); - /** @var Schema $formSchema */ - $formSchema = $livewire->{$schema}; + /** @var Schema $schemaInstance */ + $schemaInstance = $livewire->{$schema}; - $formSchemaStatePath = $formSchema->getStatePath(); + $schemaStatePath = $schemaInstance->getStatePath(); if ($state instanceof Closure) { - $state = $state($formSchema->getRawState()); + $state = $state($schemaInstance->getRawState()); } if (is_array($state)) { $state = Arr::undot($state); - if (filled($formSchemaStatePath)) { - $state = Arr::undot([$formSchemaStatePath => $state]); + if (filled($schemaStatePath)) { + $state = Arr::undot([$schemaStatePath => $state]); } foreach (Arr::dot($state) as $key => $value) { @@ -82,19 +82,19 @@ class TestsForms $livewire = $this->instance(); - /** @var Schema $formSchema */ - $formSchema = $livewire->{$schema}; + /** @var Schema $schemaInstance */ + $schemaInstance = $livewire->{$schema}; - $formSchemaStatePath = $formSchema->getStatePath(); + $schemaStatePath = $schemaInstance->getStatePath(); $this->assertHasErrors( collect($keys) - ->mapWithKeys(function ($value, $key) use ($formSchemaStatePath): array { + ->mapWithKeys(function ($value, $key) use ($schemaStatePath): array { if (is_int($key)) { - return [$key => (filled($formSchemaStatePath) ? "{$formSchemaStatePath}.{$value}" : $value)]; + return [$key => (filled($schemaStatePath) ? "{$schemaStatePath}.{$value}" : $value)]; } - return [(filled($formSchemaStatePath) ? "{$formSchemaStatePath}.{$key}" : $key) => $value]; + return [(filled($schemaStatePath) ? "{$schemaStatePath}.{$key}" : $key) => $value]; }) ->all(), ); @@ -111,19 +111,19 @@ class TestsForms $livewire = $this->instance(); - /** @var Schema $formSchema */ - $formSchema = $livewire->{$schema}; + /** @var Schema $schemaInstance */ + $schemaInstance = $livewire->{$schema}; - $formSchemaStatePath = $formSchema->getStatePath(); + $schemaStatePath = $schemaInstance->getStatePath(); $this->assertHasNoErrors( collect($keys) - ->mapWithKeys(function ($value, $key) use ($formSchemaStatePath): array { + ->mapWithKeys(function ($value, $key) use ($schemaStatePath): array { if (is_int($key)) { - return [$key => (filled($formSchemaStatePath) ? "{$formSchemaStatePath}.{$value}" : $value)]; + return [$key => (filled($schemaStatePath) ? "{$schemaStatePath}.{$value}" : $value)]; } - return [(filled($formSchemaStatePath) ? "{$formSchemaStatePath}.{$key}" : $key) => $value]; + return [(filled($schemaStatePath) ? "{$schemaStatePath}.{$key}" : $key) => $value]; }) ->all(), ); @@ -135,14 +135,14 @@ class TestsForms public function assertFormExists(): Closure { return function (string $name = 'form'): static { - /** @var Schema $formSchema */ - $formSchema = $this->instance()->{$name}; + /** @var Schema $schemaInstance */ + $schemaInstance = $this->instance()->{$name}; $livewireClass = $this->instance()::class; Assert::assertInstanceOf( Schema::class, - $formSchema, + $schemaInstance, "Failed asserting that a form with the name [{$name}] exists on the [{$livewireClass}] component." ); @@ -161,11 +161,11 @@ class TestsForms /** @phpstan-ignore-next-line */ $this->assertFormExists($schema); - /** @var Schema $formSchema */ - $formSchema = $this->instance()->{$schema}; + /** @var Schema $schemaInstance */ + $schemaInstance = $this->instance()->{$schema}; /** @var Component | Action | null $component */ - $component = $formSchema->getFlatComponents(withHidden: true)[$componentKey] ?? null; + $component = $schemaInstance->getFlatComponents(withHidden: true)[$componentKey] ?? null; $livewireClass = $this->instance()::class; @@ -189,10 +189,10 @@ class TestsForms public function assertFormComponentDoesNotExist(): Closure { return function (string $componentKey, string $schema = 'form'): static { - /** @var Schema $formSchema */ - $formSchema = $this->instance()->{$schema}; + /** @var Schema $schemaInstance */ + $schemaInstance = $this->instance()->{$schema}; - $components = $formSchema->getFlatComponents(withHidden: true); + $components = $schemaInstance->getFlatComponents(withHidden: true); $livewireClass = $this->instance()::class; @@ -217,11 +217,11 @@ class TestsForms /** @phpstan-ignore-next-line */ $this->assertFormExists($schema); - /** @var Schema $formSchema */ - $formSchema = $this->instance()->{$schema}; + /** @var Schema $schemaInstance */ + $schemaInstance = $this->instance()->{$schema}; /** @var ?Field $field */ - $field = $formSchema->getFlatFields(withHidden: true)[$fieldName] ?? null; + $field = $schemaInstance->getFlatFields(withHidden: true)[$fieldName] ?? null; $livewireClass = $this->instance()::class; @@ -245,10 +245,10 @@ class TestsForms public function assertFormFieldDoesNotExist(): Closure { return function (string $fieldName, string $schema = 'form'): static { - /** @var Schema $formSchema */ - $formSchema = $this->instance()->{$schema}; + /** @var Schema $schemaInstance */ + $schemaInstance = $this->instance()->{$schema}; - $fields = $formSchema->getFlatFields(withHidden: false); + $fields = $schemaInstance->getFlatFields(withHidden: false); $livewireClass = $this->instance()::class; @@ -268,11 +268,11 @@ class TestsForms /** @phpstan-ignore-next-line */ $this->assertFormFieldExists($fieldName, $schema); - /** @var Schema $formSchema */ - $formSchema = $this->instance()->{$schema}; + /** @var Schema $schemaInstance */ + $schemaInstance = $this->instance()->{$schema}; /** @var Field $field */ - $field = $formSchema->getFlatFields(withHidden: true)[$fieldName]; + $field = $schemaInstance->getFlatFields(withHidden: true)[$fieldName]; $livewireClass = $this->instance()::class; @@ -304,11 +304,11 @@ class TestsForms /** @phpstan-ignore-next-line */ $this->assertFormFieldExists($fieldName, $schema); - /** @var Schema $formSchema */ - $formSchema = $this->instance()->{$schema}; + /** @var Schema $schemaInstance */ + $schemaInstance = $this->instance()->{$schema}; /** @var Field $field */ - $field = $formSchema->getFlatFields(withHidden: true)[$fieldName]; + $field = $schemaInstance->getFlatFields(withHidden: true)[$fieldName]; $livewireClass = $this->instance()::class; @@ -340,11 +340,11 @@ class TestsForms /** @phpstan-ignore-next-line */ $this->assertFormFieldExists($fieldName, $schema); - /** @var Schema $formSchema */ - $formSchema = $this->instance()->{$schema}; + /** @var Schema $schemaInstance */ + $schemaInstance = $this->instance()->{$schema}; /** @var TextInput $field */ - $field = $formSchema->getFlatFields(withHidden: true)[$fieldName]; + $field = $schemaInstance->getFlatFields(withHidden: true)[$fieldName]; $livewireClass = $this->instance()::class; @@ -371,10 +371,10 @@ class TestsForms /** @phpstan-ignore-next-line */ $this->assertFormFieldExists($fieldName, $schema); - /** @var Schema $formSchema */ - $formSchema = $this->instance()->{$schema}; + /** @var Schema $schemaInstance */ + $schemaInstance = $this->instance()->{$schema}; - $fields = $formSchema->getFlatFields(withHidden: false); + $fields = $schemaInstance->getFlatFields(withHidden: false); $livewireClass = $this->instance()::class; @@ -402,10 +402,10 @@ class TestsForms /** @phpstan-ignore-next-line */ $this->assertFormFieldExists($fieldName, $schema); - /** @var Schema $formSchema */ - $formSchema = $this->instance()->{$schema}; + /** @var Schema $schemaInstance */ + $schemaInstance = $this->instance()->{$schema}; - $fields = $formSchema->getFlatFields(withHidden: false); + $fields = $schemaInstance->getFlatFields(withHidden: false); $livewireClass = $this->instance()::class; @@ -426,102 +426,4 @@ class TestsForms { return $this->assertFormFieldVisible(); } - - public function assertWizardStepExists(): Closure - { - return function (int $step, string $schema = 'form'): static { - /** @phpstan-ignore-next-line */ - $this->assertFormExists($schema); - - /** @var Schema $formSchema */ - $formSchema = $this->instance()->{$schema}; - - /** @var Wizard $wizard */ - $wizard = $formSchema->getComponent(fn (Component | Action | ActionGroup $component): bool => $component instanceof Wizard); - Assert::assertArrayHasKey( - $step - 1, - $wizard->getDefaultChildComponents(), - "Wizard does not have a step {$step}." - ); - - return $this; - }; - } - - public function assertWizardCurrentStep(): Closure - { - return function (int $step, string $schema = 'form'): static { - /** @phpstan-ignore-next-line */ - $this->assertFormExists($schema); - - /** @var Schema $formSchema */ - $formSchema = $this->instance()->{$schema}; - - /** @var Wizard $wizard */ - $wizard = $formSchema->getComponent(fn (Component | Action | ActionGroup $component): bool => $component instanceof Wizard); - Assert::assertEquals( - $step, - $current = $wizard->getCurrentStepIndex() + 1, - "Failed asserting that wizard is on step {$step}, current step is {$current}." - ); - - return $this; - }; - } - - public function goToWizardStep(): Closure - { - return function (int $step, string $schema = 'form'): static { - /** @phpstan-ignore-next-line */ - $this->assertWizardStepExists($step, $schema); - - /** @var Schema $formSchema */ - $formSchema = $this->instance()->{$schema}; - - /** @var Wizard $wizard */ - $wizard = $formSchema->getComponent(fn (Component | Action | ActionGroup $component): bool => $component instanceof Wizard); - - $stepIndex = ($step <= 1) ? 0 : $step - 2; - - $this->call('callSchemaComponentMethod', $wizard->getKey(), 'nextStep', [$stepIndex]); - - return $this; - }; - } - - public function goToNextWizardStep(): Closure - { - return function (string $schema = 'form'): static { - /** @phpstan-ignore-next-line */ - $this->assertFormExists($schema); - - /** @var Schema $formSchema */ - $formSchema = $this->instance()->{$schema}; - - /** @var Wizard $wizard */ - $wizard = $formSchema->getComponent(fn (Component | Action | ActionGroup $component): bool => $component instanceof Wizard); - - $this->call('callSchemaComponentMethod', $wizard->getKey(), 'nextStep', [$wizard->getCurrentStepIndex()]); - - return $this; - }; - } - - public function goToPreviousWizardStep(): Closure - { - return function (string $schema = 'form'): static { - /** @phpstan-ignore-next-line */ - $this->assertFormExists($schema); - - /** @var Schema $formSchema */ - $formSchema = $this->instance()->{$schema}; - - /** @var Wizard $wizard */ - $wizard = $formSchema->getComponent(fn (Component | Action | ActionGroup $component): bool => $component instanceof Wizard); - - $this->call('callSchemaComponentMethod', $wizard->getKey(), 'previousStep', [$wizard->getCurrentStepIndex()]); - - return $this; - }; - } } diff --git a/packages/schemas/.stubs.php b/packages/schemas/.stubs.php index 04817c2769..e4a4963a82 100644 --- a/packages/schemas/.stubs.php +++ b/packages/schemas/.stubs.php @@ -15,6 +15,16 @@ namespace Livewire\Features\SupportTesting { public function assertSchemaComponentStateSet(string $component, mixed $state, ?string $schema = null): static {} public function assertSchemaComponentStateNotSet(string $component, mixed $state, ?string $schema = null): static {} + + public function goToWizardStep(int $step, string $schema = 'form'): static {} + + public function goToNextWizardStep(string $schema = 'form'): static {} + + public function goToPreviousWizardStep(string $schema = 'form'): static {} + + public function assertWizardStepExists(int $step, string $schema = 'form'): static {} + + public function assertWizardCurrentStep(int $step, string $schema = 'form'): static {} } } diff --git a/packages/schemas/src/Testing/TestsSchemas.php b/packages/schemas/src/Testing/TestsSchemas.php index c7c9c65daf..527ec453be 100644 --- a/packages/schemas/src/Testing/TestsSchemas.php +++ b/packages/schemas/src/Testing/TestsSchemas.php @@ -3,8 +3,11 @@ namespace Filament\Schemas\Testing; use Closure; +use Filament\Actions\Action; +use Filament\Actions\ActionGroup; use Filament\Actions\Contracts\HasActions; use Filament\Schemas\Components\Component; +use Filament\Schemas\Components\Wizard; use Filament\Schemas\Contracts\HasSchemas; use Filament\Schemas\Schema; use Illuminate\Testing\Assert; @@ -171,4 +174,132 @@ class TestsSchemas return $this; }; } + + public function assertWizardStepExists(): Closure + { + return function (int $step, ?string $schema = null): static { + if ($this->instance() instanceof HasActions) { + $schema ??= $this->instance()->getMountedActionSchemaName(); + } + + $schema ??= $this->instance()->getDefaultTestingSchemaName(); + + /** @phpstan-ignore-next-line */ + $this->assertSchemaExists($schema); + + /** @var Schema $schemaInstance */ + $schemaInstance = $this->instance()->{$schema}; + + /** @var Wizard $wizard */ + $wizard = $schemaInstance->getComponent(fn (Component | Action | ActionGroup $component): bool => $component instanceof Wizard); + Assert::assertArrayHasKey( + $step - 1, + $wizard->getDefaultChildComponents(), + "Wizard does not have a step [{$step}]." + ); + + return $this; + }; + } + + public function assertWizardCurrentStep(): Closure + { + return function (int $step, ?string $schema = null): static { + if ($this->instance() instanceof HasActions) { + $schema ??= $this->instance()->getMountedActionSchemaName(); + } + + $schema ??= $this->instance()->getDefaultTestingSchemaName(); + + /** @phpstan-ignore-next-line */ + $this->assertSchemaExists($schema); + + /** @var Schema $schemaInstance */ + $schemaInstance = $this->instance()->{$schema}; + + /** @var Wizard $wizard */ + $wizard = $schemaInstance->getComponent(fn (Component | Action | ActionGroup $component): bool => $component instanceof Wizard); + Assert::assertEquals( + $step, + $current = $wizard->getCurrentStepIndex() + 1, + "Failed asserting that wizard is on step [{$step}], current step is [{$current}]." + ); + + return $this; + }; + } + + public function goToWizardStep(): Closure + { + return function (int $step, ?string $schema = null): static { + if ($this->instance() instanceof HasActions) { + $schema ??= $this->instance()->getMountedActionSchemaName(); + } + + $schema ??= $this->instance()->getDefaultTestingSchemaName(); + + /** @phpstan-ignore-next-line */ + $this->assertWizardStepExists($step, $schema); + + /** @var Schema $schemaInstance */ + $schemaInstance = $this->instance()->{$schema}; + + /** @var Wizard $wizard */ + $wizard = $schemaInstance->getComponent(fn (Component | Action | ActionGroup $component): bool => $component instanceof Wizard); + + $stepIndex = ($step <= 1) ? 0 : $step - 2; + + $this->call('callSchemaComponentMethod', $wizard->getKey(), 'nextStep', [$stepIndex]); + + return $this; + }; + } + + public function goToNextWizardStep(): Closure + { + return function (?string $schema = null): static { + if ($this->instance() instanceof HasActions) { + $schema ??= $this->instance()->getMountedActionSchemaName(); + } + + $schema ??= $this->instance()->getDefaultTestingSchemaName(); + + /** @phpstan-ignore-next-line */ + $this->assertSchemaExists($schema); + + /** @var Schema $schemaInstance */ + $schemaInstance = $this->instance()->{$schema}; + + /** @var Wizard $wizard */ + $wizard = $schemaInstance->getComponent(fn (Component | Action | ActionGroup $component): bool => $component instanceof Wizard); + + $this->call('callSchemaComponentMethod', $wizard->getKey(), 'nextStep', [$wizard->getCurrentStepIndex()]); + + return $this; + }; + } + + public function goToPreviousWizardStep(): Closure + { + return function (?string $schema = null): static { + if ($this->instance() instanceof HasActions) { + $schema ??= $this->instance()->getMountedActionSchemaName(); + } + + $schema ??= $this->instance()->getDefaultTestingSchemaName(); + + /** @phpstan-ignore-next-line */ + $this->assertSchemaExists($schema); + + /** @var Schema $schemaInstance */ + $schemaInstance = $this->instance()->{$schema}; + + /** @var Wizard $wizard */ + $wizard = $schemaInstance->getComponent(fn (Component | Action | ActionGroup $component): bool => $component instanceof Wizard); + + $this->call('callSchemaComponentMethod', $wizard->getKey(), 'previousStep', [$wizard->getCurrentStepIndex()]); + + return $this; + }; + } }