packages/sql-fixture/tests/Unit/Platform/MySql/Schema/ColumnParserTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Platform\MySql\Schema;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use SqlFixture\Platform\MySql\Schema\ColumnParser as Subject;
10
11#[CoversClass(Subject::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\MySql\Schema\DefaultExpression::class)]
13#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\MySql\Schema\TypeParameters::class)]
14#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\ColumnDefinition::class)]
15#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\TypeShape::class)]
16final class ColumnParserTest extends TestCase
17{
18    public function testParseColumnDefinitionPreservesFlagsAndDimensions(): void
19    {
20        $sql = 'CREATE TABLE users (id INT NOT NULL PRIMARY KEY, amount DECIMAL(8, 2) UNSIGNED DEFAULT 12.5)';
21        $parser = new \PhpMyAdmin\SqlParser\Parser($sql);
22        $statement = $parser->statements[0];
23        self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\CreateStatement::class, $statement);
24        self::assertIsArray($statement->fields);
25        $column = (new Subject())->parseColumnDefinition($statement->fields[1], 'amount', []);
26        self::assertNotNull($column);
27        self::assertSame('DECIMAL', $column->type);
28        self::assertTrue($column->unsigned);
29        self::assertSame(8, $column->precision);
30        self::assertSame(2, $column->scale);
31        self::assertSame(12.5, $column->default);
32    }
33}
34