packages/ztd-query-sqlite/tests/Unit/Connection/Parameter/SqlitePdoParameterBindingCompilerTest.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\Sqlite\Connection\Parameter\SqlitePdoParameterBindingCompiler;
11use ZtdQuery\Platform\Sqlite\Sql\Value\SqliteCastRenderer;
12
13#[CoversClass(SqlitePdoParameterBindingCompiler::class)]
14#[UsesClass(\ZtdQuery\Platform\Sqlite\Connection\Parameter\ParameterReplacements::class)]
15#[UsesClass(\ZtdQuery\Platform\Sqlite\Sql\Value\CastTypeMapper::class)]
16#[UsesClass(SqliteCastRenderer::class)]
17#[UsesClass(\ZtdQuery\Platform\Sqlite\Sql\SqliteLexerProfile::class)]
18final class SqlitePdoParameterBindingCompilerTest extends TestCase
19{
20    public function testCompileUsesSqliteRendererForStorageSensitiveParameterTypes(): void
21    {
22        $compiled = (new SqlitePdoParameterBindingCompiler())->compile(
23            'SELECT ?, ?, :ratio, :integer, :enabled, \'?\', "?"',
24            [0 => 12, 1 => 2.5, 'ratio' => 2.5, ':integer' => 9, 'enabled' => true],
25        );
26
27        self::assertSame(
28            'SELECT CAST(? AS INTEGER), CAST(? AS REAL), CAST(:ratio AS REAL), CAST(:integer AS INTEGER), CAST(:enabled AS INTEGER), \'?\', "?"',
29            $compiled['sql'],
30        );
31    }
32
33    public function testLeavesNullAndUnboundParametersUnchanged(): void
34    {
35        $compiler = new SqlitePdoParameterBindingCompiler();
36
37        self::assertSame(
38            ['sql' => 'SELECT ?, :missing', 'params' => null],
39            $compiler->compile('SELECT ?, :missing', null),
40        );
41        self::assertSame(
42            ['sql' => 'SELECT ?, :missing', 'params' => []],
43            $compiler->compile('SELECT ?, :missing', []),
44        );
45        self::assertSame(
46            ['sql' => 'SELECT :missing, CAST(:value AS INTEGER)', 'params' => ['value' => 7]],
47            $compiler->compile('SELECT :missing, :value', ['value' => 7]),
48        );
49    }
50
51    public function testLeavesBoundValuesWithoutStorageSensitiveTypesUnchanged(): void
52    {
53        $params = [null, 'text', []];
54
55        self::assertSame(
56            ['sql' => 'SELECT ?, ?, ?', 'params' => $params],
57            (new SqlitePdoParameterBindingCompiler())->compile('SELECT ?, ?, ?', $params),
58        );
59    }
60}
61