131 lines
No EOL
3.3 KiB
PHP
131 lines
No EOL
3.3 KiB
PHP
<?php
|
|
|
|
namespace Tests\Browser\Components;
|
|
|
|
use Laravel\Dusk\Browser;
|
|
use Laravel\Dusk\Component as BaseComponent;
|
|
|
|
class UserModal extends BaseComponent
|
|
{
|
|
protected string $mode; // 'create', 'edit', or 'delete'
|
|
|
|
public function __construct(string $mode = 'create')
|
|
{
|
|
$this->mode = $mode;
|
|
}
|
|
|
|
/**
|
|
* Get the root selector for the component.
|
|
*/
|
|
public function selector(): string
|
|
{
|
|
return '[role="dialog"], .fixed.inset-0';
|
|
}
|
|
|
|
/**
|
|
* Assert that the browser page contains the component.
|
|
*/
|
|
public function assert(Browser $browser): void
|
|
{
|
|
$browser->assertVisible($this->selector());
|
|
|
|
switch ($this->mode) {
|
|
case 'create':
|
|
$browser->assertSee('Add New User');
|
|
break;
|
|
case 'edit':
|
|
$browser->assertSee('Edit User');
|
|
break;
|
|
case 'delete':
|
|
$browser->assertSee('Delete User')
|
|
->assertSee('Are you sure you want to delete');
|
|
break;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the element shortcuts for the component.
|
|
*
|
|
* @return array<string, string>
|
|
*/
|
|
public function elements(): array
|
|
{
|
|
$submitText = match ($this->mode) {
|
|
'create' => 'Create User',
|
|
'edit' => 'Update User',
|
|
'delete' => 'Delete User'
|
|
};
|
|
|
|
return [
|
|
'@name-input' => 'input[wire\\:model="name"]',
|
|
'@submit-button' => "button:contains('{$submitText}')",
|
|
'@cancel-button' => 'button:contains("Cancel")',
|
|
'@validation-error' => '.text-red-500',
|
|
'@confirmation-text' => '*[text*="Are you sure"]',
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Fill the user form (for create/edit modals).
|
|
*/
|
|
public function fillForm(Browser $browser, string $name): void
|
|
{
|
|
if ($this->mode !== 'delete') {
|
|
$browser->waitFor('@name-input')
|
|
->clear('@name-input')
|
|
->type('@name-input', $name);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Submit the form.
|
|
*/
|
|
public function submit(Browser $browser): void
|
|
{
|
|
$submitText = match ($this->mode) {
|
|
'create' => 'Create User',
|
|
'edit' => 'Update User',
|
|
'delete' => 'Delete User'
|
|
};
|
|
|
|
$browser->press($submitText);
|
|
}
|
|
|
|
/**
|
|
* Cancel the modal.
|
|
*/
|
|
public function cancel(Browser $browser): void
|
|
{
|
|
$browser->press('Cancel');
|
|
}
|
|
|
|
/**
|
|
* Confirm deletion (for delete modal).
|
|
*/
|
|
public function confirmDelete(Browser $browser): void
|
|
{
|
|
if ($this->mode === 'delete') {
|
|
$browser->press('Delete User');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Assert validation error is shown.
|
|
*/
|
|
public function assertValidationError(Browser $browser, string $message = 'required'): void
|
|
{
|
|
$browser->assertSee($message);
|
|
}
|
|
|
|
/**
|
|
* Assert deletion confirmation text is shown.
|
|
*/
|
|
public function assertDeleteConfirmation(Browser $browser, string $userName): void
|
|
{
|
|
if ($this->mode === 'delete') {
|
|
$browser->assertSee('Are you sure you want to delete')
|
|
->assertSee($userName)
|
|
->assertSee('This action cannot be undone');
|
|
}
|
|
}
|
|
} |