Completed
Push — master ( 3e735a...f37a88 )
by Sergei
19s queued 14s
created

StatementTest::testStatementBindParameters()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 5
dl 0
loc 8
rs 10
c 1
b 0
f 0
cc 1
nc 1
nop 3
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\Tests\DBAL\Functional\Driver\OCI8;
6
7
use Doctrine\DBAL\Driver\OCI8\Driver;
8
use Doctrine\Tests\DbalFunctionalTestCase;
9
use function extension_loaded;
10
11
class StatementTest extends DbalFunctionalTestCase
12
{
13
    protected function setUp() : void
14
    {
15
        if (! extension_loaded('oci8')) {
16
            $this->markTestSkipped('oci8 is not installed.');
17
        }
18
19
        parent::setUp();
20
21
        if ($this->connection->getDriver() instanceof Driver) {
22
            return;
23
        }
24
25
        $this->markTestSkipped('oci8 only test.');
26
    }
27
28
    /**
29
     * @param mixed[] $params
30
     * @param mixed[] $expected
31
     *
32
     * @dataProvider queryConversionProvider
33
     */
34
    public function testQueryConversion(string $query, array $params, array $expected) : void
35
    {
36
        self::assertEquals(
37
            $expected,
38
            $this->connection->executeQuery($query, $params)->fetch()
39
        );
40
    }
41
42
    /**
43
     * Low-level approach to working with parameter binding
44
     *
45
     * @param mixed[] $params
46
     * @param mixed[] $expected
47
     *
48
     * @dataProvider queryConversionProvider
49
     */
50
    public function testStatementBindParameters(string $query, array $params, array $expected) : void
51
    {
52
        $stmt = $this->connection->prepare($query);
53
        $stmt->execute($params);
54
55
        self::assertEquals(
56
            $expected,
57
            $stmt->fetch()
58
        );
59
    }
60
61
    /**
62
     * @return array<string, array<int, mixed>>
63
     */
64
    public static function queryConversionProvider() : iterable
65
    {
66
        return [
67
            'positional' => [
68
                'SELECT ? COL1 FROM DUAL',
69
                [1],
70
                ['COL1' => 1],
71
            ],
72
            'named' => [
73
                'SELECT :COL COL1 FROM DUAL',
74
                [':COL' => 1],
75
                ['COL1' => 1],
76
            ],
77
            'literal-with-placeholder' => [
78
                "SELECT '?' COL1, ? COL2 FROM DUAL",
79
                [2],
80
                [
81
                    'COL1' => '?',
82
                    'COL2' => 2,
83
                ],
84
            ],
85
            'literal-with-quotes' => [
86
                "SELECT ? COL1, '?\"?''?' \"COL?\" FROM DUAL",
87
                [3],
88
                [
89
                    'COL1' => 3,
90
                    'COL?' => '?"?\'?',
91
                ],
92
            ],
93
            'placeholder-at-the-end' => [
94
                'SELECT ? COL1 FROM DUAL WHERE 1 = ?',
95
                [4, 1],
96
                ['COL1' => 4],
97
            ],
98
            'multi-line-literal' => [
99
                "SELECT 'Hello,
100
World?!' COL1 FROM DUAL WHERE 1 = ?",
101
                [1],
102
                [
103
                    'COL1' => 'Hello,
104
World?!',
105
                ],
106
            ],
107
            'empty-literal' => [
108
                "SELECT '' COL1 FROM DUAL",
109
                [],
110
                ['COL1' => ''],
111
            ],
112
        ];
113
    }
114
}
115