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