packages/ztd-query-mysql/tests/Unit/Rewrite/Transformer/Delete/ResultSelectTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite\Transformer\Delete;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Platform\MySql\Rewrite\Transformer\Delete\ResultSelect;
10
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\Dml\DmlWhereClauseExtractor::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlIdentifierQuoter::class)]
13#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlLexerProfile::class)]
14#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\Relation\ExpressionNames::class)]
15#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Rewrite\Transformer\Delete\TargetProjection::class)]
16#[CoversClass(ResultSelect::class)]
17final class ResultSelectTest extends TestCase
18{
19 public function testBuildProjection(): void
20 {
21 $statement = (new \PhpMyAdmin\SqlParser\Parser('DELETE FROM users WHERE id = 1 ORDER BY id DESC LIMIT 2'))->statements[0];
22 self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\DeleteStatement::class, $statement);
23 self::assertSame(['sql' => 'SELECT `users`.`id` AS `id` FROM users WHERE id = 1 ORDER BY id DESC LIMIT 0, 2', 'table' => 'users', 'tables' => ['users' => ['alias' => 'users']]], (new ResultSelect())->buildProjection($statement, 'DELETE FROM users WHERE id = 1 ORDER BY id DESC LIMIT 2', ['id']));
24 }
25
26 public function testPrimaryTarget(): void
27 {
28 $statement = (new \PhpMyAdmin\SqlParser\Parser('DELETE u, p FROM users u JOIN posts p ON p.uid = u.id'))->statements[0];
29 self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\DeleteStatement::class, $statement);
30 self::assertSame(['table' => 'users', 'alias' => 'u', 'aliases' => ['u' => 'u', 'p' => 'p']], (new ResultSelect())->primaryTarget($statement));
31 }
32
33 public function testNamedTarget(): void
34 {
35 $statement = (new \PhpMyAdmin\SqlParser\Parser('DELETE u, p FROM users u JOIN posts p ON p.uid = u.id'))->statements[0];
36 self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\DeleteStatement::class, $statement);
37 $projection = new ResultSelect();
38 self::assertSame('users', $projection->namedTarget($statement, 'u'));
39 self::assertSame('posts', $projection->namedTarget($statement, 'p'));
40 self::assertSame('unknown', $projection->namedTarget($statement, 'missing'));
41 }
42
43 public function testSourceClause(): void
44 {
45 $statement = (new \PhpMyAdmin\SqlParser\Parser('DELETE u, p FROM users u JOIN posts p ON p.uid = u.id'))->statements[0];
46 self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\DeleteStatement::class, $statement);
47 self::assertSame(' FROM users AS `u` JOIN posts AS `p` ON p.uid = u.id', (new ResultSelect())->sourceClause($statement));
48 }
49
50 public function testSuffix(): void
51 {
52 $statement = (new \PhpMyAdmin\SqlParser\Parser('DELETE FROM users WHERE id = 1 ORDER BY id DESC LIMIT 2'))->statements[0];
53 self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\DeleteStatement::class, $statement);
54 self::assertSame(' WHERE id = 1 ORDER BY id DESC LIMIT 0, 2', (new ResultSelect())->suffix($statement, 'DELETE FROM users WHERE id = 1 ORDER BY id DESC LIMIT 2'));
55 }
56
57 public function testSelectList(): void
58 {
59 $projection = new ResultSelect();
60 self::assertSame('`u`.`id` AS `id`, `u`.`name` AS `name`', $projection->selectList('u', ['id', 'name']));
61 self::assertSame('`u`.*', $projection->selectList('u', []));
62 }
63
64 public function testResolvedTables(): void
65 {
66 $statement = (new \PhpMyAdmin\SqlParser\Parser('DELETE u, p FROM users u JOIN posts p ON p.uid = u.id'))->statements[0];
67 self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\DeleteStatement::class, $statement);
68 self::assertSame(['users' => ['alias' => 'u'], 'posts' => ['alias' => 'p']], (new ResultSelect())->resolvedTables($statement, ['table' => 'users', 'alias' => 'u', 'aliases' => ['u' => 'u', 'p' => 'p']]));
69 }
70
71}
72