[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/mod/feedback/tests/ -> upgradelib_test.php (source)

   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  }


Generated: Thu Aug 11 10:00:09 2016 Cross-referenced by PHPXref 0.7.1