packages/ztd-query-postgres/tests/Unit/Schema/Definition/TableBodyTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Schema\Definition;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9
10#[CoversClass(\ZtdQuery\Platform\Postgres\Schema\Definition\TableBody::class)]
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\Lexing\QuotedSpan::class)]
13final class TableBodyTest extends TestCase
14{
15    public function testTableBody(): void
16    {
17        self::assertSame('id INT, name TEXT', (new \ZtdQuery\Platform\Postgres\Schema\Definition\TableBody())->tableBody('CREATE TABLE users (id INT, name TEXT)'));
18    }
19
20    public function testQualifiedIdentifierAt(): void
21    {
22        $sql = 'public."Users"';
23        $stream = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create());
24        $tokens = $stream->significantTokens();
25
26        self::assertSame(['name' => 'Users', 'next' => 3], (new \ZtdQuery\Platform\Postgres\Schema\Definition\TableBody())->qualifiedIdentifierAt($stream, $tokens, 0));
27    }
28
29    public function testIsSymbol(): void
30    {
31        $sql = '(id)';
32        $stream = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create());
33        $tokens = $stream->significantTokens();
34
35        self::assertSame(true, (new \ZtdQuery\Platform\Postgres\Schema\Definition\TableBody())->isSymbol($tokens[0], '('));
36    }
37
38    public function testSplitTableBody(): void
39    {
40        self::assertSame(['id NUMERIC(10,2)', 'name TEXT', 'PRIMARY KEY (id, name)'], (new \ZtdQuery\Platform\Postgres\Schema\Definition\TableBody())->splitTableBody('id NUMERIC(10,2), name TEXT, PRIMARY KEY (id, name)'));
41    }
42    public function testOpeningParenthesisFollowsTheQualifiedTableName(): void
43    {
44        $sql = 'CREATE TABLE IF NOT EXISTS public.users (id INT)';
45        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
46        $stream = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create());
47        $open = (new \ZtdQuery\Platform\Postgres\Schema\Definition\TableBody())->openingParenthesis($stream, $tokens);
48        self::assertNotNull($open);
49        self::assertSame('(', $open->text);
50        self::assertSame('(id INT)', substr($sql, $open->offset));
51    }
52
53    public function testSkipExistenceGuardRequiresTheWholeKeywordSequence(): void
54    {
55        $sql = 'IF NOT EXISTS users';
56        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
57        $body = new \ZtdQuery\Platform\Postgres\Schema\Definition\TableBody();
58        self::assertSame(3, $body->skipExistenceGuard($tokens, 0));
59        self::assertNull($body->skipExistenceGuard(array_slice($tokens, 0, 2), 0));
60    }
61}
62