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