packages/ztd-query-postgres/tests/Unit/Schema/View/PgSqlViewDefinitionParserTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Schema\View;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Platform\Postgres\Schema\View\PgSqlViewDefinitionParser;
11use ZtdQuery\Platform\Postgres\Sql\Relation\PgSqlSelectRelationParser;
12
13#[CoversClass(PgSqlViewDefinitionParser::class)]
14#[UsesClass(PgSqlSelectRelationParser::class)]
15#[UsesClass(\ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::class)]
16#[UsesClass(\ZtdQuery\Platform\Postgres\Sql\Relation\FromClause::class)]
17#[UsesClass(\ZtdQuery\Platform\Postgres\Sql\Relation\RelationReference::class)]
18final class PgSqlViewDefinitionParserTest extends TestCase
19{
20    public function testFromQueryParsesAQueryUsingPostgreSqlRelationRules(): void
21    {
22        $definition = (new PgSqlViewDefinitionParser())->fromQuery(
23            " SELECT u.id FROM public.\"users\" u JOIN roles r ON r.id = u.role_id; \n",
24        );
25
26        self::assertSame('SELECT u.id FROM public."users" u JOIN roles r ON r.id = u.role_id', $definition->query);
27        self::assertSame(['users', 'roles'], $definition->dependencies);
28    }
29
30    public function testFromCreateStatementExtractsTheQueryFromAPostgreSqlCreateViewStatement(): void
31    {
32        $definition = (new PgSqlViewDefinitionParser())->fromCreateStatement(
33            'CREATE OR REPLACE VIEW "active_users" AS SELECT * FROM "users" WHERE active = TRUE;',
34        );
35
36        self::assertNotNull($definition);
37        self::assertSame('SELECT * FROM "users" WHERE active = TRUE', $definition->query);
38        self::assertNull((new PgSqlViewDefinitionParser())->fromCreateStatement('CREATE VIEW invalid AS   '));
39    }
40}
41