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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
<?php
/**
*
* Mock version of the PDOStatement class. Can be
* used to get a string representing a "bound" version
* of the query. Because PDO works using prepared statements,
* this can provide only a rough representation of the
* query, but this will usually be enough to check that
* your query has been built as expected.
*
*/
class DummyPDOStatement {
private $query = '';
private $input_parameters = array();
private $current_row = 1;
public function __construct($statement) {
$this->query = $statement;
}
public function execute($input_parameters=array()) {
$this->input_parameters = $input_parameters;
}
public function fetch($fetch_style) {
if ($this->current_row == 5) {
return false;
} else {
$this->current_row++;
return array('name' => 'Fred', 'age' => 10, 'id' => '1');
}
}
public function get_query() {
return $this->query;
}
public function get_parameters() {
return $this->input_parameters;
}
public function get_bound_query() {
$sql = $this->get_query();
$sql = str_replace("?", "%s", $sql);
$quoted_values = array();
$values = $this->get_parameters();
foreach ($values as $value) {
$quoted_values[] = '"' . $value . '"';
}
return vsprintf($sql, $quoted_values);
}
}
/**
*
* Mock database class implementing a subset
* of the PDO API.
*
*/
class DummyPDO {
private $last_query;
public function __construct($connection_string="") {
}
public function setAttribute($attribute, $value) {
}
public function prepare($statement) {
$this->last_query = new DummyPDOStatement($statement);
return $this->last_query;
}
public function lastInsertId() {
return 0;
}
public function get_last_query() {
return $this->last_query->get_bound_query();
}
}
/**
*
* Class to provide simple testing functionality
*
*/
class Tester {
private static $passed_tests = array();
private static $failed_tests = array();
private static $db;
private static $term_colours = array(
'BLACK' => "30",
'RED' => "31",
'GREEN' => "32",
'DEFAULT' => "00",
);
/**
* Set the dummy database connection to be
* used by the class to capture the SQL strings
*/
public static function set_db($db) {
self::$db = $db;
}
/**
* Format a line for printing. Detects
* if the script is being run from the command
* line or from a browser.
*
* Colouring code loosely based on
* http://www.zend.com//code/codex.php?ozid=1112&single=1
*/
private static function format_line($line, $colour='DEFAULT') {
if (isset($_SERVER['HTTP_USER_AGENT'])) {
$colour = strtolower($colour);
return "<p style=\"color: $colour;\">$line</p>\n";
} else {
$colour = self::$term_colours[$colour];
return chr(27) . "[0;{$colour}m{$line}" . chr(27) . "[00m\n";
}
}
/**
* Report a passed test
*/
private static function report_pass($test_name) {
echo self::format_line("PASS: $test_name", 'GREEN');
self::$passed_tests[] = $test_name;
}
/**
* Report a failed test
*/
private static function report_failure($test_name, $query) {
echo self::format_line("FAIL: $test_name", 'RED');
echo self::format_line("Expected: $query", 'RED');
echo self::format_line("Actual: " . self::$db->get_last_query(), 'RED');
self::$failed_tests[] = $test_name;
}
/**
* Print a summary of passed and failed test counts
*/
public static function report() {
$passed_count = count(self::$passed_tests);
$failed_count = count(self::$failed_tests);
echo self::format_line('');
echo self::format_line("$passed_count tests passed. $failed_count tests failed.");
if ($failed_count != 0) {
echo self::format_line("Failed tests: " . join(", ", self::$failed_tests));
}
}
/**
* Check the provided string is equal to the last
* query generated by the dummy database class.
*/
public static function check_equal($test_name, $query) {
$last_query = self::$db->get_last_query();
if ($query == self::$db->get_last_query()) {
self::report_pass($test_name);
} else {
self::report_failure($test_name, $query);
}
}
}
|