Completed
Push — master ( bfc8bb...04db0e )
by Marco
20s queued 15s
created

testConvertNonTerminatedLiteral()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 3
dl 0
loc 5
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 2
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Doctrine\Tests\DBAL\Driver\OCI8;
6
7
use Doctrine\DBAL\Driver\OCI8\ConvertPositionalToNamedPlaceholders;
8
use Doctrine\DBAL\Driver\OCI8\OCI8Exception;
9
use Doctrine\Tests\DbalTestCase;
10
11
class ConvertPositionalToNamedPlaceholdersTest extends DbalTestCase
12
{
13
    /** @var ConvertPositionalToNamedPlaceholders */
14
    private $convertPositionalToNamedPlaceholders;
15
16
    protected function setUp() : void
17
    {
18
        $this->convertPositionalToNamedPlaceholders = new ConvertPositionalToNamedPlaceholders();
19
    }
20
21
    /**
22
     * @param mixed[] $expectedOutputParamsMap
23
     *
24
     * @dataProvider positionalToNamedPlaceholdersProvider
25
     */
26
    public function testConvertPositionalToNamedParameters(string $inputSQL, string $expectedOutputSQL, array $expectedOutputParamsMap) : void
27
    {
28
        [$statement, $params] = ($this->convertPositionalToNamedPlaceholders)($inputSQL);
29
30
        self::assertEquals($expectedOutputSQL, $statement);
31
        self::assertEquals($expectedOutputParamsMap, $params);
32
    }
33
34
    /**
35
     * @return mixed[][]
36
     */
37
    public static function positionalToNamedPlaceholdersProvider() : iterable
38
    {
39
        return [
40
            [
41
                'SELECT name FROM users WHERE id = ?',
42
                'SELECT name FROM users WHERE id = :param1',
43
                [1 => ':param1'],
44
            ],
45
            [
46
                'SELECT name FROM users WHERE id = ? AND status = ?',
47
                'SELECT name FROM users WHERE id = :param1 AND status = :param2',
48
                [1 => ':param1', 2 => ':param2'],
49
            ],
50
            [
51
                "UPDATE users SET name = '???', status = ?",
52
                "UPDATE users SET name = '???', status = :param1",
53
                [1 => ':param1'],
54
            ],
55
            [
56
                "UPDATE users SET status = ?, name = '???'",
57
                "UPDATE users SET status = :param1, name = '???'",
58
                [1 => ':param1'],
59
            ],
60
            [
61
                "UPDATE users SET foo = ?, name = '???', status = ?",
62
                "UPDATE users SET foo = :param1, name = '???', status = :param2",
63
                [1 => ':param1', 2 => ':param2'],
64
            ],
65
            [
66
                'UPDATE users SET name = "???", status = ?',
67
                'UPDATE users SET name = "???", status = :param1',
68
                [1 => ':param1'],
69
            ],
70
            [
71
                'UPDATE users SET status = ?, name = "???"',
72
                'UPDATE users SET status = :param1, name = "???"',
73
                [1 => ':param1'],
74
            ],
75
            [
76
                'UPDATE users SET foo = ?, name = "???", status = ?',
77
                'UPDATE users SET foo = :param1, name = "???", status = :param2',
78
                [1 => ':param1', 2 => ':param2'],
79
            ],
80
            [
81
                'SELECT * FROM users WHERE id = ? AND name = "" AND status = ?',
82
                'SELECT * FROM users WHERE id = :param1 AND name = "" AND status = :param2',
83
                [1 => ':param1', 2 => ':param2'],
84
            ],
85
            [
86
                "SELECT * FROM users WHERE id = ? AND name = '' AND status = ?",
87
                "SELECT * FROM users WHERE id = :param1 AND name = '' AND status = :param2",
88
                [1 => ':param1', 2 => ':param2'],
89
            ],
90
        ];
91
    }
92
93
    /**
94
     * @dataProvider nonTerminatedLiteralProvider
95
     */
96
    public function testConvertNonTerminatedLiteral(string $sql, string $expectedExceptionMessageRegExp) : void
97
    {
98
        $this->expectException(OCI8Exception::class);
99
        $this->expectExceptionMessageMatches($expectedExceptionMessageRegExp);
100
        ($this->convertPositionalToNamedPlaceholders)($sql);
101
    }
102
103
    /**
104
     * @return array<string, array<int, mixed>>
105
     */
106
    public static function nonTerminatedLiteralProvider() : iterable
107
    {
108
        return [
109
            'no-matching-quote' => [
110
                "SELECT 'literal FROM DUAL",
111
                '/offset 7./',
112
            ],
113
            'no-matching-double-quote' => [
114
                'SELECT 1 "COL1 FROM DUAL',
115
                '/offset 9./',
116
            ],
117
            'incorrect-escaping-syntax' => [
118
                "SELECT 'quoted \\'string' FROM DUAL",
119
                '/offset 23./',
120
            ],
121
        ];
122
    }
123
}
124