StatementTest.php 2.85 KB
Newer Older
1 2
<?php

3
namespace Doctrine\DBAL\Tests\Functional\Driver\OCI8;
4 5

use Doctrine\DBAL\Driver\OCI8\Driver;
6
use Doctrine\DBAL\Tests\FunctionalTestCase;
7

8
use function extension_loaded;
9

10
class StatementTest extends FunctionalTestCase
11
{
12
    protected function setUp(): void
13 14
    {
        if (! extension_loaded('oci8')) {
15
            self::markTestSkipped('oci8 is not installed.');
16 17 18 19
        }

        parent::setUp();

Sergei Morozov's avatar
Sergei Morozov committed
20
        if ($this->connection->getDriver() instanceof Driver) {
Sergei Morozov's avatar
Sergei Morozov committed
21
            return;
22
        }
Sergei Morozov's avatar
Sergei Morozov committed
23

24
        self::markTestSkipped('oci8 only test.');
25 26 27
    }

    /**
Sergei Morozov's avatar
Sergei Morozov committed
28 29 30
     * @param mixed[] $params
     * @param mixed[] $expected
     *
31 32
     * @dataProvider queryConversionProvider
     */
33
    public function testQueryConversion(string $query, array $params, array $expected): void
34
    {
35
        self::assertEquals(
36
            $expected,
37
            $this->connection->executeQuery($query, $params)->fetchAssociative()
38 39 40
        );
    }

41 42 43 44 45 46 47 48
    /**
     * Low-level approach to working with parameter binding
     *
     * @param mixed[] $params
     * @param mixed[] $expected
     *
     * @dataProvider queryConversionProvider
     */
49
    public function testStatementBindParameters(string $query, array $params, array $expected): void
50 51 52
    {
        self::assertEquals(
            $expected,
53 54 55
            $this->connection->prepare($query)
                ->execute($params)
                ->fetchAssociative()
56 57 58
        );
    }

59 60 61
    /**
     * @return array<string, array<int, mixed>>
     */
62
    public static function queryConversionProvider(): iterable
63
    {
Sergei Morozov's avatar
Sergei Morozov committed
64
        return [
65
            'positional' => [
66
                'SELECT ? COL1 FROM DUAL',
Sergei Morozov's avatar
Sergei Morozov committed
67 68 69
                [1],
                ['COL1' => 1],
            ],
70 71 72 73 74
            'named' => [
                'SELECT :COL COL1 FROM DUAL',
                [':COL' => 1],
                ['COL1' => 1],
            ],
Sergei Morozov's avatar
Sergei Morozov committed
75
            'literal-with-placeholder' => [
76
                "SELECT '?' COL1, ? COL2 FROM DUAL",
Sergei Morozov's avatar
Sergei Morozov committed
77 78
                [2],
                [
79 80
                    'COL1' => '?',
                    'COL2' => 2,
Sergei Morozov's avatar
Sergei Morozov committed
81 82 83
                ],
            ],
            'literal-with-quotes' => [
84
                "SELECT ? COL1, '?\"?''?' \"COL?\" FROM DUAL",
Sergei Morozov's avatar
Sergei Morozov committed
85 86
                [3],
                [
87 88
                    'COL1' => 3,
                    'COL?' => '?"?\'?',
Sergei Morozov's avatar
Sergei Morozov committed
89 90 91
                ],
            ],
            'placeholder-at-the-end' => [
92
                'SELECT ? COL1 FROM DUAL WHERE 1 = ?',
Sergei Morozov's avatar
Sergei Morozov committed
93 94 95 96
                [4, 1],
                ['COL1' => 4],
            ],
            'multi-line-literal' => [
97 98
                "SELECT 'Hello,
World?!' COL1 FROM DUAL WHERE 1 = ?",
Sergei Morozov's avatar
Sergei Morozov committed
99 100
                [1],
                [
101 102
                    'COL1' => 'Hello,
World?!',
Sergei Morozov's avatar
Sergei Morozov committed
103 104 105
                ],
            ],
            'empty-literal' => [
106
                "SELECT '' COL1 FROM DUAL",
Sergei Morozov's avatar
Sergei Morozov committed
107 108 109 110
                [],
                ['COL1' => ''],
            ],
        ];
111 112
    }
}