packages/ztd-query-core/tests/Unit/Schema/SchemaRegistryTest.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\SchemaRegistry;
11use ZtdQuery\Schema\TableDefinition;
12use ZtdQuery\Schema\TableDefinitionRegistry;
13
14#[UsesClass(TableDefinition::class)]
15#[UsesClass(TableDefinitionRegistry::class)]
16#[CoversClass(SchemaRegistry::class)]
17final class SchemaRegistryTest extends TestCase
18{
19    public function testGetAllClearRegisterAndClear(): void
20    {
21        $registry = new TableDefinitionRegistry();
22        $definition = new TableDefinition(['id'], ['id' => 'INT'], [], [], []);
23        $registry->register('users', $definition);
24
25        self::assertSame($definition, $registry->get('users'));
26        self::assertSame(['users' => $definition], $registry->getAll());
27        self::assertTrue($registry->has('users'));
28        self::assertTrue($registry->hasAnyTables());
29
30        $registry->clear();
31
32        self::assertNull($registry->get('users'));
33        self::assertSame([], $registry->getAll());
34        self::assertFalse($registry->hasAnyTables());
35    }
36
37    public function testRegisterGetUnregister(): void
38    {
39        $registry = new TableDefinitionRegistry();
40        $usersDef = new TableDefinition(['id'], ['id' => 'INT'], [], [], []);
41        $postsDef = new TableDefinition(['id'], ['id' => 'INT'], [], [], []);
42        $registry->register('users', $usersDef);
43        $registry->register('posts', $postsDef);
44
45        $registry->unregister('users');
46
47        self::assertNull($registry->get('users'));
48        self::assertSame($postsDef, $registry->get('posts'));
49    }
50
51    public function testHasAnswersForATableTheRegistryKnows(): void
52    {
53        $registry = new SchemaRegistry();
54        $registry->register('order', 'CREATE TABLE `order` (id INT)');
55
56        self::assertTrue($registry->has('order'));
57        self::assertFalse($registry->has('other'));
58    }
59
60    public function testHasAnyTablesIsFalseUntilOneIsRegistered(): void
61    {
62        $registry = new SchemaRegistry();
63
64        self::assertFalse($registry->hasAnyTables());
65
66        $registry->register('order', 'CREATE TABLE `order` (id INT)');
67
68        self::assertTrue($registry->hasAnyTables());
69    }
70
71    public function testUnregisterLeavesTheRegistryWithoutThatTable(): void
72    {
73        $registry = new SchemaRegistry();
74        $registry->register('order', 'CREATE TABLE `order` (id INT)');
75
76        $registry->unregister('order');
77
78        self::assertNull($registry->get('order'));
79    }
80
81    public function testClearLeavesTheRegistryWithNoTablesAtAll(): void
82    {
83        $registry = new SchemaRegistry();
84        $registry->register('order', 'CREATE TABLE `order` (id INT)');
85
86        $registry->clear();
87
88        self::assertFalse($registry->hasAnyTables());
89        self::assertSame([], $registry->getAll());
90    }
91}
92