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