Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
39 / 39
n/a
0 / 0
CRAP
n/a
0 / 0
1<?php
2
3// ╔════════════════════════════════════════════════════════════╗
4// ║ MIT Licence (#Expat) - https://opensource.org/licenses/MIT ║
5// ║ Copyright 2026 Frederic Poeydomenge <dyno@phexium.com>     ║
6// ╚════════════════════════════════════════════════════════════╝
7
8declare(strict_types=1);
9
10use Phexium\Plugin\EventBus\Adapter\SyncEventBus;
11use Phexium\Plugin\Logger\Adapter\NullLogger;
12use Tests\Phexium\Fake\Domain\Event\DomainEvent as FakeDomainEvent;
13use Tests\Phexium\Fake\Plugin\Dispatcher\FakeDispatcher;
14use Tests\Phexium\Fake\Plugin\Dispatcher\FakeListenerRegistry;
15use Tests\Phexium\Fake\Plugin\Logger\Logger as FakeLogger;
16
17test('It dispatches events through the event dispatcher', function (): void {
18    $event = new FakeDomainEvent('test-data');
19    $listenerRegistry = new FakeListenerRegistry();
20    $dispatcher = new FakeDispatcher($listenerRegistry);
21    $logger = new NullLogger();
22
23    $eventBus = new SyncEventBus($dispatcher, $listenerRegistry, $logger);
24
25    $result = $eventBus->dispatch($event);
26
27    expect($result)->toBe($event);
28    expect($dispatcher->wasDispatched(FakeDomainEvent::class))->toBeTrue();
29    expect($dispatcher->getDispatchCount())->toBe(1);
30    expect($dispatcher->getLastDispatchedEvent())->toBe($event);
31});
32
33test('It subscribes listeners to events', function (): void {
34    $listenerRegistry = new FakeListenerRegistry();
35    $dispatcher = new FakeDispatcher($listenerRegistry);
36    $logger = new NullLogger();
37    $eventBus = new SyncEventBus($dispatcher, $listenerRegistry, $logger);
38
39    $listenerCalled = false;
40    $listener = function (object $event) use (&$listenerCalled): void {
41        $listenerCalled = true;
42    };
43
44    $eventBus->subscribe(FakeDomainEvent::class, $listener);
45
46    $event = new FakeDomainEvent();
47    $dispatcher->dispatch($event);
48
49    expect($listenerCalled)->toBeTrue();
50});
51
52test('Should log event dispatch with context', function (): void {
53    $event = new FakeDomainEvent('test-data');
54    $listenerRegistry = new FakeListenerRegistry();
55    $dispatcher = new FakeDispatcher($listenerRegistry);
56    $logger = new FakeLogger();
57
58    $eventBus = new SyncEventBus($dispatcher, $listenerRegistry, $logger);
59
60    $eventBus->dispatch($event);
61
62    expect($logger->hasLog('debug', 'EventBus: Dispatching domain event', [
63        'event' => FakeDomainEvent::class,
64        'eventName' => $event->getEventName(),
65        'aggregateId' => $event->getAggregateId()->getValue(),
66    ]))->toBeTrue();
67});