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', '

Test content

', \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('

Test content

', $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')); } }