packages/ztd-query-postgres/tests/Unit/Rewrite/Transformer/Insert/ExpressionCastTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite\Transformer\Insert;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9
10#[CoversClass(\ZtdQuery\Platform\Postgres\Rewrite\Transformer\Insert\ExpressionCast::class)]
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\Value\PgSqlCastRenderer::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\Value\CastTypeMapper::class)]
13#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\Value\NativeCastTarget::class)]
14final class ExpressionCastTest extends TestCase
15{
16    public function testCastInsertExpression(): void
17    {
18        self::assertSame('CAST(COALESCE(NULLIF(CAST(? AS TEXT), \'\'), \'false\') AS BOOLEAN)', (new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\Insert\ExpressionCast(new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlCastRenderer()))->castInsertExpression('?', new \ZtdQuery\Schema\ColumnDeclaration(\ZtdQuery\Schema\ColumnTypeFamily::BOOLEAN, 'BOOLEAN')));
19
20        self::assertSame('CAST(1 AS INTEGER)', (new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\Insert\ExpressionCast(new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlCastRenderer()))->castInsertExpression('1', new \ZtdQuery\Schema\ColumnDeclaration(\ZtdQuery\Schema\ColumnTypeFamily::INTEGER, 'INTEGER')));
21    }
22    public function testProjectionCastsDeclaredColumnsAndPreservesRawExpressions(): void
23    {
24        $cast = new \ZtdQuery\Platform\Postgres\Rewrite\Transformer\Insert\ExpressionCast(new \ZtdQuery\Platform\Postgres\Sql\Value\PgSqlCastRenderer());
25        self::assertSame('SELECT CAST(1 AS INTEGER) AS "id", NOW() AS "created_at"', $cast->projection(['id' => '1', 'created_at' => 'NOW()'], ['id' => new \ZtdQuery\Schema\ColumnDeclaration(\ZtdQuery\Schema\ColumnTypeFamily::INTEGER, 'INTEGER')]));
26    }
27}
28