packages/ztd-query-postgres/tests/Unit/Rewrite/GeneratedColumn/PgSqlGeneratedColumnProjectorTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite\GeneratedColumn;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Platform\Postgres\Rewrite\GeneratedColumn\PgSqlGeneratedColumnProjector;
11
12#[CoversClass(PgSqlGeneratedColumnProjector::class)]
13#[UsesClass(\ZtdQuery\Platform\Postgres\Sql\PgSqlIdentifierQuoter::class)]
14final class PgSqlGeneratedColumnProjectorTest extends TestCase
15{
16    public function testReturnsSourceUnchangedWithoutGeneratedExpressions(): void
17    {
18        self::assertSame(
19            'SELECT 1 AS "id"',
20            (new PgSqlGeneratedColumnProjector())->project('SELECT 1 AS "id"', ['id'], []),
21        );
22    }
23
24    public function testProjectsGeneratedExpressionsOverBaseRows(): void
25    {
26        self::assertSame(
27            'SELECT "__ztd_generated_source"."qty" AS "qty", '
28            . '"__ztd_generated_source"."unit_price" AS "unit_price", '
29            . '(qty * unit_price) AS "total" '
30            . 'FROM (SELECT 5 AS "qty", 10 AS "unit_price", NULL AS "total") AS "__ztd_generated_source"',
31            (new PgSqlGeneratedColumnProjector())->project(
32                'SELECT 5 AS "qty", 10 AS "unit_price", NULL AS "total"',
33                ['qty', 'unit_price', 'total'],
34                ['total' => '(qty * unit_price)'],
35            ),
36        );
37    }
38}
39