Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
43 / 43
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 DI\Container;
11use Phexium\Application\Query\QueryResponseInterface;
12use Phexium\Plugin\Logger\Adapter\NullLogger;
13use Phexium\Plugin\QueryBus\Adapter\SyncQueryBus;
14use Tests\Phexium\Fake\Application\Query\Handler as FakeHandler;
15use Tests\Phexium\Fake\Application\Query\InvalidQueryHandler as FakeInvalidQueryHandler;
16use Tests\Phexium\Fake\Application\Query\OrphanQuery as FakeOrphanQuery;
17use Tests\Phexium\Fake\Application\Query\Query as FakeQuery;
18use Tests\Phexium\Fake\Application\Query\QueryAlternative as FakeQueryAlternative;
19use Tests\Phexium\Fake\Plugin\Logger\Logger as FakeLogger;
20
21test('it dispatches query to auto-discovered handler', function (): void {
22    $container = new Container();
23    $logger = new NullLogger();
24
25    $handler = new FakeHandler();
26    $container->set(FakeHandler::class, $handler);
27
28    $queryBus = new SyncQueryBus($container, $logger);
29
30    $query = new FakeQuery();
31    $result = $queryBus->dispatch($query);
32
33    expect($result)->toBeInstanceOf(QueryResponseInterface::class)
34        ->and($handler->handled)->toBeTrue()
35    ;
36});
37
38test('it throws exception for non-existent handler', function (): void {
39    $container = new Container();
40    $logger = new NullLogger();
41
42    $queryBus = new SyncQueryBus($container, $logger);
43
44    $query = new FakeOrphanQuery();
45
46    expect(fn (): QueryResponseInterface => $queryBus->dispatch($query))
47        ->toThrow(InvalidArgumentException::class, 'Handler not found for query')
48    ;
49});
50
51test('it throws exception for invalid handler', function (): void {
52    $container = new Container();
53    $container->set(FakeInvalidQueryHandler::class, new FakeInvalidQueryHandler());
54
55    $logger = new NullLogger();
56
57    $queryBus = new SyncQueryBus($container, $logger);
58
59    $query = new FakeQueryAlternative();
60
61    expect(fn (): QueryResponseInterface => $queryBus->dispatch($query))
62        ->toThrow(InvalidArgumentException::class, 'Handler must implement')
63    ;
64});
65
66test('should log query dispatch with context', function (): void {
67    $container = new Container();
68    $logger = new FakeLogger();
69
70    $handler = new FakeHandler();
71    $container->set(FakeHandler::class, $handler);
72
73    $queryBus = new SyncQueryBus($container, $logger);
74
75    $query = new FakeQuery();
76    $queryBus->dispatch($query);
77
78    expect($logger->hasLog('debug', 'QueryBus: Dispatching query', [
79        'query' => FakeQuery::class,
80    ]))->toBeTrue();
81});