-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDatabaseTest.php
130 lines (105 loc) · 4.98 KB
/
DatabaseTest.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<?php
namespace FpDbTest;
use Exception;
use FpDbTest\QueryTemplate\InvalidTemplateSyntaxException;
class DatabaseTest
{
private DatabaseInterface $db;
public function __construct(DatabaseInterface $db)
{
$this->db = $db;
}
public function testBuildQuery(): void
{
$results = [];
$results[] = $this->db->buildQuery('SELECT name FROM users WHERE user_id = 1');
$results[] = $this->db->buildQuery(
'SELECT * FROM users WHERE name = ? AND block = 0',
['Jack']
);
$results[] = $this->db->buildQuery(
'SELECT ?# FROM users WHERE user_id = ?d AND block = ?d',
[['name', 'email'], 2, true]
);
$results[] = $this->db->buildQuery(
'UPDATE users SET ?a WHERE user_id = -1',
[['name' => 'Jack', 'email' => null]]
);
foreach ([null, true] as $block) {
$results[] = $this->db->buildQuery(
'SELECT name FROM users WHERE ?# IN (?a){ AND block = ?d}',
['user_id', [1, 2, 3], $block ?? $this->db->skip()]
);
}
$results[] = $this->db->buildQuery('SELECT name FROM users WHERE user_id = ?1', [10]);
$results[] = $this->db->buildQuery(
'SELECT name FROM users WHERE user_id = ? AND ?>balance',
[10, 0.0000001]
);
$results[] = $this->db->buildQuery(
'SELECT name FROM users WHERE name = ? AND comment = ?',
["O'Neil", '"{Quoted text}"']
);
$correct = [
'SELECT name FROM users WHERE user_id = 1',
'SELECT * FROM users WHERE name = \'Jack\' AND block = 0',
'SELECT `name`, `email` FROM users WHERE user_id = 2 AND block = 1',
'UPDATE users SET `name` = \'Jack\', `email` = NULL WHERE user_id = -1',
'SELECT name FROM users WHERE `user_id` IN (1, 2, 3)',
'SELECT name FROM users WHERE `user_id` IN (1, 2, 3) AND block = 1',
'SELECT name FROM users WHERE user_id = 101',
sprintf('SELECT name FROM users WHERE user_id = 10 AND %s>balance', 0.0000001),
'SELECT name FROM users WHERE name = \'O\\\'Neil\' AND comment = \'"{Quoted text}"\'',
];
if ($results !== $correct) {
print_r($results);
print_r($correct);
throw new Exception('Failure.');
}
try {
$this->db->buildQuery('SELECT * FROM users WHERE name = ? { AND block = 0');
} catch (InvalidTemplateSyntaxException $x) {
echo sprintf('TEST OK: `%s` exception caught when passed unclosed condition' . PHP_EOL, $x->getMessage());
}
try {
$this->db->buildQuery('SELECT * FROM users WHERE name = ? AND block = 0}');
} catch (InvalidTemplateSyntaxException $x) {
echo sprintf('TEST OK: `%s` exception caught when passed unexpected condition close bracket' . PHP_EOL, $x->getMessage());
}
try {
$this->db->buildQuery('SELECT * FROM users WHERE name = ? AND block = 0', [$this->db->skip()]);
} catch (InvalidTemplateSyntaxException $x) {
echo sprintf('TEST OK: `%s` exception caught when passed skip outside of condition' . PHP_EOL, $x->getMessage());
}
try {
$this->db->buildQuery('SELECT * FROM users WHERE name = ? AND status = ?', ['Bob']);
} catch (InvalidTemplateSyntaxException $x) {
echo sprintf('TEST OK: `%s` exception caught when passed placeholder without value' . PHP_EOL, $x->getMessage());
}
try {
$this->db->buildQuery('SELECT * FROM users WHERE name = ?', [['Bob']]);
} catch (\InvalidArgumentException $x) {
echo sprintf('TEST OK: `%s` exception caught when passed array to scalar placeholder' . PHP_EOL, $x->getMessage());
}
try {
$this->db->buildQuery('SELECT * FROM users WHERE name = ?a', ['Bob']);
} catch (\InvalidArgumentException $x) {
sprintf('TEST OK: `%s` exception caught when passed string to array placeholder' . PHP_EOL, $x->getMessage());
}
try {
echo $this->db->buildQuery('SELECT * FROM users WHERE name = ?a', [[['Bob', 'Alice']]]);
} catch (\InvalidArgumentException $x) {
sprintf('TEST OK: `%s` exception caught when passed array as an element for array placeholder' . PHP_EOL, $x->getMessage());
}
try {
$this->db->buildQuery('SELECT * FROM users WHERE name = ?d', ['z']);
} catch (\InvalidArgumentException $x) {
echo sprintf('TEST OK: `%s` exception caught when passed string to int placeholder' . PHP_EOL, $x->getMessage());
}
try {
$this->db->buildQuery('SELECT * FROM users WHERE name = ?f', ['z']);
} catch (\InvalidArgumentException $x) {
echo sprintf('TEST OK: `%s` exception caught when passed string to float placeholder' . PHP_EOL, $x->getMessage());
}
}
}