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