packages/sql-fixture/tests/Unit/Platform/PostgreSql/Schema/DefaultExpressionTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Platform\PostgreSql\Schema;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use SqlFixture\Platform\PostgreSql\Schema\DefaultExpression as Subject;
10
11#[CoversClass(Subject::class)]
12final class DefaultExpressionTest extends TestCase
13{
14    public function testExtractDefaultDistinguishesLiteralsAndExpressions(): void
15    {
16        $defaults = new Subject();
17        self::assertSame(12, $defaults->extractDefault('INT DEFAULT 12 NOT NULL'));
18        self::assertSame(12.5, $defaults->extractDefault('NUMERIC DEFAULT 12.5'));
19        self::assertSame('ready', $defaults->extractDefault("TEXT DEFAULT 'ready'"));
20        self::assertTrue($defaults->extractDefault('BOOLEAN DEFAULT TRUE'));
21        self::assertNull($defaults->extractDefault('TEXT DEFAULT NULL'));
22        self::assertSame('(1 + 2)', $defaults->extractDefault('INT DEFAULT (1 + 2)'));
23        self::assertNull($defaults->extractDefault('TEXT'));
24    }
25    #[\PHPUnit\Framework\Attributes\DataProvider('providerDefaultClauses')]
26    public function testExtractDefaultInterpretsLiteralKinds(string $clause, int|float|bool|string|null $expected): void
27    {
28        self::assertSame($expected, (new Subject())->extractDefault($clause));
29    }
30
31    /**
32     * @return list<array{string, int|float|bool|string|null}>
33     */
34    public static function providerDefaultClauses(): array
35    {
36        return [
37            ['BOOLEAN default false', false],
38            ['BOOLEAN DEFAULT tRuE NOT NULL', true],
39            ['TEXT DEFAULT nUlL', null],
40            ['INT DEFAULT -12 CHECK (id > 0)', -12],
41            ['DECIMAL DEFAULT -12.5 NOT NULL', -12.5],
42            ['NUMERIC DEFAULT 1e3', 1000],
43            ["TEXT DEFAULT 'a::b' UNIQUE", 'a::b'],
44            ["TEXT DEFAULT 'line\nvalue'", "line\nvalue"],
45            ["TEXT DEFAULT ''", ''],
46            ['TIMESTAMP DEFAULT CURRENT_TIMESTAMP', 'CURRENT_TIMESTAMP'],
47            ['TIMESTAMP DEFAULT now()', 'now()'],
48            ['INT DEFAULT (2 + 3)', '(2 + 3)'],
49            ['TEXT', null],
50            ["TEXT DEFAULT 'open'::text", "'open'::text"],
51            ['INT DEFAULT 1', 1],
52            ['INT DEFAULT 0', 0],
53        ];
54    }
55}
56