app/tests/Browser/Components/UserModal.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');
}
}
}