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