MDL-28080 DML unit tests - cover tweak_param_names() and the new 30 chars limit exception

This commit is contained in:
Eloy Lafuente (stronk7)
2011-09-01 19:59:13 +02:00
parent 436135f52a
commit 3c7a83744e
+143
View File
@@ -465,6 +465,16 @@ class dml_test extends UnitTestCase {
$this->fail("Unexpected ".get_class($e)." exception");
}
// Params exceeding 30 chars length
$sql = "SELECT * FROM {{$tablename}} WHERE name = :long_placeholder_with_more_than_30";
$params = array('long_placeholder_with_more_than_30' => 'record1');
try {
$DB->fix_sql_params($sql, $params);
$this->fail("Expecting an exception, none occurred");
} catch (Exception $e) {
$this->assertTrue($e instanceof coding_exception);
}
// Booleans in NAMED params are casting to 1/0 int
$sql = "SELECT * FROM {{$tablename}} WHERE course = ? OR course = ?";
$params = array(true, false);
@@ -493,6 +503,139 @@ class dml_test extends UnitTestCase {
$this->assertIdentical(array_values($params), array_values($inparams));
}
public function test_tweak_param_names() {
// Note the tweak_param_names() method is only available in the oracle driver,
// hence we look for expected results indirectly, by testing various DML methods
// with some "extreme" conditions causing the tweak to happen.
$DB = $this->tdb;
$dbman = $this->tdb->get_manager();
$table = $this->get_test_table();
$tablename = $table->getName();
$table->add_field('id', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, XMLDB_SEQUENCE, null);
// Add some columns with 28 chars in the name
$table->add_field('long_int_columnname_with_28c', XMLDB_TYPE_INTEGER, '10');
$table->add_field('long_dec_columnname_with_28c', XMLDB_TYPE_NUMBER, '10,2');
$table->add_field('long_str_columnname_with_28c', XMLDB_TYPE_CHAR, '100');
// Add some columns with 30 chars in the name
$table->add_field('long_int_columnname_with_30cxx', XMLDB_TYPE_INTEGER, '10');
$table->add_field('long_dec_columnname_with_30cxx', XMLDB_TYPE_NUMBER, '10,2');
$table->add_field('long_str_columnname_with_30cxx', XMLDB_TYPE_CHAR, '100');
$table->add_key('primary', XMLDB_KEY_PRIMARY, array('id'));
$dbman->create_table($table);
$this->assertTrue($dbman->table_exists($tablename));
// Test insert record
$rec1 = new stdClass();
$rec1->long_int_columnname_with_28c = 28;
$rec1->long_dec_columnname_with_28c = 28.28;
$rec1->long_str_columnname_with_28c = '28';
$rec1->long_int_columnname_with_30cxx = 30;
$rec1->long_dec_columnname_with_30cxx = 30.30;
$rec1->long_str_columnname_with_30cxx = '30';
// insert_record()
$rec1->id = $DB->insert_record($tablename, $rec1);
$this->assertEqual($rec1, $DB->get_record($tablename, array('id' => $rec1->id)));
// update_record()
$DB->update_record($tablename, $rec1);
$this->assertEqual($rec1, $DB->get_record($tablename, array('id' => $rec1->id)));
// set_field()
$rec1->long_int_columnname_with_28c = 280;
$DB->set_field($tablename, 'long_int_columnname_with_28c', $rec1->long_int_columnname_with_28c,
array('id' => $rec1->id, 'long_int_columnname_with_28c' => 28));
$rec1->long_dec_columnname_with_28c = 280.28;
$DB->set_field($tablename, 'long_dec_columnname_with_28c', $rec1->long_dec_columnname_with_28c,
array('id' => $rec1->id, 'long_dec_columnname_with_28c' => 28.28));
$rec1->long_str_columnname_with_28c = '280';
$DB->set_field($tablename, 'long_str_columnname_with_28c', $rec1->long_str_columnname_with_28c,
array('id' => $rec1->id, 'long_str_columnname_with_28c' => '28'));
$rec1->long_int_columnname_with_30cxx = 300;
$DB->set_field($tablename, 'long_int_columnname_with_30cxx', $rec1->long_int_columnname_with_30cxx,
array('id' => $rec1->id, 'long_int_columnname_with_30cxx' => 30));
$rec1->long_dec_columnname_with_30cxx = 300.30;
$DB->set_field($tablename, 'long_dec_columnname_with_30cxx', $rec1->long_dec_columnname_with_30cxx,
array('id' => $rec1->id, 'long_dec_columnname_with_30cxx' => 30.30));
$rec1->long_str_columnname_with_30cxx = '300';
$DB->set_field($tablename, 'long_str_columnname_with_30cxx', $rec1->long_str_columnname_with_30cxx,
array('id' => $rec1->id, 'long_str_columnname_with_30cxx' => '30'));
$this->assertEqual($rec1, $DB->get_record($tablename, array('id' => $rec1->id)));
// delete_records()
$rec2 = $DB->get_record($tablename, array('id' => $rec1->id));
$rec2->id = $DB->insert_record($tablename, $rec2);
$this->assertEqual(2, $DB->count_records($tablename));
$DB->delete_records($tablename, (array) $rec2);
$this->assertEqual(1, $DB->count_records($tablename));
// get_recordset()
$rs = $DB->get_recordset($tablename, (array) $rec1);
$iterations = 0;
foreach ($rs as $rec2) {
$iterations++;
}
$rs->close();
$this->assertEqual(1, $iterations);
$this->assertEqual($rec1, $rec2);
// get_records()
$recs = $DB->get_records($tablename, (array) $rec1);
$this->assertEqual(1, count($recs));
$this->assertEqual($rec1, reset($recs));
// get_fieldset_select()
$select = 'id = :id AND
long_int_columnname_with_28c = :long_int_columnname_with_28c AND
long_dec_columnname_with_28c = :long_dec_columnname_with_28c AND
long_str_columnname_with_28c = :long_str_columnname_with_28c AND
long_int_columnname_with_30cxx = :long_int_columnname_with_30cxx AND
long_dec_columnname_with_30cxx = :long_dec_columnname_with_30cxx AND
long_str_columnname_with_30cxx = :long_str_columnname_with_30cxx';
$fields = $DB->get_fieldset_select($tablename, 'long_int_columnname_with_28c', $select, (array)$rec1);
$this->assertEqual(1, count($fields));
$this->assertEqual($rec1->long_int_columnname_with_28c, reset($fields));
$fields = $DB->get_fieldset_select($tablename, 'long_dec_columnname_with_28c', $select, (array)$rec1);
$this->assertEqual($rec1->long_dec_columnname_with_28c, reset($fields));
$fields = $DB->get_fieldset_select($tablename, 'long_str_columnname_with_28c', $select, (array)$rec1);
$this->assertEqual($rec1->long_str_columnname_with_28c, reset($fields));
$fields = $DB->get_fieldset_select($tablename, 'long_int_columnname_with_30cxx', $select, (array)$rec1);
$this->assertEqual($rec1->long_int_columnname_with_30cxx, reset($fields));
$fields = $DB->get_fieldset_select($tablename, 'long_dec_columnname_with_30cxx', $select, (array)$rec1);
$this->assertEqual($rec1->long_dec_columnname_with_30cxx, reset($fields));
$fields = $DB->get_fieldset_select($tablename, 'long_str_columnname_with_30cxx', $select, (array)$rec1);
$this->assertEqual($rec1->long_str_columnname_with_30cxx, reset($fields));
// overlapping placeholders (progressive str_replace)
$overlapselect = 'id = :p AND
long_int_columnname_with_28c = :param1 AND
long_dec_columnname_with_28c = :param2 AND
long_str_columnname_with_28c = :param_with_29_characters_long AND
long_int_columnname_with_30cxx = :param_with_30_characters_long_ AND
long_dec_columnname_with_30cxx = :param_ AND
long_str_columnname_with_30cxx = :param__';
$overlapparams = array(
'p' => $rec1->id,
'param1' => $rec1->long_int_columnname_with_28c,
'param2' => $rec1->long_dec_columnname_with_28c,
'param_with_29_characters_long' => $rec1->long_str_columnname_with_28c,
'param_with_30_characters_long_' => $rec1->long_int_columnname_with_30cxx,
'param_' => $rec1->long_dec_columnname_with_30cxx,
'param__' => $rec1->long_str_columnname_with_30cxx);
$recs = $DB->get_records_select($tablename, $overlapselect, $overlapparams);
$this->assertEqual(1, count($recs));
$this->assertEqual($rec1, reset($recs));
// execute()
$DB->execute("DELETE FROM {{$tablename}} WHERE $select", (array)$rec1);
$this->assertEqual(0, $DB->count_records($tablename));
}
public function test_get_tables() {
$DB = $this->tdb;
$dbman = $this->tdb->get_manager();