Passed
Push — main ( 2b5ece...48a507 )
by Peter
02:13
created

ExprTest::constructExceptionsProvider()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 5
nc 1
nop 0
dl 0
loc 7
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare(strict_types=1);
4
5
namespace QB\Generic\Expr;
6
7
use InvalidArgumentException;
8
use PDO;
9
use PHPUnit\Framework\TestCase;
10
11
class ExprTest extends TestCase
12
{
13
    /**
14
     * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
15
     *
16
     * @return array[]
17
     */
18
    public function successProvider(): array
19
    {
20
        return [
21
            'param-unnamed-auto-null'       => [
22
                'foo = ?',
23
                [null],
24
                Expr::PARAM_ALL_AUTO,
25
                'foo = ?',
26
                [[null, PDO::PARAM_NULL]],
27
            ],
28
            'param-unnamed-auto-int'        => ['foo = ?', [2], Expr::PARAM_ALL_AUTO, 'foo = ?', [[2, PDO::PARAM_INT]]],
29
            'param-unnamed-auto-false'      => [
30
                'foo = ?',
31
                [false],
32
                Expr::PARAM_ALL_AUTO,
33
                'foo = ?',
34
                [[false, PDO::PARAM_BOOL]],
35
            ],
36
            'param-unnamed-auto-true'       => [
37
                'foo = ?',
38
                [true],
39
                Expr::PARAM_ALL_AUTO,
40
                'foo = ?',
41
                [[true, PDO::PARAM_BOOL]],
42
            ],
43
            'param-unnamed-auto-str'        => [
44
                'foo = ?',
45
                ['bar'],
46
                Expr::PARAM_ALL_AUTO,
47
                'foo = ?',
48
                [['bar', PDO::PARAM_STR]],
49
            ],
50
            'param-unnamed-str'             => [
51
                'foo = ?',
52
                [2],
53
                Expr::PARAM_ALL_STRING,
54
                'foo = ?',
55
                [[2, PDO::PARAM_STR]],
56
            ],
57
            'param-unnamed-manual'          => [
58
                'foo = ?',
59
                [[2, PDO::PARAM_BOOL]],
60
                Expr::PARAM_ALL_MANUAL,
61
                'foo = ?',
62
                [[2, PDO::PARAM_BOOL]],
63
            ],
64
            'param-named-auto'              => [
65
                'foo = :foo',
66
                ['foo' => 2],
67
                Expr::PARAM_ALL_AUTO,
68
                'foo = :foo',
69
                ['foo' => [2, PDO::PARAM_INT]],
70
            ],
71
            'param-named-str'               => [
72
                'foo = :foo',
73
                ['foo' => 2],
74
                Expr::PARAM_ALL_STRING,
75
                'foo = :foo',
76
                ['foo' => [2, PDO::PARAM_STR]],
77
            ],
78
            'param-named-manual'            => [
79
                'foo = :foo',
80
                ['foo' => [2, PDO::PARAM_BOOL]],
81
                Expr::PARAM_ALL_MANUAL,
82
                'foo = :foo',
83
                ['foo' => [2, PDO::PARAM_BOOL]],
84
            ],
85
            'unnamed-extend-auto-simple'    => [
86
                'foo IN (?)',
87
                [['bar', 'baz']],
88
                Expr::PARAM_ALL_AUTO,
89
                'foo IN (?, ?)',
90
                [['bar', PDO::PARAM_STR], ['baz', PDO::PARAM_STR]],
91
            ],
92
            'unnamed-extend-auto-end'       => [
93
                'foo IN (?',
94
                [['bar', 'baz']],
95
                Expr::PARAM_ALL_AUTO,
96
                'foo IN (?, ?',
97
                [['bar', PDO::PARAM_STR], ['baz', PDO::PARAM_STR]],
98
            ],
99
            'unnamed-extend-auto-beginning' => [
100
                '?)',
101
                [['bar', 'baz']],
102
                Expr::PARAM_ALL_AUTO,
103
                '?, ?)',
104
                [['bar', PDO::PARAM_STR], ['baz', PDO::PARAM_STR]],
105
            ],
106
            'unnamed-extend-auto-complex'   => [
107
                'foo IN (?) AND bar = ? AND baz IN (?)',
108
                [['bar', 'baz'], 'quix', [17, 34]],
109
                Expr::PARAM_ALL_AUTO,
110
                'foo IN (?, ?) AND bar = ? AND baz IN (?, ?)',
111
                [
112
                    ['bar', PDO::PARAM_STR],
113
                    ['baz', PDO::PARAM_STR],
114
                    ['quix', PDO::PARAM_STR],
115
                    [17, PDO::PARAM_INT],
116
                    [34, PDO::PARAM_INT],
117
                ],
118
            ],
119
            'unnamed-extend-manual-complex' => [
120
                'foo IN (?) AND bar = ? AND baz IN (?)',
121
                [
122
                    [['bar', PDO::PARAM_STR], ['baz', PDO::PARAM_STR]],
123
                    ['quix', PDO::PARAM_STR],
124
                    [[17, PDO::PARAM_INT], [34, PDO::PARAM_STR]],
125
                ],
126
                Expr::PARAM_ALL_MANUAL,
127
                'foo IN (?, ?) AND bar = ? AND baz IN (?, ?)',
128
                [
129
                    ['bar', PDO::PARAM_STR],
130
                    ['baz', PDO::PARAM_STR],
131
                    ['quix', PDO::PARAM_STR],
132
                    [17, PDO::PARAM_INT],
133
                    [34, PDO::PARAM_STR],
134
                ],
135
            ],
136
            'unnamed-extend-str-complex'    => [
137
                'foo IN (?) AND bar = ? AND baz IN (?)',
138
                [['bar', 'baz'], 'quix', [17, 34]],
139
                Expr::PARAM_ALL_STRING,
140
                'foo IN (?, ?) AND bar = ? AND baz IN (?, ?)',
141
                [
142
                    ['bar', PDO::PARAM_STR],
143
                    ['baz', PDO::PARAM_STR],
144
                    ['quix', PDO::PARAM_STR],
145
                    [17, PDO::PARAM_STR],
146
                    [34, PDO::PARAM_STR],
147
                ],
148
            ],
149
            'named-extend-auto-simple'      => [
150
                'foo IN (:foo)',
151
                ['foo' => ['bar', 'baz']],
152
                Expr::PARAM_ALL_AUTO,
153
                'foo IN (:foo_0, :foo_1)',
154
                ['foo_0' => ['bar', PDO::PARAM_STR], 'foo_1' => ['baz', PDO::PARAM_STR]],
155
            ],
156
            'named-extend-auto-end'         => [
157
                'foo IN (:foo',
158
                ['foo' => ['bar', 'baz']],
159
                Expr::PARAM_ALL_AUTO,
160
                'foo IN (:foo_0, :foo_1',
161
                ['foo_0' => ['bar', PDO::PARAM_STR], 'foo_1' => ['baz', PDO::PARAM_STR]],
162
            ],
163
            'named-extend-auto-beginning'   => [
164
                ':foo)',
165
                ['foo' => ['bar', 'baz']],
166
                Expr::PARAM_ALL_AUTO,
167
                ':foo_0, :foo_1)',
168
                ['foo_0' => ['bar', PDO::PARAM_STR], 'foo_1' => ['baz', PDO::PARAM_STR]],
169
            ],
170
            'named-extend-auto-complex'     => [
171
                'foo IN (:foo) AND bar = :bar AND baz IN (:baz)',
172
                ['foo' => ['bar', 'baz'], 'bar' => 'quix', 'baz' => [17, 34]],
173
                Expr::PARAM_ALL_AUTO,
174
                'foo IN (:foo_0, :foo_1) AND bar = :bar AND baz IN (:baz_0, :baz_1)',
175
                [
176
                    'foo_0' => ['bar', PDO::PARAM_STR],
177
                    'foo_1' => ['baz', PDO::PARAM_STR],
178
                    'bar' => ['quix', PDO::PARAM_STR],
179
                    'baz_0' => [17, PDO::PARAM_INT],
180
                    'baz_1' => [34, PDO::PARAM_INT],
181
                ],
182
            ],
183
            'named-extend-manual-complex'   => [
184
                'foo IN (:foo) AND bar = :bar AND baz IN (:baz)',
185
                [
186
                    'foo' => [['bar', PDO::PARAM_STR], ['baz', PDO::PARAM_STR]],
187
                    'bar' => ['quix', PDO::PARAM_STR],
188
                    'baz' => [[17, PDO::PARAM_INT], [34, PDO::PARAM_STR]],
189
                ],
190
                Expr::PARAM_ALL_MANUAL,
191
                'foo IN (:foo_0, :foo_1) AND bar = :bar AND baz IN (:baz_0, :baz_1)',
192
                [
193
                    'foo_0' => ['bar', PDO::PARAM_STR],
194
                    'foo_1' => ['baz', PDO::PARAM_STR],
195
                    'bar' => ['quix', PDO::PARAM_STR],
196
                    'baz_0' => [17, PDO::PARAM_INT],
197
                    'baz_1' => [34, PDO::PARAM_STR],
198
                ],
199
            ],
200
            'named-extend-str-complex'      => [
201
                'foo IN (:foo) AND bar = :bar AND baz IN (:baz)',
202
                ['foo' => ['bar', 'baz'], 'bar' => 'quix', 'baz' => [17, 34]],
203
                Expr::PARAM_ALL_STRING,
204
                'foo IN (:foo_0, :foo_1) AND bar = :bar AND baz IN (:baz_0, :baz_1)',
205
                [
206
                    'foo_0' => ['bar', PDO::PARAM_STR],
207
                    'foo_1' => ['baz', PDO::PARAM_STR],
208
                    'bar' => ['quix', PDO::PARAM_STR],
209
                    'baz_0' => [17, PDO::PARAM_STR],
210
                    'baz_1' => [34, PDO::PARAM_STR],
211
                ],
212
            ],
213
        ];
214
    }
215
216
    /**
217
     * @dataProvider successProvider
218
     *
219
     * @param string $sql
220
     * @param array  $params
221
     * @param int    $paramHandle
222
     * @param string $expectedSql
223
     * @param array  $expectedParams
224
     */
225
    public function testSuccess(
226
        string $sql,
227
        array $params,
228
        int $paramHandle,
229
        string $expectedSql,
230
        array $expectedParams
231
    ) {
232
        $sut = $this->createSut($sql, $params, $paramHandle);
233
234
        $this->assertSame($expectedSql, (string)$sut);
235
        $this->assertSame($expectedParams, $sut->getParams());
236
    }
237
238
    public function constructExceptionsProvider(): array
239
    {
240
        return [
241
            'object parameter'                  => ['foo = ?', [new \stdClass()], Expr::PARAM_ALL_AUTO],
242
            'invalid parameter handling'        => ['foo', [0 => null], 123],
243
            'string parameter key not expected' => ['foo', [0 => null, 'foo' => null], 123],
244
            'int parameter key not expected'    => ['foo', [1 => null], 123],
245
        ];
246
    }
247
248
    /**
249
     * @dataProvider constructExceptionsProvider
250
     *
251
     * @param string $sql
252
     * @param array  $params
253
     * @param int    $paramHandle
254
     */
255
    public function testConstructExceptions(string $sql, array $params, int $paramHandle)
256
    {
257
        $this->expectException(InvalidArgumentException::class);
258
259
        $this->createSut($sql, $params, $paramHandle);
260
    }
261
262
    /**
263
     * @param string $sql
264
     * @param array  $params
265
     * @param int    $paramHandle
266
     *
267
     * @return Expr
268
     */
269
    protected function createSut(string $sql, array $params, int $paramHandle): Expr
270
    {
271
        return new Expr($sql, $params, $paramHandle);
272
    }
273
}
274