packages/ztd-query-sqlite/tests/Unit/Rewrite/Context/TableContextBuilderTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite\Context;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use stdClass;
11use ZtdQuery\Platform\Sqlite\Rewrite\Context\TableContextBuilder;
12use ZtdQuery\Schema\TableDefinition;
13use ZtdQuery\Schema\TableDefinitionRegistry;
14use ZtdQuery\Schema\ViewDefinition;
15use ZtdQuery\Schema\ViewDefinitionSet;
16
17#[CoversClass(TableContextBuilder::class)]
18#[UsesClass(\ZtdQuery\Platform\Sqlite\Sql\Relation\RelationSourceParser::class)]
19#[UsesClass(\ZtdQuery\Platform\Sqlite\Sql\SqliteLexerProfile::class)]
20#[UsesClass(\ZtdQuery\Platform\Sqlite\Sql\Relation\SqliteSelectRelationParser::class)]
21#[UsesClass(\ZtdQuery\Platform\Sqlite\Rewrite\View\SqliteViewShadowRenderer::class)]
22final class TableContextBuilderTest extends TestCase
23{
24 public function testBuildTableContextCombinesFixturesDefinitionsAndViews(): void
25 {
26 $registry = new TableDefinitionRegistry();
27 $definition = new TableDefinition(['id'], ['id' => 'INTEGER'], ['id'], [], []);
28 $registry->register('known', $definition);
29 $registry->register('empty', $definition);
30 $registry->register('removed', $definition);
31 $registry->markRemoved('removed');
32 $views = new ViewDefinitionSet();
33 $views->register('visible', new ViewDefinition('SELECT * FROM known', ['known']));
34 $views->register('known', new ViewDefinition('SELECT 99', []));
35 $context = (new TableContextBuilder($registry, ['known' => [['id' => 1]], 'inferred' => [['a' => 'x'], ['b' => 'y']]], $views))->buildTableContext();
36 self::assertSame([['id' => 1]], $context['known']['rows'] ?? null);
37 self::assertSame(['a', 'b'], $context['inferred']['columns'] ?? null);
38 self::assertSame([], $context['empty']['rows'] ?? null);
39 self::assertSame([], $context['removed']['rows'] ?? null);
40 self::assertSame('SELECT * FROM known', $context['visible']['viewSql'] ?? null);
41 }
42
43 public function testContextFromDefinitionPreservesValuesWithoutCoercion(): void
44 {
45 $object = new stdClass();
46 $definition = new TableDefinition(['value'], ['value' => 'TEXT'], [], [], [], columnDefaults: ['value' => "'x'"]);
47 $context = TableContextBuilder::contextFromDefinition($definition, [['value' => $object]]);
48 self::assertSame($object, $context['rows'][0]['value']);
49 self::assertSame(['value' => "'x'"], $context['columnDefaults']);
50 self::assertSame(['value'], $context['columns']);
51 }
52
53 public function testColumnsFromRowsPreservesFirstSeenOrder(): void
54 {
55 self::assertSame(['b', 'a', 'c'], TableContextBuilder::columnsFromRows([['b' => 1, 'a' => 2], ['c' => 3, 'a' => 4]]));
56 self::assertSame([], TableContextBuilder::columnsFromRows([]));
57 }
58
59}
60