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