packages/ztd-query-postgres/tests/Unit/Rewrite/Transformer/Cte/RowSourceRendererTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite\Transformer\Cte;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9
10#[CoversClass(\ZtdQuery\Platform\Postgres\Rewrite\Transformer\Cte\RowSourceRenderer::class)]
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\Value\PgSqlCastRenderer::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Rewrite\GeneratedColumn\PgSqlGeneratedColumnProjector::class)]
13#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\PgSqlIdentifierQuoter::class)]
14#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\Value\PgSqlValueRenderer::class)]
15#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\Value\CastTypeMapper::class)]
16#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\Value\NativeCastTarget::class)]
17#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\Value\BinaryStream::class)]
18#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\Value\LiteralText::class)]
19final class RowSourceRendererTest extends TestCase
20{
21 public function testGenerateCte(): void
22 {
23 self::assertSame('"users" AS MATERIALIZED (SELECT CAST(1 AS INTEGER) AS "id", CAST(\'Ada\' AS TEXT) AS "name")', (new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\Cte\RowSourceRenderer(new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlCastRenderer(), new \ZtdQuery\Platform\Postgres\Rewrite\GeneratedColumn\PgSqlGeneratedColumnProjector(), new \ZtdQuery\Platform\Postgres\Sql\PgSqlIdentifierQuoter(), new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlValueRenderer()))->generateCte('users', [['id' => 1, 'name' => 'Ada']], ['id', 'name'], [], []));
24
25 self::assertSame('"users" AS MATERIALIZED (SELECT CAST(NULL AS INTEGER) AS "id" WHERE FALSE)', (new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\Cte\RowSourceRenderer(new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlCastRenderer(), new \ZtdQuery\Platform\Postgres\Rewrite\GeneratedColumn\PgSqlGeneratedColumnProjector(), new \ZtdQuery\Platform\Postgres\Sql\PgSqlIdentifierQuoter(), new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlValueRenderer()))->generateCte('users', [], ['id'], ['id' => new \ZtdQuery\Schema\ColumnDeclaration(\ZtdQuery\Schema\ColumnTypeFamily::INTEGER, 'INTEGER')], []));
26 }
27
28 public function testGenerateMultiRowSource(): void
29 {
30 self::assertSame('
31 SELECT * FROM (VALUES
32 (CAST(1 AS INTEGER)),
33 (CAST(2 AS INTEGER))
34 ) AS t("id")
35', (new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\Cte\RowSourceRenderer(new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlCastRenderer(), new \ZtdQuery\Platform\Postgres\Rewrite\GeneratedColumn\PgSqlGeneratedColumnProjector(), new \ZtdQuery\Platform\Postgres\Sql\PgSqlIdentifierQuoter(), new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlValueRenderer()))->generateMultiRowSource([['id' => 1], ['id' => 2]], ['id'], []));
36 }
37
38 public function testWrapCte(): void
39 {
40 self::assertSame('"users" AS MATERIALIZED (SELECT 1 AS id)', (new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\Cte\RowSourceRenderer(new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlCastRenderer(), new \ZtdQuery\Platform\Postgres\Rewrite\GeneratedColumn\PgSqlGeneratedColumnProjector(), new \ZtdQuery\Platform\Postgres\Sql\PgSqlIdentifierQuoter(), new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlValueRenderer()))->wrapCte('"users"', 'SELECT 1 AS id', ['id'], []));
41 }
42
43 public function testFormatValue(): void
44 {
45 self::assertSame('NULL', (new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\Cte\RowSourceRenderer(new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlCastRenderer(), new \ZtdQuery\Platform\Postgres\Rewrite\GeneratedColumn\PgSqlGeneratedColumnProjector(), new \ZtdQuery\Platform\Postgres\Sql\PgSqlIdentifierQuoter(), new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlValueRenderer()))->formatValue(null));
46
47 self::assertSame('TRUE', (new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\Cte\RowSourceRenderer(new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlCastRenderer(), new \ZtdQuery\Platform\Postgres\Rewrite\GeneratedColumn\PgSqlGeneratedColumnProjector(), new \ZtdQuery\Platform\Postgres\Sql\PgSqlIdentifierQuoter(), new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlValueRenderer()))->formatValue(true));
48
49 self::assertSame('CAST(\'O\'\'Reilly\' AS TEXT)', (new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\Cte\RowSourceRenderer(new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlCastRenderer(), new \ZtdQuery\Platform\Postgres\Rewrite\GeneratedColumn\PgSqlGeneratedColumnProjector(), new \ZtdQuery\Platform\Postgres\Sql\PgSqlIdentifierQuoter(), new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlValueRenderer()))->formatValue('O\'Reilly'));
50
51 self::assertSame('CAST(42 AS INTEGER)', (new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\Cte\RowSourceRenderer(new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlCastRenderer(), new \ZtdQuery\Platform\Postgres\Rewrite\GeneratedColumn\PgSqlGeneratedColumnProjector(), new \ZtdQuery\Platform\Postgres\Sql\PgSqlIdentifierQuoter(), new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlValueRenderer()))->formatValue(42));
52 }
53
54 public function testRenderFallbackNullCast(): void
55 {
56 self::assertSame('CAST(NULL AS TEXT)', (new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\Cte\RowSourceRenderer(new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlCastRenderer(), new \ZtdQuery\Platform\Postgres\Rewrite\GeneratedColumn\PgSqlGeneratedColumnProjector(), new \ZtdQuery\Platform\Postgres\Sql\PgSqlIdentifierQuoter(), new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlValueRenderer()))->renderFallbackNullCast());
57 }
58 public function testDeclaredSourceRendersEmptyTypedAndSingleRowSources(): void
59 {
60 $renderer = new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\Cte\RowSourceRenderer(new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlCastRenderer(), new \ZtdQuery\Platform\Postgres\Rewrite\GeneratedColumn\PgSqlGeneratedColumnProjector(), new \ZtdQuery\Platform\Postgres\Sql\PgSqlIdentifierQuoter(), new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlValueRenderer());
61 self::assertSame('SELECT CAST(NULL AS TEXT) AS "name" WHERE FALSE', $renderer->declaredSource([], ['name'], []));
62 self::assertSame("SELECT CAST('Ada' AS TEXT) AS \"name\"", $renderer->declaredSource([['name' => 'Ada']], ['name'], []));
63 }
64}
65