packages/ztd-query-mysql/tests/Unit/Rewrite/Transformer/Insert/InsertTargetTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Rewrite\Transformer\Insert;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Platform\MySql\Rewrite\Transformer\Insert\InsertTarget;
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\InsertRowRenderer::class)]
14#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Rewrite\Transformer\InsertSelectRenderer::class)]
15#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Rewrite\Transformer\Insert\ResultProjection::class)]
16#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Rewrite\Transformer\MySqlSelectListAliaser::class)]
17#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Rewrite\Transformer\Select\ExpressionAliaser::class)]
18#[CoversClass(InsertTarget::class)]
19final class InsertTargetTest extends TestCase
20{
21    public function testFromStatement(): void
22    {
23        $statement = (new \PhpMyAdmin\SqlParser\Parser("INSERT INTO t (name) VALUES ('new')"))->statements[0];
24        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\InsertStatement::class, $statement);
25        $target = InsertTarget::fromStatement($statement, ['t' => [
26            'rows' => [['id' => 7, 'name' => 'old', 'ignored' => null, 'float' => 1.5]],
27            'columns' => ['id', 'name'], 'columnTypes' => [], 'columnDefaults' => ['name' => "'default'"],
28            'identityStrategies' => ['id' => \ZtdQuery\Schema\Key\IdentityGenerationStrategy::MaxValue],
29            'candidateKeys' => ['PRIMARY' => ['id']],
30        ]], $statement->build());
31        self::assertSame('t', $target->tableName);
32        self::assertSame(['id', 'name'], $target->tableColumns);
33        self::assertSame(['name'], $target->insertColumns);
34        self::assertSame([['id' => 7, 'name' => 'old']], $target->existingRows);
35        self::assertSame(['name' => "'default'"], $target->columnDefaults);
36        self::assertSame(['id' => \ZtdQuery\Schema\Key\IdentityGenerationStrategy::MaxValue], $target->identityStrategies);
37        self::assertSame(['PRIMARY' => ['id']], $target->candidateKeys);
38    }
39
40    public function testFromStatementRejectsUnknownColumns(): void
41    {
42        $statement = (new \PhpMyAdmin\SqlParser\Parser('INSERT INTO t VALUES (1)'))->statements[0];
43        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\InsertStatement::class, $statement);
44        $this->expectException(\ZtdQuery\Exception\UnsupportedSqlException::class);
45        InsertTarget::fromStatement($statement, [], $statement->build());
46    }
47
48}
49