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