packages/ztd-query-postgres/tests/Unit/Sql/Relation/FromClauseTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql\Relation;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9
10#[CoversClass(\ZtdQuery\Platform\Postgres\Sql\Relation\FromClause::class)]
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\Relation\RelationReference::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::class)]
13final class FromClauseTest extends TestCase
14{
15    public function testReferencesFromClause(): void
16    {
17        self::assertSame([['name' => 'users', 'start' => 0, 'unqualifiedStart' => 0, 'end' => 5], ['name' => 'orders', 'start' => 13, 'unqualifiedStart' => 13, 'end' => 19]], (new \ZtdQuery\Platform\Postgres\Sql\Relation\FromClause())->referencesFromClause('users u JOIN orders o ON u.id = o.user_id'));
18    }
19
20    public function testFindFromEnd(): void
21    {
22        $sql = 'SELECT * FROM users u JOIN orders o ON u.id = o.user_id WHERE u.id = 1';
23        $stream = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create());
24        $tokens = $stream->significantTokens();
25
26        self::assertSame(56, (new \ZtdQuery\Platform\Postgres\Sql\Relation\FromClause())->findFromEnd($sql, $tokens, $tokens[2]));
27    }
28
29    public function testMatchesKeywordSequence(): void
30    {
31        $sql = 'LEFT JOIN users';
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\Sql\Relation\FromClause())->matchesKeywordSequence($tokens, 0, ['LEFT', 'JOIN']));
36    }
37    public function testParenthesizedReferencesRebasesJoinedRelationOffsets(): void
38    {
39        $sql = '(users JOIN orders ON users.id = orders.user_id)';
40        $tokens = \ZtdQuery\Sql\SqlTokenStream::tokenize($sql, \ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::create())->significantTokens();
41        $references = (new \ZtdQuery\Platform\Postgres\Sql\Relation\FromClause())->parenthesizedReferences($sql, $tokens, 0, $tokens[0]);
42        self::assertSame(['users', 'orders'], array_column($references, 'name'));
43        self::assertSame(1, $references[0]['start']);
44        self::assertSame(6, $references[0]['end']);
45        self::assertSame(12, $references[1]['start']);
46        self::assertSame(18, $references[1]['end']);
47    }
48}
49