packages/sql-fixture/tests/Unit/Platform/Sqlite/Schema/DefinitionListTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Platform\Sqlite\Schema;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9use SqlFixture\Platform\Sqlite\Schema\DefinitionList as Subject;
10
11#[CoversClass(Subject::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\Sqlite\Schema\ColumnParser::class)]
13#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\Sqlite\Schema\DefaultExpression::class)]
14#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Platform\Sqlite\Schema\TypeDeclaration::class)]
15#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\ColumnDefinition::class)]
16#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\DefinitionSegments::class)]
17#[\PHPUnit\Framework\Attributes\UsesClass(\SqlFixture\Schema\TypeShape::class)]
18final class DefinitionListTest extends TestCase
19{
20 public function testSplitColumnDefinitionsKeepsNestedAndQuotedCommas(): void
21 {
22 self::assertSame(['id INT', "label TEXT DEFAULT 'a,b'", 'amount NUMERIC(8, 2)'], (new Subject())->splitColumnDefinitions("id INT, label TEXT DEFAULT 'a,b', amount NUMERIC(8, 2)"));
23 }
24
25 public function testIsTableConstraintRecognizesNamedAndUnnamedConstraints(): void
26 {
27 self::assertTrue((new Subject())->isTableConstraint('CONSTRAINT pk PRIMARY KEY (id)'));
28 self::assertTrue((new Subject())->isTableConstraint('FOREIGN KEY (id) REFERENCES a(id)'));
29 self::assertFalse((new Subject())->isTableConstraint('id INT NOT NULL'));
30 }
31
32 public function testParseColumnsExcludesTableConstraints(): void
33 {
34 $columns = (new Subject())->parseColumns('id INT, name TEXT, PRIMARY KEY (id)', 'a', ['id']);
35 self::assertSame(['id', 'name'], array_keys($columns));
36 self::assertFalse($columns['id']->nullable);
37 }
38}
39