packages/ztd-query-sqlite/tests/Unit/Schema/Create/TableBodyParserTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Schema\Create;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Platform\Sqlite\Schema\Create\TableBodyParser;
11
12#[CoversClass(TableBodyParser::class)]
13#[UsesClass(\ZtdQuery\Platform\Sqlite\Sql\Lexing\ExpressionSpan::class)]
14#[UsesClass(\ZtdQuery\Platform\Sqlite\Sql\Lexing\QuotedSpan::class)]
15#[UsesClass(\ZtdQuery\Platform\Sqlite\Sql\SqliteLexerProfile::class)]
16final class TableBodyParserTest extends TestCase
17{
18    public function testTableBodyValidatesFramingAndOptions(): void
19    {
20        $parser = new TableBodyParser();
21        self::assertSame('id INTEGER, name TEXT DEFAULT \'a)\'', $parser->tableBody("CREATE TABLE users(id INTEGER, name TEXT DEFAULT 'a)') STRICT;"));
22        self::assertNull($parser->tableBody('CREATE VIEW users AS SELECT 1'));
23        self::assertNull($parser->tableBody('CREATE TABLE users (id INTEGER'));
24        self::assertNull($parser->tableBody('CREATE TABLE users(id INTEGER) trailing'));
25    }
26
27    public function testHasValidTableOptionsRejectsDuplicatesAndTrailingCommas(): void
28    {
29        self::assertTrue(TableBodyParser::hasValidTableOptions(''));
30        self::assertTrue(TableBodyParser::hasValidTableOptions(' STRICT, WITHOUT ROWID;'));
31        self::assertTrue(TableBodyParser::hasValidTableOptions(' WITHOUT ROWID, STRICT'));
32        self::assertFalse(TableBodyParser::hasValidTableOptions(' STRICT, STRICT'));
33        self::assertFalse(TableBodyParser::hasValidTableOptions(' WITHOUT ROWID, WITHOUT ROWID'));
34        self::assertFalse(TableBodyParser::hasValidTableOptions(' STRICT,'));
35        self::assertFalse(TableBodyParser::hasValidTableOptions(' STRICT WITHOUT ROWID'));
36        self::assertFalse(TableBodyParser::hasValidTableOptions(' WITHOUT'));
37    }
38
39    public function testHasWithoutRowidRequiresTopLevelOption(): void
40    {
41        self::assertTrue(TableBodyParser::hasWithoutRowid('CREATE TABLE users(id INTEGER) WITHOUT ROWID'));
42        self::assertFalse(TableBodyParser::hasWithoutRowid("CREATE TABLE users(name TEXT DEFAULT 'WITHOUT ROWID')"));
43        self::assertFalse(TableBodyParser::hasWithoutRowid('CREATE TABLE users(id INTEGER) WITHOUT thing'));
44    }
45
46    public function testSplitColumnDefinitionsPreservesExpressionCommas(): void
47    {
48        self::assertSame(['id INTEGER', 'amount DECIMAL(10,2)', "name TEXT DEFAULT 'a,b'"], (new TableBodyParser())->splitColumnDefinitions("id INTEGER, amount DECIMAL(10,2), name TEXT DEFAULT 'a,b'"));
49        self::assertSame([], (new TableBodyParser())->splitColumnDefinitions(''));
50        self::assertSame(['id INTEGER'], (new TableBodyParser())->splitColumnDefinitions('id INTEGER, '));
51    }
52
53}
54