packages/ztd-query-postgres/tests/Unit/Sql/Statement/StatementClassifierTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Sql\Statement;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\TestCase;
9
10#[CoversClass(\ZtdQuery\Platform\Postgres\Sql\Statement\StatementClassifier::class)]
11#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\PostgreSqlLexicalMasker::class)]
12#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\Lexing\CommentSpan::class)]
13#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\Lexing\QuotedSpan::class)]
14#[\PHPUnit\Framework\Attributes\UsesClass(\ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::class)]
15final class StatementClassifierTest extends TestCase
16{
17    public function testClassifyWithStatement(): void
18    {
19        self::assertSame('SELECT', (new \ZtdQuery\Platform\Postgres\Sql\Statement\StatementClassifier())->classifyWithStatement('WITH selected AS (SELECT 1) SELECT * FROM selected'));
20
21        self::assertSame(null, (new \ZtdQuery\Platform\Postgres\Sql\Statement\StatementClassifier())->classifyWithStatement('WITH broken'));
22    }
23
24    public function testClassifySimpleStatement(): void
25    {
26        self::assertSame('UPDATE', (new \ZtdQuery\Platform\Postgres\Sql\Statement\StatementClassifier())->classifySimpleStatement('UPDATE users SET id = 1'));
27
28        self::assertSame(null, (new \ZtdQuery\Platform\Postgres\Sql\Statement\StatementClassifier())->classifySimpleStatement('VACUUM users'));
29    }
30    public function testKeywordAtHonorsWordBoundaries(): void
31    {
32        $classification = new \ZtdQuery\Platform\Postgres\Sql\Statement\StatementClassifier();
33        self::assertSame(['keyword' => 'SELECT', 'end' => 6], $classification->keywordAt('SELECT *', 0));
34        self::assertNull($classification->keywordAt('xSELECT', 1));
35        self::assertSame(['keyword' => null, 'end' => 6], $classification->keywordAt('VACUUM', 0));
36    }
37
38    public function testClassifyStatementSkipsCommentsBeforeWith(): void
39    {
40        $parser = new \ZtdQuery\Platform\Postgres\Sql\Statement\StatementClassifier();
41        self::assertSame('SELECT', $parser->classifyStatement('/* lead */ WITH selected AS (SELECT 1) SELECT * FROM selected'));
42        self::assertSame(null, $parser->classifyStatement('VACUUM users'));
43    }
44}
45