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