Completed
Push — 2.10 ( 39b76b...400f60 )
by Sergei
30s queued 15s
created

StatementTest   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 100
Duplicated Lines 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 6
eloc 40
dl 0
loc 100
rs 10
c 1
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A testQueryConversion() 0 5 1
A setUp() 0 13 3
A testStatementBindParameters() 0 8 1
A queryConversionProvider() 0 47 1
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