PageRenderTime 44ms CodeModel.GetById 16ms RepoModel.GetById 0ms app.codeStats 0ms

/grade/tests/importlib_test.php

https://github.com/mackensen/moodle
PHP | 204 lines | 129 code | 25 blank | 50 comment | 10 complexity | 291a5295760b504c08cb9c7e886ef3dd MD5 | raw file
  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. * Unit tests for grade/import/lib.php.
  18. *
  19. * @package core_grades
  20. * @category phpunit
  21. * @copyright 2015 Adrian Greeve <adrian@moodle.com>
  22. * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
  23. */
  24. defined('MOODLE_INTERNAL') || die();
  25. global $CFG;
  26. require_once($CFG->dirroot . '/grade/import/lib.php');
  27. /**
  28. * Tests grade_import_lib functions.
  29. */
  30. class core_grade_import_lib_test extends advanced_testcase {
  31. /**
  32. * Import grades into 'grade_import_values' table. This is done differently in the various import plugins,
  33. * so there is no direct API to call.
  34. *
  35. * @param array $data Information to be inserted into the table.
  36. * @return int The insert ID of the sql statement.
  37. */
  38. private function import_grades($data) {
  39. global $DB, $USER;
  40. $graderecord = new stdClass();
  41. $graderecord->importcode = $data['importcode'];
  42. if (isset($data['itemid'])) {
  43. $graderecord->itemid = $data['itemid'];
  44. }
  45. $graderecord->userid = $data['userid'];
  46. if (isset($data['importer'])) {
  47. $graderecord->importer = $data['importer'];
  48. } else {
  49. $graderecord->importer = $USER->id;
  50. }
  51. if (isset($data['finalgrade'])) {
  52. $graderecord->finalgrade = $data['finalgrade'];
  53. } else {
  54. $graderecord->finalgrade = rand(0, 100);
  55. }
  56. if (isset($data['feedback'])) {
  57. $graderecord->feedback = $data['feedback'];
  58. }
  59. if (isset($data['importonlyfeedback'])) {
  60. $graderecord->importonlyfeedback = $data['importonlyfeedback'];
  61. } else {
  62. $graderecord->importonlyfeedback = false;
  63. }
  64. if (isset($data['newgradeitem'])) {
  65. $graderecord->newgradeitem = $data['newgradeitem'];
  66. }
  67. return $DB->insert_record('grade_import_values', $graderecord);
  68. }
  69. /**
  70. * Tests for importing grades from an external source.
  71. */
  72. public function test_grade_import_commit() {
  73. global $USER, $DB, $CFG;
  74. $this->resetAfterTest();
  75. $importcode = get_new_importcode();
  76. $user1 = $this->getDataGenerator()->create_user();
  77. $user2 = $this->getDataGenerator()->create_user();
  78. $course = $this->getDataGenerator()->create_course();
  79. $assign = $this->getDataGenerator()->create_module('assign', array('course' => $course->id));
  80. $itemname = $assign->name;
  81. $modulecontext = context_module::instance($assign->cmid);
  82. // The generator returns a dummy object, lets get the real assign object.
  83. $assign = new assign($modulecontext, false, false);
  84. $cm = $assign->get_course_module();
  85. // Enrol users in the course.
  86. $this->getDataGenerator()->enrol_user($user1->id, $course->id);
  87. $this->getDataGenerator()->enrol_user($user2->id, $course->id);
  88. // Enter a new grade into an existing grade item.
  89. $gradeitem = grade_item::fetch(array('courseid' => $course->id, 'itemtype' => 'mod'));
  90. // Keep this value around for a test further down.
  91. $originalgrade = 55;
  92. $this->import_grades(array(
  93. 'importcode' => $importcode,
  94. 'itemid' => $gradeitem->id,
  95. 'userid' => $user1->id,
  96. 'finalgrade' => $originalgrade
  97. ));
  98. $status = grade_import_commit($course->id, $importcode, false, false);
  99. $this->assertTrue($status);
  100. // Get imported grade_grade.
  101. $gradegrade = grade_grade::fetch(array('itemid' => $gradeitem->id, 'userid' => $user1->id));
  102. $this->assertEquals($originalgrade, $gradegrade->finalgrade);
  103. // Overriden field will be a timestamp and will evaluate out to true.
  104. $this->assertTrue($gradegrade->is_overridden());
  105. // Create a new grade item and import into that.
  106. $importcode = get_new_importcode();
  107. $record = new stdClass();
  108. $record->itemname = 'New grade item';
  109. $record->importcode = $importcode;
  110. $record->importer = $USER->id;
  111. $insertid = $DB->insert_record('grade_import_newitem', $record);
  112. $finalgrade = 75;
  113. $this->import_grades(array(
  114. 'importcode' => $importcode,
  115. 'userid' => $user1->id,
  116. 'finalgrade' => $finalgrade,
  117. 'newgradeitem' => $insertid
  118. ));
  119. $status = grade_import_commit($course->id, $importcode, false, false);
  120. $this->assertTrue($status);
  121. // Check that we have a new grade_item.
  122. $gradeitem = grade_item::fetch(array('courseid' => $course->id, 'itemtype' => 'manual'));
  123. $this->assertEquals($record->itemname, $gradeitem->itemname);
  124. // Grades were imported.
  125. $gradegrade = grade_grade::fetch(array('itemid' => $gradeitem->id, 'userid' => $user1->id));
  126. $this->assertEquals($finalgrade, $gradegrade->finalgrade);
  127. // As this is a new item the grade has not been overridden.
  128. $this->assertFalse($gradegrade->is_overridden());
  129. // Import feedback only.
  130. $importcode = get_new_importcode();
  131. $gradeitem = grade_item::fetch(array('courseid' => $course->id, 'itemtype' => 'mod'));
  132. $originalfeedback = 'feedback can be useful';
  133. $this->import_grades(array(
  134. 'importcode' => $importcode,
  135. 'userid' => $user1->id,
  136. 'itemid' => $gradeitem->id,
  137. 'feedback' => $originalfeedback,
  138. 'importonlyfeedback' => true
  139. ));
  140. $status = grade_import_commit($course->id, $importcode, true, false);
  141. $this->assertTrue($status);
  142. $gradegrade = grade_grade::fetch(array('itemid' => $gradeitem->id, 'userid' => $user1->id));
  143. // The final grade should be the same as the first record further up. We are only altering the feedback.
  144. $this->assertEquals($originalgrade, $gradegrade->finalgrade);
  145. $this->assertTrue($gradegrade->is_overridden());
  146. // Import grades only.
  147. $importcode = get_new_importcode();
  148. $gradeitem = grade_item::fetch(array('courseid' => $course->id, 'itemtype' => 'mod'));
  149. $finalgrade = 60;
  150. $this->import_grades(array(
  151. 'importcode' => $importcode,
  152. 'userid' => $user1->id,
  153. 'itemid' => $gradeitem->id,
  154. 'finalgrade' => $finalgrade,
  155. 'feedback' => 'feedback can still be useful'
  156. ));
  157. $status = grade_import_commit($course->id, $importcode, false, false);
  158. $this->assertTrue($status);
  159. $gradegrade = grade_grade::fetch(array('itemid' => $gradeitem->id, 'userid' => $user1->id));
  160. $this->assertEquals($finalgrade, $gradegrade->finalgrade);
  161. // The final feedback should not have changed.
  162. $this->assertEquals($originalfeedback, $gradegrade->feedback);
  163. $this->assertTrue($gradegrade->is_overridden());
  164. // Check that printing of import status is correct.
  165. $importcode = get_new_importcode();
  166. $gradeitem = grade_item::fetch(array('courseid' => $course->id, 'itemtype' => 'mod'));
  167. $this->import_grades(array(
  168. 'importcode' => $importcode,
  169. 'userid' => $user1->id,
  170. 'itemid' => $gradeitem->id
  171. ));
  172. ob_start();
  173. $status = grade_import_commit($course->id, $importcode);
  174. $output = ob_get_contents();
  175. ob_end_clean();
  176. $this->assertTrue($status);
  177. $this->assertStringContainsString("++ Grade import success ++", $output);
  178. }
  179. }