packages/ztd-query-mysql/tests/Unit/Rewrite/Transformer/Shadow/CteRowsTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite\Transformer\Shadow;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use RuntimeException;
10use ZtdQuery\Platform\MySql\Rewrite\Transformer\Shadow\CteRows;
11
12#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\Value\MySqlCastRenderer::class)]
13#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Rewrite\GeneratedColumn\MySqlGeneratedColumnProjector::class)]
14#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlIdentifierQuoter::class)]
15#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\Value\MySqlValueRenderer::class)]
16#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Rewrite\Transformer\Set\ValueNormalizer::class)]
17#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\Value\CastTypeResolver::class)]
18#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\Value\ScalarExpression::class)]
19#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\Value\StringCoercion::class)]
20#[CoversClass(CteRows::class)]
21final class CteRowsTest extends TestCase
22{
23    public function testGenerateCte(): void
24    {
25        $rows = new CteRows(new \ZtdQuery\Platform\MySql\Sql\Value\MySqlCastRenderer(), new \ZtdQuery\Platform\MySql\Rewrite\GeneratedColumn\MySqlGeneratedColumnProjector(), new \ZtdQuery\Platform\MySql\Sql\MySqlIdentifierQuoter(), new \ZtdQuery\Platform\MySql\Sql\Value\MySqlValueRenderer());
26        self::assertSame('`t` AS (SELECT CAST(1 AS SIGNED) AS `id` UNION ALL SELECT NULL AS `id`)', $rows->generateCte('t', [['id' => 1], ['id' => null]], ['id'], [], []));
27        self::assertSame('`t` AS (SELECT CAST(1 AS SIGNED) AS `id`)', $rows->generateCte('t', [['id' => 1]], [], [], []));
28    }
29
30    public function testGenerateCteRejectsUnknownEmptyColumns(): void
31    {
32        $rows = new CteRows(new \ZtdQuery\Platform\MySql\Sql\Value\MySqlCastRenderer(), new \ZtdQuery\Platform\MySql\Rewrite\GeneratedColumn\MySqlGeneratedColumnProjector(), new \ZtdQuery\Platform\MySql\Sql\MySqlIdentifierQuoter(), new \ZtdQuery\Platform\MySql\Sql\Value\MySqlValueRenderer());
33        $this->expectException(RuntimeException::class);
34        $rows->generateCte('t', [], [], [], []);
35    }
36
37    public function testWrapCte(): void
38    {
39        $rows = new CteRows(new \ZtdQuery\Platform\MySql\Sql\Value\MySqlCastRenderer(), new \ZtdQuery\Platform\MySql\Rewrite\GeneratedColumn\MySqlGeneratedColumnProjector(), new \ZtdQuery\Platform\MySql\Sql\MySqlIdentifierQuoter(), new \ZtdQuery\Platform\MySql\Sql\Value\MySqlValueRenderer());
40        self::assertSame('`t` AS (SELECT 1 AS id)', $rows->wrapCte('`t`', 'SELECT 1 AS id', ['id'], []));
41    }
42
43    public function testFormatValue(): void
44    {
45        $rows = new CteRows(new \ZtdQuery\Platform\MySql\Sql\Value\MySqlCastRenderer(), new \ZtdQuery\Platform\MySql\Rewrite\GeneratedColumn\MySqlGeneratedColumnProjector(), new \ZtdQuery\Platform\MySql\Sql\MySqlIdentifierQuoter(), new \ZtdQuery\Platform\MySql\Sql\Value\MySqlValueRenderer());
46        $type = new \ZtdQuery\Schema\ColumnDeclaration(\ZtdQuery\Schema\ColumnTypeFamily::STRING, "SET('red','blue')");
47        self::assertSame("CAST('red,blue' AS CHAR)", $rows->formatValue('blue,red,blue', $type));
48        self::assertSame('NULL', $rows->formatValue(null));
49    }
50
51    public function testEmptySelect(): void
52    {
53        $rows = new CteRows(new \ZtdQuery\Platform\MySql\Sql\Value\MySqlCastRenderer(), new \ZtdQuery\Platform\MySql\Rewrite\GeneratedColumn\MySqlGeneratedColumnProjector(), new \ZtdQuery\Platform\MySql\Sql\MySqlIdentifierQuoter(), new \ZtdQuery\Platform\MySql\Sql\Value\MySqlValueRenderer());
54        self::assertSame('SELECT CAST(NULL AS CHAR) AS `name` FROM DUAL WHERE 0', $rows->emptySelect(['name'], []));
55    }
56
57}
58