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