Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
59 / 59
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
10pest()->group('unit');
11
12use Phexium\Plugin\QueryBus\Internal\QueryCacheKeyGenerator;
13use Tests\Phexium\Fake\Domain\Id;
14use Tests\Phexium\Fake\Domain\StringValueObject;
15use Tests\Phexium\Fake\Plugin\QueryBus\QueryWithArray;
16use Tests\Phexium\Fake\Plugin\QueryBus\QueryWithId;
17use Tests\Phexium\Fake\Plugin\QueryBus\QueryWithStringable;
18use Tests\Phexium\Fake\Plugin\QueryBus\SimpleTestQuery;
19
20describe('Key generation', function (): void {
21    it('generates same key for same query with same parameters', function (): void {
22        $query1 = new SimpleTestQuery('test', 1);
23        $query2 = new SimpleTestQuery('test', 1);
24
25        $key1 = QueryCacheKeyGenerator::generate($query1);
26        $key2 = QueryCacheKeyGenerator::generate($query2);
27
28        expect($key1)->toBe($key2);
29    });
30
31    it('includes query class name in key', function (): void {
32        $query = new SimpleTestQuery('test', 1);
33
34        $key = QueryCacheKeyGenerator::generate($query);
35
36        expect($key)->toStartWith('query:Tests\Phexium\Fake\Plugin\QueryBus\SimpleTestQuery:');
37    });
38
39    it('normalizes IdInterface properties to string', function (): void {
40        $query1 = new QueryWithId(Id::from('abc-123'));
41        $query2 = new QueryWithId(Id::from('abc-123'));
42
43        $key1 = QueryCacheKeyGenerator::generate($query1);
44        $key2 = QueryCacheKeyGenerator::generate($query2);
45
46        expect($key1)->toBe($key2);
47    });
48
49    it('normalizes Stringable properties to string', function (): void {
50        $query1 = new QueryWithStringable(StringValueObject::fromString('hello'));
51        $query2 = new QueryWithStringable(StringValueObject::fromString('hello'));
52
53        $key1 = QueryCacheKeyGenerator::generate($query1);
54        $key2 = QueryCacheKeyGenerator::generate($query2);
55
56        expect($key1)->toBe($key2);
57    });
58
59    it('handles array properties correctly', function (): void {
60        $query1 = new QueryWithArray(['a', 'b', 'c']);
61        $query2 = new QueryWithArray(['a', 'b', 'c']);
62
63        $key1 = QueryCacheKeyGenerator::generate($query1);
64        $key2 = QueryCacheKeyGenerator::generate($query2);
65
66        expect($key1)->toBe($key2);
67    });
68});
69
70describe('Uniqueness', function (): void {
71    it('generates different keys for different parameters', function (): void {
72        $query1 = new SimpleTestQuery('test', 1);
73        $query2 = new SimpleTestQuery('test', 2);
74
75        $key1 = QueryCacheKeyGenerator::generate($query1);
76        $key2 = QueryCacheKeyGenerator::generate($query2);
77
78        expect($key1)->not->toBe($key2);
79    });
80
81    it('generates different keys for different IdInterface values', function (): void {
82        $query1 = new QueryWithId(Id::from('abc-123'));
83        $query2 = new QueryWithId(Id::from('xyz-789'));
84
85        $key1 = QueryCacheKeyGenerator::generate($query1);
86        $key2 = QueryCacheKeyGenerator::generate($query2);
87
88        expect($key1)->not->toBe($key2);
89    });
90
91    it('generates different keys for different array contents', function (): void {
92        $query1 = new QueryWithArray(['a', 'b']);
93        $query2 = new QueryWithArray(['a', 'b', 'c']);
94
95        $key1 = QueryCacheKeyGenerator::generate($query1);
96        $key2 = QueryCacheKeyGenerator::generate($query2);
97
98        expect($key1)->not->toBe($key2);
99    });
100});