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