packages/sql-fixture/tests/Unit/Platform/MySql/Schema/DefaultExpressionTest.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\DefaultExpression as Subject;
10
11#[CoversClass(Subject::class)]
12final class DefaultExpressionTest extends TestCase
13{
14 public function testExtractDefaultReadsNativeDefaultOptions(): void
15 {
16 $sql = 'CREATE TABLE users (id INT NOT NULL PRIMARY KEY, amount DECIMAL(8, 2) UNSIGNED DEFAULT 12.5)';
17 $parser = new \PhpMyAdmin\SqlParser\Parser($sql);
18 $statement = $parser->statements[0];
19 self::assertInstanceOf(\PhpMyAdmin\SqlParser\Statements\CreateStatement::class, $statement);
20 self::assertIsArray($statement->fields);
21 self::assertSame(12.5, (new Subject())->extractDefault($statement->fields[1]->options));
22 self::assertNull((new Subject())->extractDefault(null));
23 }
24
25 #[\PHPUnit\Framework\Attributes\DataProvider('providerDefaultValues')]
26 public function testExtractDefaultDistinguishesLiteralsFromSqlExpressions(string $input, int|float|bool|string|null $expected): void
27 {
28 $options = new \PhpMyAdmin\SqlParser\Components\OptionsArray([['name' => 'DEFAULT', 'value' => $input]]);
29 self::assertSame($expected, (new Subject())->extractDefault($options));
30 }
31
32 /**
33 * @return list<array{string, int|float|bool|string|null}>
34 */
35 public static function providerDefaultValues(): array
36 {
37 return [
38 ["'line\nbreak'", "line\nbreak"],
39 ["(concat('a','b'))", "(concat('a','b'))"],
40 ['CURRENT_TIMESTAMP', 'CURRENT_TIMESTAMP'],
41 ['false', false],
42 ['NULL', null],
43 ];
44 }
45}
46