packages/ztd-query-mysql/tests/Unit/Rewrite/Transformer/Delete/TargetProjectionTest.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\TargetProjection;
10
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\MySqlIdentifierQuoter::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\Relation\ExpressionNames::class)]
13#[CoversClass(TargetProjection::class)]
14final class TargetProjectionTest extends TestCase
15{
16    public function testTargetsFromContexts(): void
17    {
18        $targets = (new TargetProjection())->targetsFromContexts(['users' => ['alias' => 'u'], 'missing' => ['alias' => 'm']], ['users' => ['columns' => ['id', 'name'], 'primaryKeys' => ['id']]]);
19        self::assertCount(1, $targets);
20        self::assertSame('users', $targets[0]->tableName());
21        self::assertSame(['id', 'name'], $targets[0]->columns());
22        self::assertSame(['id'], $targets[0]->primaryKeys());
23    }
24
25    public function testMultiTableSelectList(): void
26    {
27        $target = new \ZtdQuery\Shadow\Mutation\Row\MultiTableMutationTarget('users', ['id', 'name'], ['id']);
28        $codec = new \ZtdQuery\Shadow\Mutation\Row\MultiTableMutationRow();
29        self::assertSame('`u`.`id` AS `' . $codec->valueColumn(0, 0) . '`', (new TargetProjection())->multiTableSelectList(['users' => ['alias' => 'u']], [$target]));
30    }
31
32    public function testResolveAliasToTable(): void
33    {
34        $statement = (new \PhpMyAdmin\SqlParser\Parser('DELETE u, p FROM users u JOIN posts p ON p.uid = u.id'))->statements[0];
35        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\DeleteStatement::class, $statement);
36        $projection = new TargetProjection();
37        self::assertSame('users', $projection->resolveAliasToTable('u', $statement));
38        self::assertSame('posts', $projection->resolveAliasToTable('p', $statement));
39        self::assertSame('unknown', $projection->resolveAliasToTable('unknown', $statement));
40    }
41
42}
43