Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
58 / 58
100.00% covered (success)
100.00%
4 / 4
CRAP
100.00% covered (success)
100.00%
4 / 4
SimpleTestQuery
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
QueryWithId
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
QueryWithStringable
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
QueryWithArray
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
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\Application\Query\QueryInterface;
11use Phexium\Domain\Id\IdInterface;
12use Phexium\Plugin\QueryBus\Internal\QueryCacheKeyGenerator;
13use Tests\Phexium\Fake\Domain\Id;
14use Tests\Phexium\Fake\Domain\StringValueObject;
15
16final readonly class SimpleTestQuery implements QueryInterface
17{
18    public function __construct(
19        public string $name,
20        public int $page
21    ) {}
22}
23
24final readonly class QueryWithId implements QueryInterface
25{
26    public function __construct(
27        public IdInterface $id
28    ) {}
29}
30
31final readonly class QueryWithStringable implements QueryInterface
32{
33    public function __construct(
34        public Stringable $value
35    ) {}
36}
37
38final readonly class QueryWithArray implements QueryInterface
39{
40    public function __construct(
41        public array $items
42    ) {}
43}
44
45test('Same query with same parameters generates same key', function (): void {
46    $query1 = new SimpleTestQuery('test', 1);
47    $query2 = new SimpleTestQuery('test', 1);
48
49    $key1 = QueryCacheKeyGenerator::generate($query1);
50    $key2 = QueryCacheKeyGenerator::generate($query2);
51
52    expect($key1)->toBe($key2);
53});
54
55test('Different parameters generate different keys', function (): void {
56    $query1 = new SimpleTestQuery('test', 1);
57    $query2 = new SimpleTestQuery('test', 2);
58
59    $key1 = QueryCacheKeyGenerator::generate($query1);
60    $key2 = QueryCacheKeyGenerator::generate($query2);
61
62    expect($key1)->not->toBe($key2);
63});
64
65test('Key contains query class name', function (): void {
66    $query = new SimpleTestQuery('test', 1);
67
68    $key = QueryCacheKeyGenerator::generate($query);
69
70    expect($key)->toStartWith('query:SimpleTestQuery:');
71});
72
73test('IdInterface properties are normalized to string', function (): void {
74    $query1 = new QueryWithId(Id::from('abc-123'));
75    $query2 = new QueryWithId(Id::from('abc-123'));
76
77    $key1 = QueryCacheKeyGenerator::generate($query1);
78    $key2 = QueryCacheKeyGenerator::generate($query2);
79
80    expect($key1)->toBe($key2);
81});
82
83test('Different IdInterface values generate different keys', function (): void {
84    $query1 = new QueryWithId(Id::from('abc-123'));
85    $query2 = new QueryWithId(Id::from('xyz-789'));
86
87    $key1 = QueryCacheKeyGenerator::generate($query1);
88    $key2 = QueryCacheKeyGenerator::generate($query2);
89
90    expect($key1)->not->toBe($key2);
91});
92
93test('Stringable properties are normalized to string', function (): void {
94    $query1 = new QueryWithStringable(StringValueObject::fromString('hello'));
95    $query2 = new QueryWithStringable(StringValueObject::fromString('hello'));
96
97    $key1 = QueryCacheKeyGenerator::generate($query1);
98    $key2 = QueryCacheKeyGenerator::generate($query2);
99
100    expect($key1)->toBe($key2);
101});
102
103test('Array properties are handled correctly', function (): void {
104    $query1 = new QueryWithArray(['a', 'b', 'c']);
105    $query2 = new QueryWithArray(['a', 'b', 'c']);
106
107    $key1 = QueryCacheKeyGenerator::generate($query1);
108    $key2 = QueryCacheKeyGenerator::generate($query2);
109
110    expect($key1)->toBe($key2);
111});
112
113test('Different array contents generate different keys', function (): void {
114    $query1 = new QueryWithArray(['a', 'b']);
115    $query2 = new QueryWithArray(['a', 'b', 'c']);
116
117    $key1 = QueryCacheKeyGenerator::generate($query1);
118    $key2 = QueryCacheKeyGenerator::generate($query2);
119
120    expect($key1)->not->toBe($key2);
121});