packages/ztd-query-mysql/tests/Unit/Rewrite/Context/TableContextTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite\Context;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Platform\MySql\Rewrite\Context\TableContext;
10
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Rewrite\Cte\MySqlCteShadowComposer::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::class)]
13#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\Relation\MySqlSelectRelationParser::class)]
14#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Rewrite\View\MySqlViewShadowRenderer::class)]
15#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\Cte\HeaderParser::class)]
16#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\Cte\IdentifierReferences::class)]
17#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\Relation\ReferenceReader::class)]
18#[CoversClass(TableContext::class)]
19final class TableContextTest extends TestCase
20{
21    public function testBuildTableContext(): void
22    {
23        $store = new \ZtdQuery\Shadow\ShadowStore();
24        $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
25        $context = new TableContext(new \ZtdQuery\Platform\MySql\Rewrite\Cte\MySqlCteShadowComposer(), $registry, $store, new \ZtdQuery\Schema\ViewDefinitionSet());
26        $store->set('users', [['id' => 1], ['name' => 'a']]);
27        $registry->register('empty', new \ZtdQuery\Schema\TableDefinition(['code'], [], [], [], []));
28        $tables = $context->buildTableContext();
29        self::assertArrayHasKey('columns', $tables['users']);
30        self::assertArrayHasKey('columns', $tables['empty']);
31        self::assertSame(['id', 'name'], $tables['users']['columns'] ?? null);
32        self::assertSame([['id' => 1], ['name' => 'a']], $tables['users']['rows']);
33        self::assertSame(['code'], $tables['empty']['columns'] ?? null);
34        self::assertSame([], $tables['empty']['rows']);
35    }
36
37    public function testFindUnknownTable(): void
38    {
39        $store = new \ZtdQuery\Shadow\ShadowStore();
40        $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
41        $context = new TableContext(new \ZtdQuery\Platform\MySql\Rewrite\Cte\MySqlCteShadowComposer(), $registry, $store, new \ZtdQuery\Schema\ViewDefinitionSet());
42        $store->set('users', [['id' => 1]]);
43        self::assertNull($context->findUnknownTable('WITH c AS (SELECT * FROM users) SELECT * FROM c'));
44        self::assertSame('missing', $context->findUnknownTable('SELECT * FROM users JOIN missing ON TRUE'));
45    }
46
47    public function testTableExists(): void
48    {
49        $store = new \ZtdQuery\Shadow\ShadowStore();
50        $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
51        $context = new TableContext(new \ZtdQuery\Platform\MySql\Rewrite\Cte\MySqlCteShadowComposer(), $registry, $store, new \ZtdQuery\Schema\ViewDefinitionSet());
52        self::assertFalse($context->tableExists('users'));
53        $store->set('users', []);
54        self::assertTrue($context->tableExists('users'));
55        $registry->register('empty', new \ZtdQuery\Schema\TableDefinition(['code'], [], [], [], []));
56        self::assertTrue($context->tableExists('empty'));
57    }
58
59    public function testHasSchemaContext(): void
60    {
61        $store = new \ZtdQuery\Shadow\ShadowStore();
62        $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
63        $context = new TableContext(new \ZtdQuery\Platform\MySql\Rewrite\Cte\MySqlCteShadowComposer(), $registry, $store, new \ZtdQuery\Schema\ViewDefinitionSet());
64        self::assertFalse($context->hasSchemaContext());
65        $store->set('users', []);
66        self::assertTrue($context->hasSchemaContext());
67    }
68
69    public function testRequireKnownTables(): void
70    {
71        $store = new \ZtdQuery\Shadow\ShadowStore();
72        $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
73        $context = new TableContext(new \ZtdQuery\Platform\MySql\Rewrite\Cte\MySqlCteShadowComposer(), $registry, $store, new \ZtdQuery\Schema\ViewDefinitionSet());
74        $store->set('users', []);
75        $this->expectException(\ZtdQuery\Exception\UnknownSchemaException::class);
76        $this->expectExceptionMessage('missing');
77        $context->requireKnownTables('SELECT * FROM missing');
78    }
79
80}
81