packages/ztd-query-mysql/tests/Unit/Shadow/Mutation/Table/Alter/OperationApplierTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Shadow\Mutation\Table\Alter;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use ZtdQuery\Platform\MySql\Shadow\Mutation\Table\Alter\OperationApplier;
10
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Shadow\Mutation\Table\Alter\ColumnAction::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Shadow\Mutation\Table\Alter\ColumnAlteration::class)]
13#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Shadow\Mutation\Table\Alter\ColumnDefinitionParser::class)]
14#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Shadow\Mutation\Table\Alter\PrimaryKeyAlteration::class)]
15#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Shadow\Mutation\Table\Alter\StoredColumns::class)]
16#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Shadow\Mutation\Table\Alter\UnsupportedKeyword::class)]
17#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\Alter\OptionList::class)]
18#[CoversClass(OperationApplier::class)]
19final class OperationApplierTest extends TestCase
20{
21 public function testApplyOperation(): void
22 {
23 $create = (new \PhpMyAdmin\SqlParser\Parser('CREATE TABLE t (id INT, name TEXT)'))->statements[0];
24 self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\CreateStatement::class, $create);
25 $definition = new \ZtdQuery\Schema\TableDefinition(['id', 'name'], ['id' => 'INT', 'name' => 'TEXT'], [], [], []);
26 $store = new \ZtdQuery\Shadow\ShadowStore();
27 $store->set('t', [['id' => 1, 'name' => 'old']]);
28 $alter = (new \PhpMyAdmin\SqlParser\Parser('ALTER TABLE t ADD COLUMN score INT'))->statements[0];
29 self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\AlterStatement::class, $alter);
30 self::assertNotNull($alter->altered);
31 $op = $alter->altered[0];
32 $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
33 $applier = new OperationApplier($alter, $registry, 't');
34 self::assertSame('t', $applier->applyOperation($create, $op, $store, $definition));
35 self::assertIsArray($create->fields);
36 self::assertSame(['id', 'name', 'score'], array_map(static fn ($field) => $field->name, $create->fields));
37 }
38
39 public function testApplyRenameTable(): void
40 {
41 $create = (new \PhpMyAdmin\SqlParser\Parser('CREATE TABLE t (id INT, name TEXT)'))->statements[0];
42 self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\CreateStatement::class, $create);
43 $definition = new \ZtdQuery\Schema\TableDefinition(['id', 'name'], ['id' => 'INT', 'name' => 'TEXT'], [], [], []);
44 $store = new \ZtdQuery\Shadow\ShadowStore();
45 $store->set('t', [['id' => 1, 'name' => 'old']]);
46 $alter = (new \PhpMyAdmin\SqlParser\Parser('ALTER TABLE t RENAME TO renamed'))->statements[0];
47 self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\AlterStatement::class, $alter);
48 self::assertNotNull($alter->altered);
49 $op = $alter->altered[0];
50 $registry = new \ZtdQuery\Schema\TableDefinitionRegistry();
51 $registry->register('t', $definition);
52 $applier = new OperationApplier($alter, $registry, 't');
53 $applier->applyRenameTable($op, $store);
54 self::assertSame([['id' => 1, 'name' => 'old']], $store->get('renamed'));
55 self::assertSame([], $store->get('t'));
56 self::assertSame($definition, $registry->get('renamed'));
57 self::assertFalse($registry->has('t'));
58 $empty = new \PhpMyAdmin\SqlParser\Components\AlterOperation();
59 $empty->options = new \PhpMyAdmin\SqlParser\Components\OptionsArray();
60 self::assertSame('renamed', $applier->applyOperation($create, $empty, $store, $definition));
61 }
62
63}
64