packages/ztd-query-postgres/tests/Unit/Connection/Parameter/PgSqlPdoParameterBindingCompilerTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Connection\Parameter;
6
7use PHPUnit\Framework\Attributes\CoversClass;
8use PHPUnit\Framework\Attributes\UsesClass;
9use PHPUnit\Framework\TestCase;
10use ZtdQuery\Platform\Postgres\Connection\Parameter\PgSqlPdoParameterBindingCompiler;
11use ZtdQuery\Platform\Postgres\Connection\Parameter\PgSqlPdoPlaceholderEscaper;
12
13#[CoversClass(PgSqlPdoParameterBindingCompiler::class)]
14#[UsesClass(PgSqlPdoPlaceholderEscaper::class)]
15#[UsesClass(\ZtdQuery\Platform\Postgres\Sql\PgSqlLexerProfile::class)]
16#[UsesClass(\ZtdQuery\Platform\Postgres\Connection\Parameter\EscapeCursor::class)]
17#[UsesClass(\ZtdQuery\Platform\Postgres\Connection\Parameter\OperandInput::class)]
18#[UsesClass(\ZtdQuery\Platform\Postgres\Connection\Parameter\QuotedInput::class)]
19#[UsesClass(\ZtdQuery\Platform\Postgres\Connection\Parameter\TokenBoundary::class)]
20#[UsesClass(\ZtdQuery\Platform\Postgres\Sql\Lexing\CommentSpan::class)]
21#[UsesClass(\ZtdQuery\Platform\Postgres\Sql\Lexing\QuotedSpan::class)]
22final class PgSqlPdoParameterBindingCompilerTest extends TestCase
23{
24 public function testCompileMapsNativePositionsAndEscapesPostgreSqlOperators(): void
25 {
26 $compiled = (new PgSqlPdoParameterBindingCompiler())->compile(
27 'SELECT $2, $1, $2, \'$3\' FROM docs WHERE meta ? $1 -- $4',
28 ['first', 'second'],
29 );
30
31 self::assertSame(
32 'SELECT :__ztd_pdo_2, :__ztd_pdo_1, :__ztd_pdo_2, \'$3\' FROM docs WHERE meta ?? :__ztd_pdo_1 -- $4',
33 $compiled['sql'],
34 );
35 self::assertSame(
36 ['__ztd_pdo_2' => 'second', '__ztd_pdo_1' => 'first'],
37 $compiled['params'],
38 );
39 }
40
41 public function testPreservesPdoPlaceholdersAndHandlesMissingNativeValues(): void
42 {
43 $compiler = new PgSqlPdoParameterBindingCompiler();
44
45 self::assertSame(
46 ['sql' => 'SELECT ?', 'params' => [1]],
47 $compiler->compile('SELECT ?', [1]),
48 );
49 self::assertSame(
50 ['sql' => 'SELECT $0, :__ztd_pdo_1', 'params' => ['__ztd_pdo_1' => 1]],
51 $compiler->compile('SELECT $0, $1', [1]),
52 );
53 self::assertSame(
54 ['sql' => 'SELECT :__ztd_pdo_1', 'params' => null],
55 $compiler->compile('SELECT $1', null),
56 );
57 self::assertSame(
58 ['sql' => 'SELECT ?, :__ztd_pdo_1', 'params' => ['__ztd_pdo_1' => 1]],
59 $compiler->compile('SELECT ?, $1', [1]),
60 );
61 self::assertSame(
62 ['sql' => 'SELECT $$ $1 $$, :__ztd_pdo_1', 'params' => ['__ztd_pdo_1' => 1]],
63 $compiler->compile('SELECT $$ $1 $$, $1', [1]),
64 );
65 }
66}
67