[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 /** 18 * Tests for functions in db/upgradelib.php 19 * 20 * @package mod_feedback 21 * @copyright 2016 Marina Glancy 22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 23 */ 24 25 defined('MOODLE_INTERNAL') || die(); 26 27 global $CFG; 28 require_once($CFG->dirroot . '/mod/feedback/db/upgradelib.php'); 29 30 /** 31 * Tests for functions in db/upgradelib.php 32 * 33 * @package mod_feedback 34 * @copyright 2016 Marina Glancy 35 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 36 */ 37 class mod_feedback_upgradelib_testcase extends advanced_testcase { 38 39 /** @var string */ 40 protected $testsql = "SELECT COUNT(v.id) FROM {feedback_completed} c, {feedback_value} v 41 WHERE c.id = v.completed AND c.courseid <> v.course_id"; 42 /** @var string */ 43 protected $testsqltmp = "SELECT COUNT(v.id) FROM {feedback_completedtmp} c, {feedback_valuetmp} v 44 WHERE c.id = v.completed AND c.courseid <> v.course_id"; 45 /** @var int */ 46 protected $course1; 47 /** @var int */ 48 protected $course2; 49 /** @var stdClass */ 50 protected $feedback; 51 /** @var stdClass */ 52 protected $user; 53 54 /** 55 * Sets up the fixture 56 * This method is called before a test is executed. 57 */ 58 public function setUp() { 59 parent::setUp(); 60 $this->resetAfterTest(true); 61 62 $this->course1 = $this->getDataGenerator()->create_course(); 63 $this->course2 = $this->getDataGenerator()->create_course(); 64 $this->feedback = $this->getDataGenerator()->create_module('feedback', array('course' => SITEID)); 65 66 $this->user = $this->getDataGenerator()->create_user(); 67 } 68 69 public function test_upgrade_courseid_completed() { 70 global $DB; 71 72 // Case 1. No errors in the data. 73 $completed1 = $DB->insert_record('feedback_completed', 74 ['feedback' => $this->feedback->id, 'userid' => $this->user->id]); 75 $DB->insert_record('feedback_value', 76 ['completed' => $completed1, 'course_id' => $this->course1->id, 77 'item' => 1, 'value' => 1]); 78 $DB->insert_record('feedback_value', 79 ['completed' => $completed1, 'course_id' => $this->course1->id, 80 'item' => 2, 'value' => 2]); 81 82 $this->assertCount(1, $DB->get_records('feedback_completed')); 83 $this->assertEquals(2, $DB->count_records_sql($this->testsql)); // We have errors! 84 mod_feedback_upgrade_courseid(true); // Running script for temp tables. 85 $this->assertCount(1, $DB->get_records('feedback_completed')); 86 $this->assertEquals(2, $DB->count_records_sql($this->testsql)); // Nothing changed. 87 mod_feedback_upgrade_courseid(); 88 $this->assertCount(1, $DB->get_records('feedback_completed')); // Number of records is the same. 89 $this->assertEquals(0, $DB->count_records_sql($this->testsql)); // All errors are fixed! 90 } 91 92 public function test_upgrade_courseid_completed_with_errors() { 93 global $DB; 94 95 // Case 2. Errors in data (same feedback_completed has values for different courses). 96 $completed1 = $DB->insert_record('feedback_completed', 97 ['feedback' => $this->feedback->id, 'userid' => $this->user->id]); 98 $DB->insert_record('feedback_value', 99 ['completed' => $completed1, 'course_id' => $this->course1->id, 100 'item' => 1, 'value' => 1]); 101 $DB->insert_record('feedback_value', 102 ['completed' => $completed1, 'course_id' => $this->course2->id, 103 'item' => 1, 'value' => 2]); 104 105 $this->assertCount(1, $DB->get_records('feedback_completed')); 106 $this->assertEquals(2, $DB->count_records_sql($this->testsql)); // We have errors! 107 mod_feedback_upgrade_courseid(true); // Running script for temp tables. 108 $this->assertCount(1, $DB->get_records('feedback_completed')); 109 $this->assertEquals(2, $DB->count_records_sql($this->testsql)); // Nothing changed. 110 mod_feedback_upgrade_courseid(); 111 $this->assertCount(2, $DB->get_records('feedback_completed')); // Extra record inserted. 112 $this->assertEquals(0, $DB->count_records_sql($this->testsql)); // All errors are fixed! 113 } 114 115 public function test_upgrade_courseid_completedtmp() { 116 global $DB; 117 118 // Case 1. No errors in the data. 119 $completed1 = $DB->insert_record('feedback_completedtmp', 120 ['feedback' => $this->feedback->id, 'userid' => $this->user->id]); 121 $DB->insert_record('feedback_valuetmp', 122 ['completed' => $completed1, 'course_id' => $this->course1->id, 123 'item' => 1, 'value' => 1]); 124 $DB->insert_record('feedback_valuetmp', 125 ['completed' => $completed1, 'course_id' => $this->course1->id, 126 'item' => 2, 'value' => 2]); 127 128 $this->assertCount(1, $DB->get_records('feedback_completedtmp')); 129 $this->assertEquals(2, $DB->count_records_sql($this->testsqltmp)); // We have errors! 130 mod_feedback_upgrade_courseid(); // Running script for non-temp tables. 131 $this->assertCount(1, $DB->get_records('feedback_completedtmp')); 132 $this->assertEquals(2, $DB->count_records_sql($this->testsqltmp)); // Nothing changed. 133 mod_feedback_upgrade_courseid(true); 134 $this->assertCount(1, $DB->get_records('feedback_completedtmp')); // Number of records is the same. 135 $this->assertEquals(0, $DB->count_records_sql($this->testsqltmp)); // All errors are fixed! 136 } 137 138 public function test_upgrade_courseid_completedtmp_with_errors() { 139 global $DB; 140 141 // Case 2. Errors in data (same feedback_completed has values for different courses). 142 $completed1 = $DB->insert_record('feedback_completedtmp', 143 ['feedback' => $this->feedback->id, 'userid' => $this->user->id]); 144 $DB->insert_record('feedback_valuetmp', 145 ['completed' => $completed1, 'course_id' => $this->course1->id, 146 'item' => 1, 'value' => 1]); 147 $DB->insert_record('feedback_valuetmp', 148 ['completed' => $completed1, 'course_id' => $this->course2->id, 149 'item' => 1, 'value' => 2]); 150 151 $this->assertCount(1, $DB->get_records('feedback_completedtmp')); 152 $this->assertEquals(2, $DB->count_records_sql($this->testsqltmp)); // We have errors! 153 mod_feedback_upgrade_courseid(); // Running script for non-temp tables. 154 $this->assertCount(1, $DB->get_records('feedback_completedtmp')); 155 $this->assertEquals(2, $DB->count_records_sql($this->testsqltmp)); // Nothing changed. 156 mod_feedback_upgrade_courseid(true); 157 $this->assertCount(2, $DB->get_records('feedback_completedtmp')); // Extra record inserted. 158 $this->assertEquals(0, $DB->count_records_sql($this->testsqltmp)); // All errors are fixed! 159 } 160 161 public function test_upgrade_courseid_empty_completed() { 162 global $DB; 163 164 // Record in 'feedback_completed' does not have corresponding values. 165 $DB->insert_record('feedback_completed', 166 ['feedback' => $this->feedback->id, 'userid' => $this->user->id]); 167 168 $this->assertCount(1, $DB->get_records('feedback_completed')); 169 $record1 = $DB->get_record('feedback_completed', []); 170 mod_feedback_upgrade_courseid(); 171 $this->assertCount(1, $DB->get_records('feedback_completed')); // Number of records is the same. 172 $record2 = $DB->get_record('feedback_completed', []); 173 $this->assertEquals($record1, $record2); 174 } 175 176 public function test_upgrade_remove_duplicates_no_duplicates() { 177 global $DB; 178 179 $completed1 = $DB->insert_record('feedback_completed', 180 ['feedback' => $this->feedback->id, 'userid' => $this->user->id]); 181 $DB->insert_record('feedback_value', 182 ['completed' => $completed1, 'course_id' => $this->course1->id, 183 'item' => 1, 'value' => 1]); 184 $DB->insert_record('feedback_value', 185 ['completed' => $completed1, 'course_id' => $this->course1->id, 186 'item' => 2, 'value' => 2]); 187 $DB->insert_record('feedback_value', 188 ['completed' => $completed1, 'course_id' => $this->course1->id, 189 'item' => 3, 'value' => 1]); 190 $DB->insert_record('feedback_value', 191 ['completed' => $completed1, 'course_id' => $this->course2->id, 192 'item' => 3, 'value' => 2]); 193 194 $this->assertCount(1, $DB->get_records('feedback_completed')); 195 $this->assertEquals(4, $DB->count_records('feedback_value')); 196 mod_feedback_upgrade_delete_duplicate_values(); 197 $this->assertCount(1, $DB->get_records('feedback_completed')); 198 $this->assertEquals(4, $DB->count_records('feedback_value')); // Same number of records, no changes made. 199 } 200 201 public function test_upgrade_remove_duplicates() { 202 global $DB; 203 204 // Remove the index that was added in the upgrade.php AFTER running mod_feedback_upgrade_delete_duplicate_values(). 205 $dbman = $DB->get_manager(); 206 $table = new xmldb_table('feedback_value'); 207 $index = new xmldb_index('completed_item', XMLDB_INDEX_UNIQUE, array('completed', 'item', 'course_id')); 208 $dbman->drop_index($table, $index); 209 210 // Insert duplicated values. 211 $completed1 = $DB->insert_record('feedback_completed', 212 ['feedback' => $this->feedback->id, 'userid' => $this->user->id]); 213 $DB->insert_record('feedback_value', 214 ['completed' => $completed1, 'course_id' => $this->course1->id, 215 'item' => 1, 'value' => 1]); 216 $DB->insert_record('feedback_value', 217 ['completed' => $completed1, 'course_id' => $this->course1->id, 218 'item' => 1, 'value' => 2]); // This is a duplicate with another value. 219 $DB->insert_record('feedback_value', 220 ['completed' => $completed1, 'course_id' => $this->course1->id, 221 'item' => 3, 'value' => 1]); 222 $DB->insert_record('feedback_value', 223 ['completed' => $completed1, 'course_id' => $this->course2->id, 224 'item' => 3, 'value' => 2]); // This is not a duplicate because course id is different. 225 226 $this->assertCount(1, $DB->get_records('feedback_completed')); 227 $this->assertEquals(4, $DB->count_records('feedback_value')); 228 mod_feedback_upgrade_delete_duplicate_values(true); // Running script for temp tables. 229 $this->assertCount(1, $DB->get_records('feedback_completed')); 230 $this->assertEquals(4, $DB->count_records('feedback_value')); // Nothing changed. 231 mod_feedback_upgrade_delete_duplicate_values(); 232 $this->assertCount(1, $DB->get_records('feedback_completed')); // Number of records is the same. 233 $this->assertEquals(3, $DB->count_records('feedback_value')); // Duplicate was deleted. 234 $this->assertEquals(1, $DB->get_field('feedback_value', 'value', ['item' => 1])); 235 236 $dbman->add_index($table, $index); 237 } 238 239 public function test_upgrade_remove_duplicates_no_duplicates_tmp() { 240 global $DB; 241 242 $completed1 = $DB->insert_record('feedback_completedtmp', 243 ['feedback' => $this->feedback->id, 'userid' => $this->user->id]); 244 $DB->insert_record('feedback_valuetmp', 245 ['completed' => $completed1, 'course_id' => $this->course1->id, 246 'item' => 1, 'value' => 1]); 247 $DB->insert_record('feedback_valuetmp', 248 ['completed' => $completed1, 'course_id' => $this->course1->id, 249 'item' => 2, 'value' => 2]); 250 $DB->insert_record('feedback_valuetmp', 251 ['completed' => $completed1, 'course_id' => $this->course1->id, 252 'item' => 3, 'value' => 1]); 253 $DB->insert_record('feedback_valuetmp', 254 ['completed' => $completed1, 'course_id' => $this->course2->id, 255 'item' => 3, 'value' => 2]); 256 257 $this->assertCount(1, $DB->get_records('feedback_completedtmp')); 258 $this->assertEquals(4, $DB->count_records('feedback_valuetmp')); 259 mod_feedback_upgrade_delete_duplicate_values(true); 260 $this->assertCount(1, $DB->get_records('feedback_completedtmp')); 261 $this->assertEquals(4, $DB->count_records('feedback_valuetmp')); // Same number of records, no changes made. 262 } 263 264 public function test_upgrade_remove_duplicates_tmp() { 265 global $DB; 266 267 // Remove the index that was added in the upgrade.php AFTER running mod_feedback_upgrade_delete_duplicate_values(). 268 $dbman = $DB->get_manager(); 269 $table = new xmldb_table('feedback_valuetmp'); 270 $index = new xmldb_index('completed_item', XMLDB_INDEX_UNIQUE, array('completed', 'item', 'course_id')); 271 $dbman->drop_index($table, $index); 272 273 // Insert duplicated values. 274 $completed1 = $DB->insert_record('feedback_completedtmp', 275 ['feedback' => $this->feedback->id, 'userid' => $this->user->id]); 276 $DB->insert_record('feedback_valuetmp', 277 ['completed' => $completed1, 'course_id' => $this->course1->id, 278 'item' => 1, 'value' => 1]); 279 $DB->insert_record('feedback_valuetmp', 280 ['completed' => $completed1, 'course_id' => $this->course1->id, 281 'item' => 1, 'value' => 2]); // This is a duplicate with another value. 282 $DB->insert_record('feedback_valuetmp', 283 ['completed' => $completed1, 'course_id' => $this->course1->id, 284 'item' => 3, 'value' => 1]); 285 $DB->insert_record('feedback_valuetmp', 286 ['completed' => $completed1, 'course_id' => $this->course2->id, 287 'item' => 3, 'value' => 2]); // This is not a duplicate because course id is different. 288 289 $this->assertCount(1, $DB->get_records('feedback_completedtmp')); 290 $this->assertEquals(4, $DB->count_records('feedback_valuetmp')); 291 mod_feedback_upgrade_delete_duplicate_values(); // Running script for non-temp tables. 292 $this->assertCount(1, $DB->get_records('feedback_completedtmp')); 293 $this->assertEquals(4, $DB->count_records('feedback_valuetmp')); // Nothing changed. 294 mod_feedback_upgrade_delete_duplicate_values(true); 295 $this->assertCount(1, $DB->get_records('feedback_completedtmp')); // Number of records is the same. 296 $this->assertEquals(3, $DB->count_records('feedback_valuetmp')); // Duplicate was deleted. 297 $this->assertEquals(1, $DB->get_field('feedback_valuetmp', 'value', ['item' => 1])); 298 299 $dbman->add_index($table, $index); 300 } 301 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Aug 11 10:00:09 2016 | Cross-referenced by PHPXref 0.7.1 |