weekly release 1.9.12+
[moodle.git] / lib / simpletest / testdmllib.php
blob9934e88adfc3a66cb05f8ca7b2d227509784b45a
1 <?php
2 /**
3 * Unit tests for (some of) ../datalib.php.
5 * @copyright &copy; 2006 The Open University
6 * @author T.J.Hunt@open.ac.uk
7 * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
8 * @package moodlecore
9 */
11 if (!defined('MOODLE_INTERNAL')) {
12 die('Direct access to this script is forbidden.'); /// It must be included from a Moodle page
15 require_once($CFG->libdir . '/simpletestlib/web_tester.php');
16 require_once($CFG->libdir . '/dmllib.php');
18 class dmllib_test extends prefix_changing_test_case {
19 var $table = 'table';
20 var $data = array(
21 array('id', 'textfield', 'numberfield'),
22 array( 1, 'frog', 101),
23 array( 2, 'toad', 102),
24 array( 3, 'tadpole', 103),
25 array( 4, 'tadpole', 104),
26 array( 5, 'nothing', NULL),
28 var $objects = array();
30 function setUp() {
31 global $CFG, $db;
32 parent::setUp();
33 load_test_table($CFG->prefix . $this->table, $this->data, $db);
34 $keys = reset($this->data);
35 foreach ($this->data as $row=>$datum) {
36 if ($row == 0) {
37 continue;
39 $this->objects[$datum[0]] = (object) array_combine($keys, $datum);
43 function tearDown() {
44 global $CFG, $db;
45 remove_test_table($CFG->prefix . $this->table, $db);
46 parent::tearDown();
49 function test_where_clause() {
50 $this->assertEqual(where_clause('f1', 'v1'), "WHERE f1 = 'v1'");
51 $this->assertEqual(where_clause('f1', 'v1', 'f2', 2), "WHERE f1 = 'v1' AND f2 = '2'");
52 $this->assertEqual(where_clause('f1', 'v1', 'f2', 1.75, 'f3', 'v3'), "WHERE f1 = 'v1' AND f2 = '1.75' AND f3 = 'v3'");
53 $this->assertEqual(where_clause('f1', NULL), "WHERE f1 IS NULL");
56 function test_record_exists() {
57 $this->assertTrue(record_exists($this->table, 'numberfield', 101, 'id', 1));
58 $this->assertFalse(record_exists($this->table, 'numberfield', 102, 'id', 1));
59 $this->assertTrue(record_exists($this->table, 'numberfield', NULL));
62 function test_record_exists_select() {
63 $this->assertTrue(record_exists_select($this->table, 'numberfield = 101 AND id = 1'));
64 $this->assertFalse(record_exists_select($this->table, 'numberfield = 102 AND id = 1'));
65 $this->assertTrue(record_exists_select($this->table, 'numberfield IS NULL'));
68 function test_record_exists_sql() {
69 global $CFG;
70 $this->assertTrue(record_exists_sql("SELECT * FROM {$CFG->prefix}$this->table WHERE numberfield = 101 AND id = 1"));
71 $this->assertFalse(record_exists_sql("SELECT * FROM {$CFG->prefix}$this->table WHERE numberfield = 102 AND id = 1"));
72 $this->assertTrue(record_exists_sql("SELECT * FROM {$CFG->prefix}$this->table WHERE numberfield IS NULL"));
76 function test_get_record() {
77 // Get particular records.
78 $this->assert(new CheckSpecifiedFieldsExpectation($this->objects[1]), get_record($this->table, 'id', 1));
79 $this->assert(new CheckSpecifiedFieldsExpectation($this->objects[3]), get_record($this->table, 'textfield', 'tadpole', 'numberfield', 103));
80 $this->assert(new CheckSpecifiedFieldsExpectation($this->objects[5]), get_record($this->table, 'numberfield', null));
82 // Abiguous get attempt, should return one, and print a warning in debug mode.
83 global $CFG;
84 $old_debug = $CFG->debug;
85 $CFG->debug = 0;
87 ob_start();
88 $record = get_record($this->table, 'textfield', 'tadpole');
89 $result = ob_get_contents();
90 ob_end_clean();
91 $this->assertEqual('', $result, '%s (No error ouside debug mode).');
93 $CFG->debug = DEBUG_DEVELOPER;
94 ob_start();
95 $record = get_record($this->table, 'textfield', 'tadpole');
96 $result = ob_get_contents();
97 ob_end_clean();
98 $this->assert(new TextExpectation('Error:'), $result, 'Error in debug mode.');
100 $CFG->debug = $old_debug;
102 // Return only specified fields
103 $expected = new stdClass;
104 $expected->id = 3;
105 $expected->textfield = 'tadpole';
106 $result = get_record($this->table, 'id', '3', '', '', '', '', 'id,textfield');
107 $this->assert(new CheckSpecifiedFieldsExpectation($expected), $result);
108 $this->assertFalse(isset($result->numberfield));
109 $expected = new stdClass;
110 $expected->textfield = 'tadpole';
111 $expected->numberfield = 103;
112 $result = get_record($this->table, 'id', '3', '', '', '', '', 'textfield,numberfield');
113 $this->assert(new CheckSpecifiedFieldsExpectation($expected), $result);
114 $this->assertFalse(isset($result->id));
116 // Attempting to get a non-existant records should return false.
117 $this->assertFalse(get_record($this->table, 'textfield', 'not there'), 'attempt to get non-existant record');
120 function test_get_record_sql() {
121 global $CFG;
122 // Get particular records.
123 $this->assert(new CheckSpecifiedFieldsExpectation($this->objects[1]), get_record_sql("SELECT * FROM {$CFG->prefix}" . $this->table . " WHERE id = '1'", 'id = 1'));
125 // Abiguous get attempt, should return one, and print a warning in debug mode, unless $expectmultiple is used.
126 $old_debug = $CFG->debug;
127 $CFG->debug = 0;
129 ob_start();
130 $record = get_record_sql("SELECT * FROM {$CFG->prefix}" . $this->table . " WHERE textfield = 'tadpole'");
131 $result = ob_get_contents();
132 ob_end_clean();
133 $this->assertEqual('', $result, '%s (No error ouside debug mode).');
135 $CFG->debug = DEBUG_DEVELOPER;
136 ob_start();
137 $record = get_record_sql("SELECT * FROM {$CFG->prefix}" . $this->table . " WHERE textfield = 'tadpole'");
138 $result = ob_get_contents();
139 ob_end_clean();
140 $this->assert(new TextExpectation('Error:'), $result, 'Error in debug mode.');
142 ob_start();
143 $record = get_record_sql("SELECT * FROM {$CFG->prefix}" . $this->table . " WHERE textfield = 'tadpole'", true);
144 $result = ob_get_contents();
145 ob_end_clean();
146 $this->assertEqual('', $result, '%s (No error ouside debug mode).');
148 $CFG->debug = $old_debug;
150 // Attempting to get a non-existant records should return false.
151 $this->assertFalse(get_record_sql("SELECT * FROM {$CFG->prefix}" . $this->table . " WHERE textfield = 'not there'"), 'attempt to get non-existant record');
154 function test_get_record_select() {
155 // Get particular records.
156 $this->assert(new CheckSpecifiedFieldsExpectation($this->objects[2]), get_record_select($this->table, 'id > 1 AND id < 3'), 'id > 1 AND id < 3');
158 // Abiguous get attempt, should return one, and print a warning in debug mode.
159 global $CFG;
160 $old_debug = $CFG->debug;
161 $CFG->debug = 0;
163 ob_start();
164 $record = get_record_select($this->table, "textfield = 'tadpole'");
165 $result = ob_get_contents();
166 ob_end_clean();
167 $this->assertEqual('', $result, '%s (No error ouside debug mode).');
169 $CFG->debug = DEBUG_DEVELOPER;
170 ob_start();
171 $record = get_record_select($this->table, "textfield = 'tadpole'");
172 $result = ob_get_contents();
173 ob_end_clean();
174 $this->assert(new TextExpectation('Error:'), $result, 'Error in debug mode.');
176 $CFG->debug = $old_debug;
178 // Return only specified fields
179 $expected = new stdClass;
180 $expected->id = 1;
181 $expected->textfield = 'frog';
182 $result = get_record_select($this->table, "textfield = 'frog'", 'id,textfield');
183 $this->assert(new CheckSpecifiedFieldsExpectation($expected), $result);
184 $this->assertFalse(isset($result->numberfield));
186 // Attempting to get a non-existant records should return false.
187 $this->assertFalse(get_record_select($this->table, 'id > 666'), 'attempt to get non-existant record');
190 function test_get_field() {
191 $this->assertEqual(get_field($this->table, 'numberfield', 'id', 1), 101);
192 $this->assertEqual(get_field($this->table, 'textfield', 'numberfield', 102), 'toad');
193 $this->assertEqual(get_field($this->table, 'numberfield', 'textfield', 'tadpole', 'id', 4), 104);
194 $this->assertEqual(get_field($this->table, 'numberfield + id', 'textfield', 'tadpole', 'id', 4), 108);
195 $this->assertNull(get_field($this->table, 'numberfield', 'id', 5));
198 function test_get_field_select() {
199 $this->assertEqual(get_field_select($this->table, 'numberfield', 'id = 1'), 101);
202 function test_get_field_sql() {
203 global $CFG;
204 $this->assertEqual(get_field_sql("SELECT numberfield FROM {$CFG->prefix}$this->table WHERE id = 1"), 101);
207 function test_set_field() {
208 set_field($this->table, 'numberfield', 12345, 'id', 1);
209 $this->assertEqual(get_field($this->table, 'numberfield', 'id', 1), 12345);
211 set_field($this->table, 'textfield', 'newvalue', 'numberfield', 102);
212 $this->assertEqual(get_field($this->table, 'textfield', 'numberfield', 102), 'newvalue');
214 set_field($this->table, 'numberfield', -1, 'textfield', 'tadpole', 'id', 4);
215 $this->assertEqual(get_field($this->table, 'numberfield', 'textfield', 'tadpole', 'id', 4), -1);
217 set_field($this->table, 'textfield', null, 'id', 5);
218 $this->assertNull(get_field($this->table, 'textfield', 'id', 5));
221 function test_delete_records() {
222 delete_records($this->table, 'id', 666);
223 $this->assertEqual(count_records($this->table), 5);
224 delete_records($this->table, 'id', 1);
225 $this->assertEqual(count_records($this->table), 4);
226 delete_records($this->table, 'textfield', 'tadpole');
227 $this->assertEqual(count_records($this->table), 2);
228 delete_records($this->table, 'numberfield', NULL);
229 $this->assertEqual(count_records($this->table), 1);
232 function test_delete_records2() {
233 delete_records($this->table, 'textfield', 'tadpole', 'id', 4);
234 $this->assertEqual(count_records($this->table), 4);
235 delete_records($this->table);
236 $this->assertEqual(count_records($this->table), 0);
239 function test_delete_records_select() {
240 delete_records_select($this->table, "textfield LIKE 't%'");
241 $this->assertEqual(count_records($this->table), 2);
242 delete_records_select($this->table, "'1' = '1'");
243 $this->assertEqual(count_records($this->table), 0);
246 function test_update_record() {
247 global $CFG;
249 // Simple update
250 $obj = new stdClass;
251 $obj->id = 1;
252 $obj->textfield = 'changed entry';
253 $obj->numberfield = 123;
254 $this->assertTrue(update_record($this->table, $obj));
255 $this->assert(new CheckSpecifiedFieldsExpectation($obj, 'Simple update (%s)'), get_record($this->table, 'id', $obj->id));
257 // Simple incomplete update
258 $obj = new stdClass;
259 $obj->id = 2;
260 $obj->numberfield = 123;
261 $this->assertTrue(update_record($this->table, $obj));
262 $obj->textfield = 'toad';
263 $this->assert(new CheckSpecifiedFieldsExpectation($obj, 'Simple update (%s)'), get_record($this->table, 'id', $obj->id));
265 // Simple incomplete update
266 $obj = new stdClass;
267 $obj->id = 3;
268 $obj->numberfield = 123;
269 $obj->textfield = null;
270 $this->assertTrue(update_record($this->table, $obj));
271 $this->assert(new CheckSpecifiedFieldsExpectation($obj, 'Simple update (%s)'), get_record($this->table, 'id', $obj->id));
275 //function insert_record($table, $dataobject, $returnid=true, $primarykey='id', $feedback=true) {
276 function test_insert_record() {
277 global $CFG;
279 // Simple insert with $returnid
280 $obj = new stdClass;
281 $obj->textfield = 'new entry';
282 $obj->numberfield = 123;
283 $this->assertEqual(insert_record($this->table, $obj), 6);
284 $obj->id = 6;
285 $this->assert(new CheckSpecifiedFieldsExpectation($obj, 'Simple insert with returnid (%s)'), get_record($this->table, 'id', $obj->id));
287 // Simple insert without $returnid
288 $obj = new stdClass;
289 $obj->textfield = 'newer entry';
290 $obj->numberfield = 321;
291 $this->assertEqual(insert_record($this->table, $obj, false), true);
292 $obj->id = 7;
293 $this->assert(new CheckSpecifiedFieldsExpectation($obj, 'Simple insert without returnid (%s)'), get_record($this->table, 'id', $obj->id));
295 // Insert with missing columns - should get defaults.
296 $obj = new stdClass;
297 $obj->textfield = 'partial entry';
298 $this->assertEqual(insert_record($this->table, $obj), 8);
299 $obj->id = 8;
300 $obj->numberfield = 0xDefa;
301 $got = get_record($this->table, 'id', 8);
302 $this->assert(new CheckSpecifiedFieldsExpectation($obj, 'Insert with missing columns - should get defaults (%s)'), get_record($this->table, 'id', $obj->id));
304 // Insert with extra columns - should be ingnored.
305 $obj = new stdClass;
306 $obj->textfield = 'entry with extra';
307 $obj->numberfield = 747;
308 $obj->unused = 666;
309 $this->assertEqual(insert_record($this->table, $obj), 9);
310 $obj->id = 9;
311 unset($obj->unused);
312 $this->assert(new CheckSpecifiedFieldsExpectation($obj, 'Insert with extra columns - should be ingnored (%s)'), get_record($this->table, 'id', $obj->id));
314 // Simple insert with $returnid and NULL values
315 $obj = new stdClass;
316 $obj->textfield = null;
317 $obj->numberfield = null;
318 $this->assertEqual(insert_record($this->table, $obj), 10);
319 $obj->id = 10;
320 $new = get_record($this->table, 'id', $obj->id);
321 $this->assert(new CheckSpecifiedFieldsExpectation($obj, 'Simple insert with returnid (%s)'), $new);
322 $this->assertNull($new->textfield);
323 $this->assertNull($new->numberfield);
325 // Insert into nonexistant table - should fail.
326 $obj = new stdClass;
327 $obj->textfield = 'new entry';
328 $obj->numberfield = 123;
329 $this->assertFalse(insert_record('nonexistant_table', $obj), 'Insert into nonexistant table');
333 //test insert / retrieval of information containing backslashes, single and double quotes combinations
334 function test_backslashes_and_quotes() {
336 $teststrings = array(
337 'backslashes and quotes alone (even): "" \'\' \\\\',
338 'backslashes and quotes alone (odd): """ \'\'\' \\\\\\',
339 'backslashes and quotes seqences (even): \\"\\" \\\'\\\'',
340 'backslashes and quotes seqences (odd): \\"\\"\\" \\\'\\\'\\\'');
341 foreach ($teststrings as $teststrig) {
342 // insert the test string
343 $obj = new stdClass;
344 $obj->textfield = 'insert ' . $teststrig;
345 $recid = insert_record($this->table, addslashes_recursive($obj));
346 // retrieve it with get_record and test
347 $rec = get_record($this->table, 'id', $recid);
348 $this->assertEqual($rec->textfield, $obj->textfield);
349 // update it
350 $rec->textfield = 'update ' . $teststrig;
351 update_record($this->table, addslashes_recursive($rec));
352 // retrieve it with get field and test
353 $textfield_db = get_field($this->table, 'textfield', 'id', $recid);
354 $this->assertEqual($textfield_db, $rec->textfield);