packages/ztd-query-core/tests/Unit/Schema/ViewDefinitionSetTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Schema;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Schema\ViewDefinition;
11use ZtdQuery\Schema\ViewDefinitionSet;
12
13#[CoversClass(ViewDefinitionSet::class)]
14#[UsesClass(ViewDefinition::class)]
15final class ViewDefinitionSetTest extends TestCase
16{
17 public function testOrdersViewsAfterTheirDependencies(): void
18 {
19 $definitions = new ViewDefinitionSet();
20 $summary = new ViewDefinition('summary query', ['active_users']);
21 $activeUsers = new ViewDefinition('active users query', ['users']);
22 $definitions->register('summary', $summary);
23 $definitions->register('active_users', $activeUsers);
24
25 self::assertSame(
26 ['active_users' => $activeUsers, 'summary' => $summary],
27 $definitions->orderedDefinitions(),
28 );
29 }
30
31 public function testOrdersThreeDependencyLevels(): void
32 {
33 $definitions = new ViewDefinitionSet();
34 $summary = new ViewDefinition('summary query', ['active_users']);
35 $activeUsers = new ViewDefinition('active users query', ['eligible_users']);
36 $eligibleUsers = new ViewDefinition('eligible users query', ['users']);
37 $definitions->register('summary', $summary);
38 $definitions->register('active_users', $activeUsers);
39 $definitions->register('eligible_users', $eligibleUsers);
40
41 self::assertSame(
42 [
43 'eligible_users' => $eligibleUsers,
44 'active_users' => $activeUsers,
45 'summary' => $summary,
46 ],
47 $definitions->orderedDefinitions(),
48 );
49 }
50
51 public function testKeepsCyclicDefinitionsDeterministic(): void
52 {
53 $definitions = new ViewDefinitionSet();
54 $definitions->register('left_view', new ViewDefinition('left query', ['right_view']));
55 $definitions->register('right_view', new ViewDefinition('right query', ['left_view']));
56
57 self::assertSame(
58 ['left_view', 'right_view'],
59 array_keys($definitions->orderedDefinitions()),
60 );
61 }
62
63 public function testRegisterMakesAViewOneOfTheSet(): void
64 {
65 $definitions = new ViewDefinitionSet();
66 $view = new ViewDefinition('query', []);
67
68 $definitions->register('summary', $view);
69
70 self::assertSame(['summary' => $view], $definitions->orderedDefinitions());
71 }
72
73 public function testRegisterUnderANameAlreadyThereTakesThePlaceOfIt(): void
74 {
75 $definitions = new ViewDefinitionSet();
76 $replacement = new ViewDefinition('second query', []);
77 $definitions->register('summary', new ViewDefinition('first query', []));
78 $definitions->register('summary', $replacement);
79
80 self::assertSame(['summary' => $replacement], $definitions->orderedDefinitions());
81 }
82
83 public function testHasAnswersForAViewTheSetKnows(): void
84 {
85 $definitions = new ViewDefinitionSet();
86 $definitions->register('summary', new ViewDefinition('query', []));
87
88 self::assertTrue($definitions->has('summary'));
89 self::assertFalse($definitions->has('other'));
90 }
91
92 public function testHasAnyViewsIsFalseUntilOneIsRegistered(): void
93 {
94 $definitions = new ViewDefinitionSet();
95
96 self::assertFalse($definitions->hasAnyViews());
97
98 $definitions->register('summary', new ViewDefinition('query', []));
99
100 self::assertTrue($definitions->hasAnyViews());
101 }
102
103 public function testOrderedDefinitionsIsEmptyForASetWithNoViews(): void
104 {
105 self::assertSame([], (new ViewDefinitionSet())->orderedDefinitions());
106 }
107}
108