packages/ztd-query-mysql/tests/Unit/Rewrite/Transformer/Update/ResultSelectTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite\Transformer\Update;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Platform\MySql\Rewrite\Transformer\Update\ResultSelect;
10
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlIdentifierQuoter::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::class)]
13#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Rewrite\Transformer\Update\TargetProjection::class)]
14#[CoversClass(ResultSelect::class)]
15final class ResultSelectTest extends TestCase
16{
17 public function testBuildProjection(): void
18 {
19 $statement = (new \PhpMyAdmin\SqlParser\Parser('UPDATE users u SET name = 7 WHERE id = 1'))->statements[0];
20 self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\UpdateStatement::class, $statement);
21 self::assertSame(['sql' => 'SELECT 7 AS `name`, `u`.`id` FROM `users` AS u WHERE id = 1', 'table' => 'users', 'tables' => ['users' => ['alias' => 'u']]], (new ResultSelect())->buildProjection($statement, ['id', 'name']));
22 }
23
24 public function testTargetTables(): void
25 {
26 $statement = (new \PhpMyAdmin\SqlParser\Parser('UPDATE users u, posts p SET u.name = 7, p.title = 8'))->statements[0];
27 self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\UpdateStatement::class, $statement);
28 self::assertSame(['users' => ['alias' => 'u'], 'posts' => ['alias' => 'p']], (new ResultSelect())->targetTables($statement));
29 }
30
31 public function testSelectColumns(): void
32 {
33 $statement = (new \PhpMyAdmin\SqlParser\Parser('UPDATE users u SET name = 7 WHERE id = 1'))->statements[0];
34 self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\UpdateStatement::class, $statement);
35 $identity = new \ZtdQuery\Shadow\Mutation\MutationRowIdentity();
36 self::assertSame(['9 AS `name`', '`u`.`id`', '`u`.`id` AS `' . $identity->column('id') . '`'], (new ResultSelect())->selectColumns($statement, ['id', 'name'], ['id'], 'u', ['9']));
37 }
38
39 public function testBuildQuery(): void
40 {
41 $statement = (new \PhpMyAdmin\SqlParser\Parser('UPDATE users u SET name = 7 WHERE id = 1'))->statements[0];
42 self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\UpdateStatement::class, $statement);
43 self::assertNotNull($statement->tables);
44 self::assertSame('SELECT * FROM custom_source WHERE id > 2', (new ResultSelect())->buildQuery($statement, [], $statement->tables[0], 'users', 'u', 'id > 2', 'custom_source'));
45 }
46
47}
48