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