packages/ztd-query-mysql/tests/Unit/Shadow/Mutation/Table/Alter/ColumnDefinitionParserTest.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\ColumnDefinitionParser;
10
11#[CoversClass(ColumnDefinitionParser::class)]
12final class ColumnDefinitionParserTest extends TestCase
13{
14    public function testBuildColumnDefinition(): void
15    {
16        $alter = (new \PhpMyAdmin\SqlParser\Parser('ALTER TABLE t ADD COLUMN name VARCHAR(20) NOT NULL'))->statements[0];
17        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\AlterStatement::class, $alter);
18        self::assertNotNull($alter->altered);
19        $op = $alter->altered[0];
20        $column = (new ColumnDefinitionParser())->buildColumnDefinition($op);
21        self::assertNotNull($column);
22        self::assertSame('name', $column->name);
23        self::assertNotNull($column->type);
24        self::assertSame('VARCHAR', $column->type->name);
25        self::assertSame(['20'], $column->type->parameters);
26    }
27
28    public function testBuildColumnDefinitionFromUnknown(): void
29    {
30        $alter = (new \PhpMyAdmin\SqlParser\Parser('ALTER TABLE t CHANGE COLUMN name label TEXT'))->statements[0];
31        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\AlterStatement::class, $alter);
32        self::assertNotNull($alter->altered);
33        $op = $alter->altered[0];
34        $column = (new ColumnDefinitionParser())->buildColumnDefinitionFromUnknown($op);
35        self::assertNotNull($column);
36        self::assertSame('label', $column->name);
37        self::assertNotNull($column->type);
38        self::assertSame('TEXT', $column->type->name);
39    }
40
41    public function testGetColumnName(): void
42    {
43        $alter = (new \PhpMyAdmin\SqlParser\Parser('ALTER TABLE t DROP COLUMN `name`'))->statements[0];
44        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\AlterStatement::class, $alter);
45        self::assertNotNull($alter->altered);
46        $op = $alter->altered[0];
47        self::assertSame('name', (new ColumnDefinitionParser())->getColumnName($op));
48        self::assertNull((new ColumnDefinitionParser())->getColumnName(new \PhpMyAdmin\SqlParser\Components\AlterOperation()));
49    }
50
51}
52