fix: DockerSecretsResolver - don't normalize absolute paths like /var/www/html/...
Some checks failed
Deploy Application / deploy (push) Has been cancelled

This commit is contained in:
2025-11-24 21:28:25 +01:00
parent 4eb7134853
commit 77abc65cd7
1327 changed files with 91915 additions and 9909 deletions

View File

@@ -0,0 +1,311 @@
<?php
declare(strict_types=1);
namespace Tests\Unit\Framework\LiveComponents\UI;
use App\Framework\LiveComponents\ComponentEventDispatcher;
use App\Framework\LiveComponents\UI\UIHelper;
use App\Framework\LiveComponents\ValueObjects\ComponentEvent;
use PHPUnit\Framework\TestCase;
/**
* Test class for UIHelper
*/
final class UIHelperTest extends TestCase
{
public function testShowToastDispatchesEvent(): void
{
$events = new ComponentEventDispatcher();
$ui = new UIHelper($events);
$ui->toast('Test message', 'success', null);
$dispatchedEvents = $events->getEvents();
$this->assertCount(1, $dispatchedEvents);
$event = $dispatchedEvents[0];
$this->assertInstanceOf(ComponentEvent::class, $event);
$this->assertEquals('toast:show', $event->name);
$this->assertTrue($event->isBroadcast());
$payload = $event->payload;
$this->assertEquals('Test message', $payload->getString('message'));
$this->assertEquals('success', $payload->getString('type'));
}
public function testShowToastWithDefaults(): void
{
$events = new ComponentEventDispatcher();
$ui = new UIHelper($events);
$ui->toast('Test message');
$dispatchedEvents = $events->getEvents();
$this->assertCount(1, $dispatchedEvents);
$event = $dispatchedEvents[0];
$payload = $event->payload;
$this->assertEquals('info', $payload->getString('type'));
$this->assertEquals(5000, $payload->getInt('duration'));
$this->assertEquals('top-right', $payload->getString('position'));
$this->assertEquals('global', $payload->getString('componentId'));
}
public function testShowToastWithNullEvents(): void
{
$ui = new UIHelper(null);
// Should not throw error
$ui->toast('Test message');
$this->assertTrue(true); // Test passes if no exception thrown
}
public function testSuccessToast(): void
{
$events = new ComponentEventDispatcher();
$ui = new UIHelper($events);
$ui->successToast('Success message');
$dispatchedEvents = $events->getEvents();
$this->assertCount(1, $dispatchedEvents);
$event = $dispatchedEvents[0];
$payload = $event->payload;
$this->assertEquals('success', $payload->getString('type'));
$this->assertEquals('Success message', $payload->getString('message'));
}
public function testErrorToast(): void
{
$events = new ComponentEventDispatcher();
$ui = new UIHelper($events);
$ui->errorToast('Error message');
$dispatchedEvents = $events->getEvents();
$this->assertCount(1, $dispatchedEvents);
$event = $dispatchedEvents[0];
$payload = $event->payload;
$this->assertEquals('error', $payload->getString('type'));
$this->assertEquals(0, $payload->getInt('duration')); // Persistent by default
}
public function testHideToastDispatchesEvent(): void
{
$events = new ComponentEventDispatcher();
$ui = new UIHelper($events);
$ui->hideToast('test-component');
$dispatchedEvents = $events->getEvents();
$this->assertCount(1, $dispatchedEvents);
$event = $dispatchedEvents[0];
$this->assertEquals('toast:hide', $event->name);
$payload = $event->payload;
$this->assertEquals('test-component', $payload->getString('componentId'));
}
public function testShowModalDispatchesEvent(): void
{
$events = new ComponentEventDispatcher();
$ui = new UIHelper($events);
$ui->modal(
'test-component',
'Test Title',
'<p>Test content</p>',
\App\Framework\LiveComponents\Events\UI\Options\ModalOptions::create()
->withSize(\App\Framework\LiveComponents\Events\UI\Enums\ModalSize::Large)
->withButtons([['text' => 'OK', 'class' => 'btn-primary']])
->closeOnBackdrop(false)
->closeOnEscape(false)
);
$dispatchedEvents = $events->getEvents();
$this->assertCount(1, $dispatchedEvents);
$event = $dispatchedEvents[0];
$this->assertEquals('modal:show', $event->name);
$payload = $event->payload;
$this->assertEquals('test-component', $payload->getString('componentId'));
$this->assertEquals('Test Title', $payload->getString('title'));
$this->assertEquals('<p>Test content</p>', $payload->getString('content'));
$this->assertEquals('large', $payload->getString('size'));
$this->assertFalse($payload->getBool('closeOnBackdrop'));
$this->assertFalse($payload->getBool('closeOnEscape'));
}
public function testShowModalWithDefaults(): void
{
$events = new ComponentEventDispatcher();
$ui = new UIHelper($events);
$ui->modal('test-component', 'Title', 'Content');
$dispatchedEvents = $events->getEvents();
$event = $dispatchedEvents[0];
$payload = $event->payload;
$this->assertEquals('medium', $payload->getString('size'));
$this->assertTrue($payload->getBool('closeOnBackdrop'));
$this->assertTrue($payload->getBool('closeOnEscape'));
}
public function testCloseModalDispatchesEvent(): void
{
$events = new ComponentEventDispatcher();
$ui = new UIHelper($events);
$ui->closeModal('test-component');
$dispatchedEvents = $events->getEvents();
$this->assertCount(1, $dispatchedEvents);
$event = $dispatchedEvents[0];
$this->assertEquals('modal:close', $event->name);
$payload = $event->payload;
$this->assertEquals('test-component', $payload->getString('componentId'));
}
public function testShowConfirmDispatchesEvent(): void
{
$events = new ComponentEventDispatcher();
$ui = new UIHelper($events);
$ui->confirm(
'test-component',
'Confirm Title',
'Confirm message',
\App\Framework\LiveComponents\Events\UI\Options\ConfirmOptions::create()
->withButtons('Yes', 'No')
->withClasses('btn-danger', 'btn-secondary')
);
$dispatchedEvents = $events->getEvents();
$this->assertCount(1, $dispatchedEvents);
$event = $dispatchedEvents[0];
$this->assertEquals('modal:confirm', $event->name);
$payload = $event->payload;
$this->assertEquals('test-component', $payload->getString('componentId'));
$this->assertEquals('Confirm Title', $payload->getString('title'));
$this->assertEquals('Confirm message', $payload->getString('message'));
$this->assertEquals('Yes', $payload->getString('confirmText'));
$this->assertEquals('No', $payload->getString('cancelText'));
}
public function testShowConfirmWithDefaults(): void
{
$events = new ComponentEventDispatcher();
$ui = new UIHelper($events);
$ui->confirm('test-component', 'Title', 'Message');
$dispatchedEvents = $events->getEvents();
$event = $dispatchedEvents[0];
$payload = $event->payload;
$this->assertEquals('Confirm', $payload->getString('confirmText'));
$this->assertEquals('Cancel', $payload->getString('cancelText'));
$this->assertEquals('btn-primary', $payload->getString('confirmClass'));
$this->assertEquals('btn-secondary', $payload->getString('cancelClass'));
}
public function testConfirmDelete(): void
{
$events = new ComponentEventDispatcher();
$ui = new UIHelper($events);
$ui->confirmDelete('test-component', 'Item Name', 'deleteAction', ['id' => 123]);
$dispatchedEvents = $events->getEvents();
$this->assertCount(1, $dispatchedEvents);
$event = $dispatchedEvents[0];
$payload = $event->payload;
$this->assertEquals('Delete Item Name?', $payload->getString('title'));
$this->assertEquals("Are you sure you want to delete 'Item Name'? This action cannot be undone.", $payload->getString('message'));
$this->assertEquals('Delete', $payload->getString('confirmText'));
$this->assertEquals('btn-danger', $payload->getString('confirmClass'));
$this->assertEquals('deleteAction', $payload->getString('confirmAction'));
$this->assertEquals(['id' => 123], $payload->getArray('confirmParams'));
}
public function testShowAlertDispatchesEvent(): void
{
$events = new ComponentEventDispatcher();
$ui = new UIHelper($events);
$ui->alert('test-component', 'Alert Title', 'Alert message', 'error', 'OK');
$dispatchedEvents = $events->getEvents();
$this->assertCount(1, $dispatchedEvents);
$event = $dispatchedEvents[0];
$this->assertEquals('modal:alert', $event->name);
$payload = $event->payload;
$this->assertEquals('test-component', $payload->getString('componentId'));
$this->assertEquals('Alert Title', $payload->getString('title'));
$this->assertEquals('Alert message', $payload->getString('message'));
$this->assertEquals('error', $payload->getString('type'));
$this->assertEquals('OK', $payload->getString('buttonText'));
}
public function testShowAlertWithDefaults(): void
{
$events = new ComponentEventDispatcher();
$ui = new UIHelper($events);
$ui->alert('test-component', 'Title', 'Message');
$dispatchedEvents = $events->getEvents();
$event = $dispatchedEvents[0];
$payload = $event->payload;
$this->assertEquals('info', $payload->getString('type'));
$this->assertEquals('OK', $payload->getString('buttonText'));
}
public function testFluentInterface(): void
{
$events = new ComponentEventDispatcher();
$ui = new UIHelper($events);
$result = $ui->successToast('Saved!')
->infoToast('Processing...')
->modal('modal-1', 'Title', 'Content');
$this->assertSame($ui, $result);
$this->assertCount(3, $events->getEvents());
}
public function testComponentIdAsValueObject(): void
{
$events = new ComponentEventDispatcher();
$ui = new UIHelper($events);
$componentId = \App\Framework\LiveComponents\ValueObjects\ComponentId::fromString('test:component');
$ui->modal($componentId, 'Title', 'Content');
$dispatchedEvents = $events->getEvents();
$event = $dispatchedEvents[0];
$payload = $event->payload;
$this->assertEquals('test:component', $payload->getString('componentId'));
}
}