packages/ztd-query-mysql/tests/Unit/Rewrite/GeneratedColumn/MySqlGeneratedColumnProjectorTest.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\MySql\Rewrite\GeneratedColumn\MySqlGeneratedColumnProjector;
11
12#[CoversClass(MySqlGeneratedColumnProjector::class)]
13#[UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlIdentifierQuoter::class)]
14final class MySqlGeneratedColumnProjectorTest extends TestCase
15{
16    public function testReturnsSourceUnchangedWithoutGeneratedExpressions(): void
17    {
18        self::assertSame(
19            'SELECT 1 AS `id`',
20            (new MySqlGeneratedColumnProjector())->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 MySqlGeneratedColumnProjector())->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