packages/ztd-query-mysql/tests/Unit/Shadow/Mutation/Table/Alter/ColumnActionTest.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\ColumnAction;
10
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Shadow\Mutation\Table\Alter\UnsupportedKeyword::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\MySql\Sql\Alter\OptionList::class)]
13#[CoversClass(ColumnAction::class)]
14final class ColumnActionTest extends TestCase
15{
16    public function testDetectCase1(): void
17    {
18        $operation = 'ADD COLUMN name TEXT';
19        $expected = 'add';
20        $alter = (new \PhpMyAdmin\SqlParser\Parser('ALTER TABLE t ' . $operation))->statements[0];
21        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\AlterStatement::class, $alter);
22        self::assertNotNull($alter->altered);
23        $op = $alter->altered[0];
24        self::assertSame($expected, (new ColumnAction())->detect($op));
25    }
26
27    public function testDetectCase2(): void
28    {
29        $operation = 'ADD name TEXT';
30        $expected = 'add';
31        $alter = (new \PhpMyAdmin\SqlParser\Parser('ALTER TABLE t ' . $operation))->statements[0];
32        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\AlterStatement::class, $alter);
33        self::assertNotNull($alter->altered);
34        $op = $alter->altered[0];
35        self::assertSame($expected, (new ColumnAction())->detect($op));
36    }
37
38    public function testDetectCase3(): void
39    {
40        $operation = 'DROP COLUMN name';
41        $expected = 'drop';
42        $alter = (new \PhpMyAdmin\SqlParser\Parser('ALTER TABLE t ' . $operation))->statements[0];
43        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\AlterStatement::class, $alter);
44        self::assertNotNull($alter->altered);
45        $op = $alter->altered[0];
46        self::assertSame($expected, (new ColumnAction())->detect($op));
47    }
48
49    public function testDetectCase4(): void
50    {
51        $operation = 'DROP name';
52        $expected = 'drop';
53        $alter = (new \PhpMyAdmin\SqlParser\Parser('ALTER TABLE t ' . $operation))->statements[0];
54        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\AlterStatement::class, $alter);
55        self::assertNotNull($alter->altered);
56        $op = $alter->altered[0];
57        self::assertSame($expected, (new ColumnAction())->detect($op));
58    }
59
60    public function testDetectCase5(): void
61    {
62        $operation = 'MODIFY COLUMN name VARCHAR(20)';
63        $expected = 'modify';
64        $alter = (new \PhpMyAdmin\SqlParser\Parser('ALTER TABLE t ' . $operation))->statements[0];
65        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\AlterStatement::class, $alter);
66        self::assertNotNull($alter->altered);
67        $op = $alter->altered[0];
68        self::assertSame($expected, (new ColumnAction())->detect($op));
69    }
70
71    public function testDetectCase6(): void
72    {
73        $operation = 'CHANGE COLUMN name label TEXT';
74        $expected = 'change';
75        $alter = (new \PhpMyAdmin\SqlParser\Parser('ALTER TABLE t ' . $operation))->statements[0];
76        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\AlterStatement::class, $alter);
77        self::assertNotNull($alter->altered);
78        $op = $alter->altered[0];
79        self::assertSame($expected, (new ColumnAction())->detect($op));
80    }
81
82    public function testDetectCase7(): void
83    {
84        $operation = 'ADD PRIMARY KEY (id)';
85        $expected = null;
86        $alter = (new \PhpMyAdmin\SqlParser\Parser('ALTER TABLE t ' . $operation))->statements[0];
87        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\AlterStatement::class, $alter);
88        self::assertNotNull($alter->altered);
89        $op = $alter->altered[0];
90        self::assertSame($expected, (new ColumnAction())->detect($op));
91    }
92
93    public function testDetectCase8(): void
94    {
95        $operation = 'DROP PRIMARY KEY';
96        $expected = null;
97        $alter = (new \PhpMyAdmin\SqlParser\Parser('ALTER TABLE t ' . $operation))->statements[0];
98        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\AlterStatement::class, $alter);
99        self::assertNotNull($alter->altered);
100        $op = $alter->altered[0];
101        self::assertSame($expected, (new ColumnAction())->detect($op));
102    }
103
104}
105