[ Index ]

PHP Cross Reference of moodle-2.8

title

Body

[close]

/mod/assign/tests/ -> externallib_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  defined('MOODLE_INTERNAL') || die();
  18  
  19  global $CFG;
  20  
  21  require_once($CFG->dirroot . '/webservice/tests/helpers.php');
  22  
  23  /**
  24   * External mod assign functions unit tests
  25   *
  26   * @package mod_assign
  27   * @category external
  28   * @copyright 2012 Paul Charsley
  29   * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  30   */
  31  class mod_assign_external_testcase extends externallib_advanced_testcase {
  32  
  33      /**
  34       * Tests set up
  35       */
  36      protected function setUp() {
  37          global $CFG;
  38          require_once($CFG->dirroot . '/mod/assign/externallib.php');
  39      }
  40  
  41      /**
  42       * Test get_grades
  43       */
  44      public function test_get_grades() {
  45          global $DB, $USER;
  46  
  47          $this->resetAfterTest(true);
  48          // Create a course and assignment.
  49          $coursedata['idnumber'] = 'idnumbercourse';
  50          $coursedata['fullname'] = 'Lightwork Course';
  51          $coursedata['summary'] = 'Lightwork Course description';
  52          $coursedata['summaryformat'] = FORMAT_MOODLE;
  53          $course = self::getDataGenerator()->create_course($coursedata);
  54  
  55          $assigndata['course'] = $course->id;
  56          $assigndata['name'] = 'lightwork assignment';
  57  
  58          $assign = self::getDataGenerator()->create_module('assign', $assigndata);
  59  
  60          // Create a manual enrolment record.
  61          $manualenroldata['enrol'] = 'manual';
  62          $manualenroldata['status'] = 0;
  63          $manualenroldata['courseid'] = $course->id;
  64          $enrolid = $DB->insert_record('enrol', $manualenroldata);
  65  
  66          // Create a teacher and give them capabilities.
  67          $context = context_course::instance($course->id);
  68          $roleid = $this->assignUserCapability('moodle/course:viewparticipants', $context->id, 3);
  69          $context = context_module::instance($assign->cmid);
  70          $this->assignUserCapability('mod/assign:grade', $context->id, $roleid);
  71  
  72          // Create the teacher's enrolment record.
  73          $userenrolmentdata['status'] = 0;
  74          $userenrolmentdata['enrolid'] = $enrolid;
  75          $userenrolmentdata['userid'] = $USER->id;
  76          $DB->insert_record('user_enrolments', $userenrolmentdata);
  77  
  78          // Create a student and give them 2 grades (for 2 attempts).
  79          $student = self::getDataGenerator()->create_user();
  80  
  81          $submission = new stdClass();
  82          $submission->assignment = $assign->id;
  83          $submission->userid = $student->id;
  84          $submission->status = ASSIGN_SUBMISSION_STATUS_NEW;
  85          $submission->latest = 0;
  86          $submission->attemptnumber = 0;
  87          $submission->groupid = 0;
  88          $submission->timecreated = time();
  89          $submission->timemodified = time();
  90          $DB->insert_record('assign_submission', $submission);
  91  
  92          $grade = new stdClass();
  93          $grade->assignment = $assign->id;
  94          $grade->userid = $student->id;
  95          $grade->timecreated = time();
  96          $grade->timemodified = $grade->timecreated;
  97          $grade->grader = $USER->id;
  98          $grade->grade = 50;
  99          $grade->attemptnumber = 0;
 100          $DB->insert_record('assign_grades', $grade);
 101  
 102          $submission = new stdClass();
 103          $submission->assignment = $assign->id;
 104          $submission->userid = $student->id;
 105          $submission->status = ASSIGN_SUBMISSION_STATUS_NEW;
 106          $submission->latest = 1;
 107          $submission->attemptnumber = 1;
 108          $submission->groupid = 0;
 109          $submission->timecreated = time();
 110          $submission->timemodified = time();
 111          $DB->insert_record('assign_submission', $submission);
 112  
 113          $grade = new stdClass();
 114          $grade->assignment = $assign->id;
 115          $grade->userid = $student->id;
 116          $grade->timecreated = time();
 117          $grade->timemodified = $grade->timecreated;
 118          $grade->grader = $USER->id;
 119          $grade->grade = 75;
 120          $grade->attemptnumber = 1;
 121          $DB->insert_record('assign_grades', $grade);
 122  
 123          $assignmentids[] = $assign->id;
 124          $result = mod_assign_external::get_grades($assignmentids);
 125  
 126          // We need to execute the return values cleaning process to simulate the web service server.
 127          $result = external_api::clean_returnvalue(mod_assign_external::get_grades_returns(), $result);
 128  
 129          // Check that the correct grade information for the student is returned.
 130          $this->assertEquals(1, count($result['assignments']));
 131          $assignment = $result['assignments'][0];
 132          $this->assertEquals($assign->id, $assignment['assignmentid']);
 133          // Should only get the last grade for this student.
 134          $this->assertEquals(1, count($assignment['grades']));
 135          $grade = $assignment['grades'][0];
 136          $this->assertEquals($student->id, $grade['userid']);
 137          // Should be the last grade (not the first).
 138          $this->assertEquals(75, $grade['grade']);
 139      }
 140  
 141      /**
 142       * Test get_assignments
 143       */
 144      public function test_get_assignments() {
 145          global $DB, $USER;
 146  
 147          $this->resetAfterTest(true);
 148  
 149          $category = self::getDataGenerator()->create_category(array(
 150              'name' => 'Test category'
 151          ));
 152  
 153          // Create a course.
 154          $course1 = self::getDataGenerator()->create_course(array(
 155              'idnumber' => 'idnumbercourse1',
 156              'fullname' => 'Lightwork Course 1',
 157              'summary' => 'Lightwork Course 1 description',
 158              'summaryformat' => FORMAT_MOODLE,
 159              'category' => $category->id
 160          ));
 161  
 162          // Create a second course, just for testing.
 163          $course2 = self::getDataGenerator()->create_course(array(
 164              'idnumber' => 'idnumbercourse2',
 165              'fullname' => 'Lightwork Course 2',
 166              'summary' => 'Lightwork Course 2 description',
 167              'summaryformat' => FORMAT_MOODLE,
 168              'category' => $category->id
 169          ));
 170  
 171          // Create the assignment module.
 172          $assign1 = self::getDataGenerator()->create_module('assign', array(
 173              'course' => $course1->id,
 174              'name' => 'lightwork assignment',
 175              'markingworkflow' => 1,
 176              'markingallocation' => 1
 177          ));
 178  
 179          // Create manual enrolment record.
 180          $enrolid = $DB->insert_record('enrol', (object)array(
 181              'enrol' => 'manual',
 182              'status' => 0,
 183              'courseid' => $course1->id
 184          ));
 185  
 186          // Create the user and give them capabilities.
 187          $context = context_course::instance($course1->id);
 188          $roleid = $this->assignUserCapability('moodle/course:view', $context->id);
 189          $context = context_module::instance($assign1->cmid);
 190          $this->assignUserCapability('mod/assign:view', $context->id, $roleid);
 191  
 192          // Create the user enrolment record.
 193          $DB->insert_record('user_enrolments', (object)array(
 194              'status' => 0,
 195              'enrolid' => $enrolid,
 196              'userid' => $USER->id
 197          ));
 198  
 199          $result = mod_assign_external::get_assignments();
 200  
 201          // We need to execute the return values cleaning process to simulate the web service server.
 202          $result = external_api::clean_returnvalue(mod_assign_external::get_assignments_returns(), $result);
 203  
 204          // Check the course and assignment are returned.
 205          $this->assertEquals(1, count($result['courses']));
 206          $course = $result['courses'][0];
 207          $this->assertEquals('Lightwork Course 1', $course['fullname']);
 208          $this->assertEquals(1, count($course['assignments']));
 209          $assignment = $course['assignments'][0];
 210          $this->assertEquals($assign1->id, $assignment['id']);
 211          $this->assertEquals($course1->id, $assignment['course']);
 212          $this->assertEquals('lightwork assignment', $assignment['name']);
 213          $this->assertEquals(1, $assignment['markingworkflow']);
 214          $this->assertEquals(1, $assignment['markingallocation']);
 215  
 216          $result = mod_assign_external::get_assignments(array($course1->id));
 217  
 218          // We need to execute the return values cleaning process to simulate the web service server.
 219          $result = external_api::clean_returnvalue(mod_assign_external::get_assignments_returns(), $result);
 220  
 221          $this->assertEquals(1, count($result['courses']));
 222          $course = $result['courses'][0];
 223          $this->assertEquals('Lightwork Course 1', $course['fullname']);
 224          $this->assertEquals(1, count($course['assignments']));
 225          $assignment = $course['assignments'][0];
 226          $this->assertEquals($assign1->id, $assignment['id']);
 227          $this->assertEquals($course1->id, $assignment['course']);
 228          $this->assertEquals('lightwork assignment', $assignment['name']);
 229          $this->assertEquals(1, $assignment['markingworkflow']);
 230          $this->assertEquals(1, $assignment['markingallocation']);
 231  
 232          $result = mod_assign_external::get_assignments(array($course2->id));
 233  
 234          // We need to execute the return values cleaning process to simulate the web service server.
 235          $result = external_api::clean_returnvalue(mod_assign_external::get_assignments_returns(), $result);
 236  
 237          $this->assertEquals(0, count($result['courses']));
 238          $this->assertEquals(1, count($result['warnings']));
 239      }
 240  
 241      /**
 242       * Test get_submissions
 243       */
 244      public function test_get_submissions() {
 245          global $DB, $USER;
 246  
 247          $this->resetAfterTest(true);
 248          // Create a course and assignment.
 249          $coursedata['idnumber'] = 'idnumbercourse1';
 250          $coursedata['fullname'] = 'Lightwork Course 1';
 251          $coursedata['summary'] = 'Lightwork Course 1 description';
 252          $coursedata['summaryformat'] = FORMAT_MOODLE;
 253          $course1 = self::getDataGenerator()->create_course($coursedata);
 254  
 255          $assigndata['course'] = $course1->id;
 256          $assigndata['name'] = 'lightwork assignment';
 257  
 258          $assign1 = self::getDataGenerator()->create_module('assign', $assigndata);
 259  
 260          // Create a student with an online text submission.
 261          // First attempt.
 262          $student = self::getDataGenerator()->create_user();
 263          $submission = new stdClass();
 264          $submission->assignment = $assign1->id;
 265          $submission->userid = $student->id;
 266          $submission->timecreated = time();
 267          $submission->timemodified = $submission->timecreated;
 268          $submission->status = 'draft';
 269          $submission->attemptnumber = 0;
 270          $submission->latest = 0;
 271          $sid = $DB->insert_record('assign_submission', $submission);
 272  
 273          // Second attempt.
 274          $submission = new stdClass();
 275          $submission->assignment = $assign1->id;
 276          $submission->userid = $student->id;
 277          $submission->timecreated = time();
 278          $submission->timemodified = $submission->timecreated;
 279          $submission->status = 'submitted';
 280          $submission->attemptnumber = 1;
 281          $submission->latest = 1;
 282          $sid = $DB->insert_record('assign_submission', $submission);
 283          $submission->id = $sid;
 284  
 285          $onlinetextsubmission = new stdClass();
 286          $onlinetextsubmission->onlinetext = "<p>online test text</p>";
 287          $onlinetextsubmission->onlineformat = 1;
 288          $onlinetextsubmission->submission = $submission->id;
 289          $onlinetextsubmission->assignment = $assign1->id;
 290          $DB->insert_record('assignsubmission_onlinetext', $onlinetextsubmission);
 291  
 292          // Create manual enrolment record.
 293          $manualenroldata['enrol'] = 'manual';
 294          $manualenroldata['status'] = 0;
 295          $manualenroldata['courseid'] = $course1->id;
 296          $enrolid = $DB->insert_record('enrol', $manualenroldata);
 297  
 298          // Create a teacher and give them capabilities.
 299          $context = context_course::instance($course1->id);
 300          $roleid = $this->assignUserCapability('moodle/course:viewparticipants', $context->id, 3);
 301          $context = context_module::instance($assign1->cmid);
 302          $this->assignUserCapability('mod/assign:grade', $context->id, $roleid);
 303  
 304          // Create the teacher's enrolment record.
 305          $userenrolmentdata['status'] = 0;
 306          $userenrolmentdata['enrolid'] = $enrolid;
 307          $userenrolmentdata['userid'] = $USER->id;
 308          $DB->insert_record('user_enrolments', $userenrolmentdata);
 309  
 310          $assignmentids[] = $assign1->id;
 311          $result = mod_assign_external::get_submissions($assignmentids);
 312  
 313          // Check the online text submission is returned.
 314          $this->assertEquals(1, count($result['assignments']));
 315          $assignment = $result['assignments'][0];
 316          $this->assertEquals($assign1->id, $assignment['assignmentid']);
 317          $this->assertEquals(1, count($assignment['submissions']));
 318          $submission = $assignment['submissions'][0];
 319          $this->assertEquals($sid, $submission['id']);
 320          $this->assertGreaterThanOrEqual(3, count($submission['plugins']));
 321          $plugins = $submission['plugins'];
 322          foreach ($plugins as $plugin) {
 323              $foundonlinetext = false;
 324              if ($plugin['type'] == 'onlinetext') {
 325                  $foundonlinetext = true;
 326                  break;
 327              }
 328          }
 329          $this->assertTrue($foundonlinetext);
 330      }
 331  
 332      /**
 333       * Test get_user_flags
 334       */
 335      public function test_get_user_flags() {
 336          global $DB, $USER;
 337  
 338          $this->resetAfterTest(true);
 339          // Create a course and assignment.
 340          $coursedata['idnumber'] = 'idnumbercourse';
 341          $coursedata['fullname'] = 'Lightwork Course';
 342          $coursedata['summary'] = 'Lightwork Course description';
 343          $coursedata['summaryformat'] = FORMAT_MOODLE;
 344          $course = self::getDataGenerator()->create_course($coursedata);
 345  
 346          $assigndata['course'] = $course->id;
 347          $assigndata['name'] = 'lightwork assignment';
 348  
 349          $assign = self::getDataGenerator()->create_module('assign', $assigndata);
 350  
 351          // Create a manual enrolment record.
 352          $manualenroldata['enrol'] = 'manual';
 353          $manualenroldata['status'] = 0;
 354          $manualenroldata['courseid'] = $course->id;
 355          $enrolid = $DB->insert_record('enrol', $manualenroldata);
 356  
 357          // Create a teacher and give them capabilities.
 358          $context = context_course::instance($course->id);
 359          $roleid = $this->assignUserCapability('moodle/course:viewparticipants', $context->id, 3);
 360          $context = context_module::instance($assign->cmid);
 361          $this->assignUserCapability('mod/assign:grade', $context->id, $roleid);
 362  
 363          // Create the teacher's enrolment record.
 364          $userenrolmentdata['status'] = 0;
 365          $userenrolmentdata['enrolid'] = $enrolid;
 366          $userenrolmentdata['userid'] = $USER->id;
 367          $DB->insert_record('user_enrolments', $userenrolmentdata);
 368  
 369          // Create a student and give them a user flag record.
 370          $student = self::getDataGenerator()->create_user();
 371          $userflag = new stdClass();
 372          $userflag->assignment = $assign->id;
 373          $userflag->userid = $student->id;
 374          $userflag->locked = 0;
 375          $userflag->mailed = 0;
 376          $userflag->extensionduedate = 0;
 377          $userflag->workflowstate = 'inmarking';
 378          $userflag->allocatedmarker = $USER->id;
 379  
 380          $DB->insert_record('assign_user_flags', $userflag);
 381  
 382          $assignmentids[] = $assign->id;
 383          $result = mod_assign_external::get_user_flags($assignmentids);
 384  
 385          // We need to execute the return values cleaning process to simulate the web service server.
 386          $result = external_api::clean_returnvalue(mod_assign_external::get_user_flags_returns(), $result);
 387  
 388          // Check that the correct user flag information for the student is returned.
 389          $this->assertEquals(1, count($result['assignments']));
 390          $assignment = $result['assignments'][0];
 391          $this->assertEquals($assign->id, $assignment['assignmentid']);
 392          // Should be one user flag record.
 393          $this->assertEquals(1, count($assignment['userflags']));
 394          $userflag = $assignment['userflags'][0];
 395          $this->assertEquals($student->id, $userflag['userid']);
 396          $this->assertEquals(0, $userflag['locked']);
 397          $this->assertEquals(0, $userflag['mailed']);
 398          $this->assertEquals(0, $userflag['extensionduedate']);
 399          $this->assertEquals('inmarking', $userflag['workflowstate']);
 400          $this->assertEquals($USER->id, $userflag['allocatedmarker']);
 401      }
 402  
 403      /**
 404       * Test get_user_mappings
 405       */
 406      public function test_get_user_mappings() {
 407          global $DB, $USER;
 408  
 409          $this->resetAfterTest(true);
 410          // Create a course and assignment.
 411          $coursedata['idnumber'] = 'idnumbercourse';
 412          $coursedata['fullname'] = 'Lightwork Course';
 413          $coursedata['summary'] = 'Lightwork Course description';
 414          $coursedata['summaryformat'] = FORMAT_MOODLE;
 415          $course = self::getDataGenerator()->create_course($coursedata);
 416  
 417          $assigndata['course'] = $course->id;
 418          $assigndata['name'] = 'lightwork assignment';
 419  
 420          $assign = self::getDataGenerator()->create_module('assign', $assigndata);
 421  
 422          // Create a manual enrolment record.
 423          $manualenroldata['enrol'] = 'manual';
 424          $manualenroldata['status'] = 0;
 425          $manualenroldata['courseid'] = $course->id;
 426          $enrolid = $DB->insert_record('enrol', $manualenroldata);
 427  
 428          // Create a teacher and give them capabilities.
 429          $context = context_course::instance($course->id);
 430          $roleid = $this->assignUserCapability('moodle/course:viewparticipants', $context->id, 3);
 431          $context = context_module::instance($assign->cmid);
 432          $this->assignUserCapability('mod/assign:revealidentities', $context->id, $roleid);
 433  
 434          // Create the teacher's enrolment record.
 435          $userenrolmentdata['status'] = 0;
 436          $userenrolmentdata['enrolid'] = $enrolid;
 437          $userenrolmentdata['userid'] = $USER->id;
 438          $DB->insert_record('user_enrolments', $userenrolmentdata);
 439  
 440          // Create a student and give them a user mapping record.
 441          $student = self::getDataGenerator()->create_user();
 442          $mapping = new stdClass();
 443          $mapping->assignment = $assign->id;
 444          $mapping->userid = $student->id;
 445  
 446          $DB->insert_record('assign_user_mapping', $mapping);
 447  
 448          $assignmentids[] = $assign->id;
 449          $result = mod_assign_external::get_user_mappings($assignmentids);
 450  
 451          // We need to execute the return values cleaning process to simulate the web service server.
 452          $result = external_api::clean_returnvalue(mod_assign_external::get_user_mappings_returns(), $result);
 453  
 454          // Check that the correct user mapping information for the student is returned.
 455          $this->assertEquals(1, count($result['assignments']));
 456          $assignment = $result['assignments'][0];
 457          $this->assertEquals($assign->id, $assignment['assignmentid']);
 458          // Should be one user mapping record.
 459          $this->assertEquals(1, count($assignment['mappings']));
 460          $mapping = $assignment['mappings'][0];
 461          $this->assertEquals($student->id, $mapping['userid']);
 462      }
 463  
 464      /**
 465       * Test lock_submissions
 466       */
 467      public function test_lock_submissions() {
 468          global $DB, $USER;
 469  
 470          $this->resetAfterTest(true);
 471          // Create a course and assignment and users.
 472          $course = self::getDataGenerator()->create_course();
 473  
 474          $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
 475          $params['course'] = $course->id;
 476          $params['assignsubmission_onlinetext_enabled'] = 1;
 477          $instance = $generator->create_instance($params);
 478          $cm = get_coursemodule_from_instance('assign', $instance->id);
 479          $context = context_module::instance($cm->id);
 480  
 481          $assign = new assign($context, $cm, $course);
 482  
 483          $student1 = self::getDataGenerator()->create_user();
 484          $student2 = self::getDataGenerator()->create_user();
 485          $studentrole = $DB->get_record('role', array('shortname'=>'student'));
 486          $this->getDataGenerator()->enrol_user($student1->id,
 487                                                $course->id,
 488                                                $studentrole->id);
 489          $this->getDataGenerator()->enrol_user($student2->id,
 490                                                $course->id,
 491                                                $studentrole->id);
 492          $teacher = self::getDataGenerator()->create_user();
 493          $teacherrole = $DB->get_record('role', array('shortname'=>'teacher'));
 494          $this->getDataGenerator()->enrol_user($teacher->id,
 495                                                $course->id,
 496                                                $teacherrole->id);
 497  
 498          // Create a student1 with an online text submission.
 499          // Simulate a submission.
 500          $this->setUser($student1);
 501          $submission = $assign->get_user_submission($student1->id, true);
 502          $data = new stdClass();
 503          $data->onlinetext_editor = array('itemid'=>file_get_unused_draft_itemid(),
 504                                           'text'=>'Submission text',
 505                                           'format'=>FORMAT_MOODLE);
 506          $plugin = $assign->get_submission_plugin_by_type('onlinetext');
 507          $plugin->save($submission, $data);
 508  
 509          // Ready to test.
 510          $this->setUser($teacher);
 511          $students = array($student1->id, $student2->id);
 512          $result = mod_assign_external::lock_submissions($instance->id, $students);
 513  
 514          // Check for 0 warnings.
 515          $this->assertEquals(0, count($result));
 516  
 517          $this->setUser($student2);
 518          $submission = $assign->get_user_submission($student2->id, true);
 519          $data = new stdClass();
 520          $data->onlinetext_editor = array('itemid'=>file_get_unused_draft_itemid(),
 521                                           'text'=>'Submission text',
 522                                           'format'=>FORMAT_MOODLE);
 523          $notices = array();
 524          $this->setExpectedException('moodle_exception');
 525          $assign->save_submission($data, $notices);
 526      }
 527  
 528      /**
 529       * Test unlock_submissions
 530       */
 531      public function test_unlock_submissions() {
 532          global $DB, $USER;
 533  
 534          $this->resetAfterTest(true);
 535          // Create a course and assignment and users.
 536          $course = self::getDataGenerator()->create_course();
 537  
 538          $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
 539          $params['course'] = $course->id;
 540          $params['assignsubmission_onlinetext_enabled'] = 1;
 541          $instance = $generator->create_instance($params);
 542          $cm = get_coursemodule_from_instance('assign', $instance->id);
 543          $context = context_module::instance($cm->id);
 544  
 545          $assign = new assign($context, $cm, $course);
 546  
 547          $student1 = self::getDataGenerator()->create_user();
 548          $student2 = self::getDataGenerator()->create_user();
 549          $studentrole = $DB->get_record('role', array('shortname'=>'student'));
 550          $this->getDataGenerator()->enrol_user($student1->id,
 551                                                $course->id,
 552                                                $studentrole->id);
 553          $this->getDataGenerator()->enrol_user($student2->id,
 554                                                $course->id,
 555                                                $studentrole->id);
 556          $teacher = self::getDataGenerator()->create_user();
 557          $teacherrole = $DB->get_record('role', array('shortname'=>'teacher'));
 558          $this->getDataGenerator()->enrol_user($teacher->id,
 559                                                $course->id,
 560                                                $teacherrole->id);
 561  
 562          // Create a student1 with an online text submission.
 563          // Simulate a submission.
 564          $this->setUser($student1);
 565          $submission = $assign->get_user_submission($student1->id, true);
 566          $data = new stdClass();
 567          $data->onlinetext_editor = array('itemid'=>file_get_unused_draft_itemid(),
 568                                           'text'=>'Submission text',
 569                                           'format'=>FORMAT_MOODLE);
 570          $plugin = $assign->get_submission_plugin_by_type('onlinetext');
 571          $plugin->save($submission, $data);
 572  
 573          // Ready to test.
 574          $this->setUser($teacher);
 575          $students = array($student1->id, $student2->id);
 576          $result = mod_assign_external::lock_submissions($instance->id, $students);
 577  
 578          // Check for 0 warnings.
 579          $this->assertEquals(0, count($result));
 580  
 581          $result = mod_assign_external::unlock_submissions($instance->id, $students);
 582  
 583          // Check for 0 warnings.
 584          $this->assertEquals(0, count($result));
 585  
 586          $this->setUser($student2);
 587          $submission = $assign->get_user_submission($student2->id, true);
 588          $data = new stdClass();
 589          $data->onlinetext_editor = array('itemid'=>file_get_unused_draft_itemid(),
 590                                           'text'=>'Submission text',
 591                                           'format'=>FORMAT_MOODLE);
 592          $notices = array();
 593          $assign->save_submission($data, $notices);
 594      }
 595  
 596      /**
 597       * Test submit_for_grading
 598       */
 599      public function test_submit_for_grading() {
 600          global $DB, $USER;
 601  
 602          $this->resetAfterTest(true);
 603          // Create a course and assignment and users.
 604          $course = self::getDataGenerator()->create_course();
 605  
 606          set_config('submissionreceipts', 0, 'assign');
 607          $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
 608          $params['course'] = $course->id;
 609          $params['assignsubmission_onlinetext_enabled'] = 1;
 610          $params['submissiondrafts'] = 1;
 611          $params['sendnotifications'] = 0;
 612          $params['requiresubmissionstatement'] = 1;
 613          $instance = $generator->create_instance($params);
 614          $cm = get_coursemodule_from_instance('assign', $instance->id);
 615          $context = context_module::instance($cm->id);
 616  
 617          $assign = new assign($context, $cm, $course);
 618  
 619          $student1 = self::getDataGenerator()->create_user();
 620          $studentrole = $DB->get_record('role', array('shortname'=>'student'));
 621          $this->getDataGenerator()->enrol_user($student1->id,
 622                                                $course->id,
 623                                                $studentrole->id);
 624  
 625          // Create a student1 with an online text submission.
 626          // Simulate a submission.
 627          $this->setUser($student1);
 628          $submission = $assign->get_user_submission($student1->id, true);
 629          $data = new stdClass();
 630          $data->onlinetext_editor = array('itemid'=>file_get_unused_draft_itemid(),
 631                                           'text'=>'Submission text',
 632                                           'format'=>FORMAT_MOODLE);
 633          $plugin = $assign->get_submission_plugin_by_type('onlinetext');
 634          $plugin->save($submission, $data);
 635  
 636          $result = mod_assign_external::submit_for_grading($instance->id, false);
 637  
 638          // Should be 1 fail because the submission statement was not aceptted.
 639          $this->assertEquals(1, count($result));
 640  
 641          $result = mod_assign_external::submit_for_grading($instance->id, true);
 642  
 643          // Check for 0 warnings.
 644          $this->assertEquals(0, count($result));
 645  
 646          $submission = $assign->get_user_submission($student1->id, false);
 647  
 648          $this->assertEquals(ASSIGN_SUBMISSION_STATUS_SUBMITTED, $submission->status);
 649      }
 650  
 651      /**
 652       * Test save_user_extensions
 653       */
 654      public function test_save_user_extensions() {
 655          global $DB, $USER;
 656  
 657          $this->resetAfterTest(true);
 658          // Create a course and assignment and users.
 659          $course = self::getDataGenerator()->create_course();
 660  
 661          $teacher = self::getDataGenerator()->create_user();
 662          $teacherrole = $DB->get_record('role', array('shortname'=>'teacher'));
 663          $this->getDataGenerator()->enrol_user($teacher->id,
 664                                                $course->id,
 665                                                $teacherrole->id);
 666          $this->setUser($teacher);
 667  
 668          $now = time();
 669          $yesterday = $now - 24*60*60;
 670          $tomorrow = $now + 24*60*60;
 671          set_config('submissionreceipts', 0, 'assign');
 672          $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
 673          $params['course'] = $course->id;
 674          $params['submissiondrafts'] = 1;
 675          $params['sendnotifications'] = 0;
 676          $params['duedate'] = $yesterday;
 677          $params['cutoffdate'] = $now - 10;
 678          $instance = $generator->create_instance($params);
 679          $cm = get_coursemodule_from_instance('assign', $instance->id);
 680          $context = context_module::instance($cm->id);
 681  
 682          $assign = new assign($context, $cm, $course);
 683  
 684          $student1 = self::getDataGenerator()->create_user();
 685          $studentrole = $DB->get_record('role', array('shortname'=>'student'));
 686          $this->getDataGenerator()->enrol_user($student1->id,
 687                                                $course->id,
 688                                                $studentrole->id);
 689  
 690          $this->setUser($student1);
 691          $result = mod_assign_external::submit_for_grading($instance->id, true);
 692  
 693          // Check for 0 warnings.
 694          $this->assertEquals(1, count($result));
 695  
 696          $this->setUser($teacher);
 697          $result = mod_assign_external::save_user_extensions($instance->id, array($student1->id), array($now, $tomorrow));
 698          $this->assertEquals(1, count($result));
 699  
 700          $this->setUser($teacher);
 701          $result = mod_assign_external::save_user_extensions($instance->id, array($student1->id), array($yesterday - 10));
 702          $this->assertEquals(1, count($result));
 703  
 704          $this->setUser($teacher);
 705          $result = mod_assign_external::save_user_extensions($instance->id, array($student1->id), array($tomorrow));
 706          $this->assertEquals(0, count($result));
 707  
 708          $this->setUser($student1);
 709          $result = mod_assign_external::submit_for_grading($instance->id, true);
 710          $this->assertEquals(0, count($result));
 711  
 712          $this->setUser($student1);
 713          $result = mod_assign_external::save_user_extensions($instance->id, array($student1->id), array($now, $tomorrow));
 714  
 715      }
 716  
 717      /**
 718       * Test reveal_identities
 719       */
 720      public function test_reveal_identities() {
 721          global $DB, $USER;
 722  
 723          $this->resetAfterTest(true);
 724          // Create a course and assignment and users.
 725          $course = self::getDataGenerator()->create_course();
 726  
 727          $teacher = self::getDataGenerator()->create_user();
 728          $teacherrole = $DB->get_record('role', array('shortname'=>'teacher'));
 729          $this->getDataGenerator()->enrol_user($teacher->id,
 730                                                $course->id,
 731                                                $teacherrole->id);
 732          $this->setUser($teacher);
 733  
 734          $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
 735          $params['course'] = $course->id;
 736          $params['submissiondrafts'] = 1;
 737          $params['sendnotifications'] = 0;
 738          $params['blindmarking'] = 1;
 739          $instance = $generator->create_instance($params);
 740          $cm = get_coursemodule_from_instance('assign', $instance->id);
 741          $context = context_module::instance($cm->id);
 742  
 743          $assign = new assign($context, $cm, $course);
 744  
 745          $student1 = self::getDataGenerator()->create_user();
 746          $studentrole = $DB->get_record('role', array('shortname'=>'student'));
 747          $this->getDataGenerator()->enrol_user($student1->id,
 748                                                $course->id,
 749                                                $studentrole->id);
 750  
 751          $this->setUser($student1);
 752          $this->setExpectedException('required_capability_exception');
 753          $result = mod_assign_external::reveal_identities($instance->id);
 754          $this->assertEquals(1, count($result));
 755          $this->assertEquals(true, $assign->is_blind_marking());
 756  
 757          $this->setUser($teacher);
 758          $result = mod_assign_external::reveal_identities($instance->id);
 759          $this->assertEquals(0, count($result));
 760          $this->assertEquals(false, $assign->is_blind_marking());
 761  
 762          $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
 763          $params['course'] = $course->id;
 764          $params['submissiondrafts'] = 1;
 765          $params['sendnotifications'] = 0;
 766          $params['blindmarking'] = 0;
 767          $instance = $generator->create_instance($params);
 768          $cm = get_coursemodule_from_instance('assign', $instance->id);
 769          $context = context_module::instance($cm->id);
 770  
 771          $assign = new assign($context, $cm, $course);
 772          $result = mod_assign_external::reveal_identities($instance->id);
 773          $this->assertEquals(1, count($result));
 774          $this->assertEquals(false, $assign->is_blind_marking());
 775  
 776      }
 777  
 778      /**
 779       * Test revert_submissions_to_draft
 780       */
 781      public function test_revert_submissions_to_draft() {
 782          global $DB, $USER;
 783  
 784          $this->resetAfterTest(true);
 785          set_config('submissionreceipts', 0, 'assign');
 786          // Create a course and assignment and users.
 787          $course = self::getDataGenerator()->create_course();
 788  
 789          $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
 790          $params['course'] = $course->id;
 791          $params['sendnotifications'] = 0;
 792          $params['submissiondrafts'] = 1;
 793          $instance = $generator->create_instance($params);
 794          $cm = get_coursemodule_from_instance('assign', $instance->id);
 795          $context = context_module::instance($cm->id);
 796  
 797          $assign = new assign($context, $cm, $course);
 798  
 799          $student1 = self::getDataGenerator()->create_user();
 800          $student2 = self::getDataGenerator()->create_user();
 801          $studentrole = $DB->get_record('role', array('shortname'=>'student'));
 802          $this->getDataGenerator()->enrol_user($student1->id,
 803                                                $course->id,
 804                                                $studentrole->id);
 805          $this->getDataGenerator()->enrol_user($student2->id,
 806                                                $course->id,
 807                                                $studentrole->id);
 808          $teacher = self::getDataGenerator()->create_user();
 809          $teacherrole = $DB->get_record('role', array('shortname'=>'teacher'));
 810          $this->getDataGenerator()->enrol_user($teacher->id,
 811                                                $course->id,
 812                                                $teacherrole->id);
 813  
 814          // Create a student1 with an online text submission.
 815          // Simulate a submission.
 816          $this->setUser($student1);
 817          $result = mod_assign_external::submit_for_grading($instance->id, true);
 818          $this->assertEquals(0, count($result));
 819  
 820          // Ready to test.
 821          $this->setUser($teacher);
 822          $students = array($student1->id, $student2->id);
 823          $result = mod_assign_external::revert_submissions_to_draft($instance->id, array($student1->id));
 824  
 825          // Check for 0 warnings.
 826          $this->assertEquals(0, count($result));
 827  
 828      }
 829  
 830      /**
 831       * Test save_submission
 832       */
 833      public function test_save_submission() {
 834          global $DB, $USER;
 835  
 836          $this->resetAfterTest(true);
 837          // Create a course and assignment and users.
 838          $course = self::getDataGenerator()->create_course();
 839  
 840          $teacher = self::getDataGenerator()->create_user();
 841          $teacherrole = $DB->get_record('role', array('shortname'=>'teacher'));
 842          $this->getDataGenerator()->enrol_user($teacher->id,
 843                                                $course->id,
 844                                                $teacherrole->id);
 845          $this->setUser($teacher);
 846  
 847          $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
 848          $params['course'] = $course->id;
 849          $params['assignsubmission_onlinetext_enabled'] = 1;
 850          $params['assignsubmission_file_enabled'] = 1;
 851          $params['assignsubmission_file_maxfiles'] = 5;
 852          $params['assignsubmission_file_maxsizebytes'] = 1024*1024;
 853          $instance = $generator->create_instance($params);
 854          $cm = get_coursemodule_from_instance('assign', $instance->id);
 855          $context = context_module::instance($cm->id);
 856  
 857          $assign = new assign($context, $cm, $course);
 858  
 859          $student1 = self::getDataGenerator()->create_user();
 860          $student2 = self::getDataGenerator()->create_user();
 861          $studentrole = $DB->get_record('role', array('shortname'=>'student'));
 862          $this->getDataGenerator()->enrol_user($student1->id,
 863                                                $course->id,
 864                                                $studentrole->id);
 865          $this->getDataGenerator()->enrol_user($student2->id,
 866                                                $course->id,
 867                                                $studentrole->id);
 868          // Create a student1 with an online text submission.
 869          // Simulate a submission.
 870          $this->setUser($student1);
 871  
 872          // Create a file in a draft area.
 873          $draftidfile = file_get_unused_draft_itemid();
 874  
 875          $usercontext = context_user::instance($student1->id);
 876          $filerecord = array(
 877              'contextid' => $usercontext->id,
 878              'component' => 'user',
 879              'filearea'  => 'draft',
 880              'itemid'    => $draftidfile,
 881              'filepath'  => '/',
 882              'filename'  => 'testtext.txt',
 883          );
 884  
 885          $fs = get_file_storage();
 886          $fs->create_file_from_string($filerecord, 'text contents');
 887  
 888          // Create another file in a different draft area.
 889          $draftidonlinetext = file_get_unused_draft_itemid();
 890  
 891          $filerecord = array(
 892              'contextid' => $usercontext->id,
 893              'component' => 'user',
 894              'filearea'  => 'draft',
 895              'itemid'    => $draftidonlinetext,
 896              'filepath'  => '/',
 897              'filename'  => 'shouldbeanimage.txt',
 898          );
 899  
 900          $fs->create_file_from_string($filerecord, 'image contents (not really)');
 901  
 902          // Now try a submission.
 903          $submissionpluginparams = array();
 904          $submissionpluginparams['files_filemanager'] = $draftidfile;
 905          $onlinetexteditorparams = array('text'=>'Yeeha!',
 906                                          'format'=>1,
 907                                          'itemid'=>$draftidonlinetext);
 908          $submissionpluginparams['onlinetext_editor'] = $onlinetexteditorparams;
 909          $result = mod_assign_external::save_submission($instance->id, $submissionpluginparams);
 910  
 911          $this->assertEquals(0, count($result));
 912  
 913      }
 914  
 915      /**
 916       * Test save_grade
 917       */
 918      public function test_save_grade() {
 919          global $DB, $USER;
 920  
 921          $this->resetAfterTest(true);
 922          // Create a course and assignment and users.
 923          $course = self::getDataGenerator()->create_course();
 924  
 925          $teacher = self::getDataGenerator()->create_user();
 926          $teacherrole = $DB->get_record('role', array('shortname'=>'teacher'));
 927          $this->getDataGenerator()->enrol_user($teacher->id,
 928                                                $course->id,
 929                                                $teacherrole->id);
 930          $this->setUser($teacher);
 931  
 932          $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
 933          $params['course'] = $course->id;
 934          $params['assignfeedback_file_enabled'] = 1;
 935          $params['assignfeedback_comments_enabled'] = 1;
 936          $instance = $generator->create_instance($params);
 937          $cm = get_coursemodule_from_instance('assign', $instance->id);
 938          $context = context_module::instance($cm->id);
 939  
 940          $assign = new assign($context, $cm, $course);
 941  
 942          $student1 = self::getDataGenerator()->create_user();
 943          $student2 = self::getDataGenerator()->create_user();
 944          $studentrole = $DB->get_record('role', array('shortname' => 'student'));
 945          $this->getDataGenerator()->enrol_user($student1->id,
 946                                                $course->id,
 947                                                $studentrole->id);
 948          $this->getDataGenerator()->enrol_user($student2->id,
 949                                                $course->id,
 950                                                $studentrole->id);
 951          // Simulate a grade.
 952          $this->setUser($teacher);
 953  
 954          // Create a file in a draft area.
 955          $draftidfile = file_get_unused_draft_itemid();
 956  
 957          $usercontext = context_user::instance($teacher->id);
 958          $filerecord = array(
 959              'contextid' => $usercontext->id,
 960              'component' => 'user',
 961              'filearea'  => 'draft',
 962              'itemid'    => $draftidfile,
 963              'filepath'  => '/',
 964              'filename'  => 'testtext.txt',
 965          );
 966  
 967          $fs = get_file_storage();
 968          $fs->create_file_from_string($filerecord, 'text contents');
 969  
 970          // Now try a grade.
 971          $feedbackpluginparams = array();
 972          $feedbackpluginparams['files_filemanager'] = $draftidfile;
 973          $feedbackeditorparams = array('text' => 'Yeeha!',
 974                                          'format' => 1);
 975          $feedbackpluginparams['assignfeedbackcomments_editor'] = $feedbackeditorparams;
 976          $result = mod_assign_external::save_grade($instance->id,
 977                                                    $student1->id,
 978                                                    50.0,
 979                                                    -1,
 980                                                    true,
 981                                                    'released',
 982                                                    false,
 983                                                    $feedbackpluginparams);
 984  
 985          // No warnings.
 986          $this->assertEquals(0, count($result));
 987  
 988          $result = mod_assign_external::get_grades(array($instance->id));
 989  
 990          $this->assertEquals($result['assignments'][0]['grades'][0]['grade'], '50.0');
 991      }
 992  
 993      /**
 994       * Test save grades with advanced grading data
 995       */
 996      public function test_save_grades_with_advanced_grading() {
 997          global $DB, $USER;
 998  
 999          $this->resetAfterTest(true);
1000          // Create a course and assignment and users.
1001          $course = self::getDataGenerator()->create_course();
1002  
1003          $teacher = self::getDataGenerator()->create_user();
1004          $teacherrole = $DB->get_record('role', array('shortname' => 'teacher'));
1005          $this->getDataGenerator()->enrol_user($teacher->id,
1006                                                $course->id,
1007                                                $teacherrole->id);
1008  
1009          $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
1010          $params['course'] = $course->id;
1011          $params['assignfeedback_file_enabled'] = 0;
1012          $params['assignfeedback_comments_enabled'] = 0;
1013          $instance = $generator->create_instance($params);
1014          $cm = get_coursemodule_from_instance('assign', $instance->id);
1015          $context = context_module::instance($cm->id);
1016  
1017          $assign = new assign($context, $cm, $course);
1018  
1019          $student1 = self::getDataGenerator()->create_user();
1020          $student2 = self::getDataGenerator()->create_user();
1021          $studentrole = $DB->get_record('role', array('shortname' => 'student'));
1022          $this->getDataGenerator()->enrol_user($student1->id,
1023                                                $course->id,
1024                                                $studentrole->id);
1025          $this->getDataGenerator()->enrol_user($student2->id,
1026                                                $course->id,
1027                                                $studentrole->id);
1028  
1029          $this->setUser($teacher);
1030  
1031          $feedbackpluginparams = array();
1032          $feedbackpluginparams['files_filemanager'] = 0;
1033          $feedbackeditorparams = array('text' => '', 'format' => 1);
1034          $feedbackpluginparams['assignfeedbackcomments_editor'] = $feedbackeditorparams;
1035  
1036          // Create advanced grading data.
1037          // Create grading area.
1038          $gradingarea = array(
1039              'contextid' => $context->id,
1040              'component' => 'mod_assign',
1041              'areaname' => 'submissions',
1042              'activemethod' => 'rubric'
1043          );
1044          $areaid = $DB->insert_record('grading_areas', $gradingarea);
1045  
1046          // Create a rubric grading definition.
1047          $rubricdefinition = array (
1048              'areaid' => $areaid,
1049              'method' => 'rubric',
1050              'name' => 'test',
1051              'status' => 20,
1052              'copiedfromid' => 1,
1053              'timecreated' => 1,
1054              'usercreated' => $teacher->id,
1055              'timemodified' => 1,
1056              'usermodified' => $teacher->id,
1057              'timecopied' => 0
1058          );
1059          $definitionid = $DB->insert_record('grading_definitions', $rubricdefinition);
1060  
1061          // Create a criterion with a level.
1062          $rubriccriteria = array (
1063               'definitionid' => $definitionid,
1064               'sortorder' => 1,
1065               'description' => 'Demonstrate an understanding of disease control',
1066               'descriptionformat' => 0
1067          );
1068          $criterionid = $DB->insert_record('gradingform_rubric_criteria', $rubriccriteria);
1069          $rubriclevel1 = array (
1070              'criterionid' => $criterionid,
1071              'score' => 50,
1072              'definition' => 'pass',
1073              'definitionformat' => 0
1074          );
1075          $rubriclevel2 = array (
1076              'criterionid' => $criterionid,
1077              'score' => 100,
1078              'definition' => 'excellent',
1079              'definitionformat' => 0
1080          );
1081          $rubriclevel3 = array (
1082              'criterionid' => $criterionid,
1083              'score' => 0,
1084              'definition' => 'fail',
1085              'definitionformat' => 0
1086          );
1087          $levelid1 = $DB->insert_record('gradingform_rubric_levels', $rubriclevel1);
1088          $levelid2 = $DB->insert_record('gradingform_rubric_levels', $rubriclevel2);
1089          $levelid3 = $DB->insert_record('gradingform_rubric_levels', $rubriclevel3);
1090  
1091          // Create the filling.
1092          $student1filling = array (
1093              'criterionid' => $criterionid,
1094              'levelid' => $levelid1,
1095              'remark' => 'well done you passed',
1096              'remarkformat' => 0
1097          );
1098  
1099          $student2filling = array (
1100              'criterionid' => $criterionid,
1101              'levelid' => $levelid2,
1102              'remark' => 'Excellent work',
1103              'remarkformat' => 0
1104          );
1105  
1106          $student1criteria = array(array('criterionid' => $criterionid, 'fillings' => array($student1filling)));
1107          $student1advancedgradingdata = array('rubric' => array('criteria' => $student1criteria));
1108  
1109          $student2criteria = array(array('criterionid' => $criterionid, 'fillings' => array($student2filling)));
1110          $student2advancedgradingdata = array('rubric' => array('criteria' => $student2criteria));
1111  
1112          $grades = array();
1113          $student1gradeinfo = array();
1114          $student1gradeinfo['userid'] = $student1->id;
1115          $student1gradeinfo['grade'] = 0; // Ignored since advanced grading is being used.
1116          $student1gradeinfo['attemptnumber'] = -1;
1117          $student1gradeinfo['addattempt'] = true;
1118          $student1gradeinfo['workflowstate'] = 'released';
1119          $student1gradeinfo['plugindata'] = $feedbackpluginparams;
1120          $student1gradeinfo['advancedgradingdata'] = $student1advancedgradingdata;
1121          $grades[] = $student1gradeinfo;
1122  
1123          $student2gradeinfo = array();
1124          $student2gradeinfo['userid'] = $student2->id;
1125          $student2gradeinfo['grade'] = 0; // Ignored since advanced grading is being used.
1126          $student2gradeinfo['attemptnumber'] = -1;
1127          $student2gradeinfo['addattempt'] = true;
1128          $student2gradeinfo['workflowstate'] = 'released';
1129          $student2gradeinfo['plugindata'] = $feedbackpluginparams;
1130          $student2gradeinfo['advancedgradingdata'] = $student2advancedgradingdata;
1131          $grades[] = $student2gradeinfo;
1132  
1133          $result = mod_assign_external::save_grades($instance->id, false, $grades);
1134          // No warnings.
1135          $this->assertEquals(0, count($result));
1136  
1137          $student1grade = $DB->get_record('assign_grades',
1138                                           array('userid' => $student1->id, 'assignment' => $instance->id),
1139                                           '*',
1140                                           MUST_EXIST);
1141          $this->assertEquals($student1grade->grade, '50.0');
1142  
1143          $student2grade = $DB->get_record('assign_grades',
1144                                           array('userid' => $student2->id, 'assignment' => $instance->id),
1145                                           '*',
1146                                           MUST_EXIST);
1147          $this->assertEquals($student2grade->grade, '100.0');
1148      }
1149  
1150      /**
1151       * Test save grades for a team submission
1152       */
1153      public function test_save_grades_with_group_submission() {
1154          global $DB, $USER, $CFG;
1155          require_once($CFG->dirroot . '/group/lib.php');
1156  
1157          $this->resetAfterTest(true);
1158          // Create a course and assignment and users.
1159          $course = self::getDataGenerator()->create_course();
1160  
1161          $teacher = self::getDataGenerator()->create_user();
1162          $teacherrole = $DB->get_record('role', array('shortname' => 'teacher'));
1163          $this->getDataGenerator()->enrol_user($teacher->id,
1164                                                $course->id,
1165                                                $teacherrole->id);
1166  
1167          $groupingdata = array();
1168          $groupingdata['courseid'] = $course->id;
1169          $groupingdata['name'] = 'Group assignment grouping';
1170  
1171          $grouping = self::getDataGenerator()->create_grouping($groupingdata);
1172  
1173          $group1data = array();
1174          $group1data['courseid'] = $course->id;
1175          $group1data['name'] = 'Team 1';
1176          $group2data = array();
1177          $group2data['courseid'] = $course->id;
1178          $group2data['name'] = 'Team 2';
1179  
1180          $group1 = self::getDataGenerator()->create_group($group1data);
1181          $group2 = self::getDataGenerator()->create_group($group2data);
1182  
1183          groups_assign_grouping($grouping->id, $group1->id);
1184          groups_assign_grouping($grouping->id, $group2->id);
1185  
1186          $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
1187          $params['course'] = $course->id;
1188          $params['teamsubmission'] = 1;
1189          $params['teamsubmissiongroupingid'] = $grouping->id;
1190          $instance = $generator->create_instance($params);
1191          $cm = get_coursemodule_from_instance('assign', $instance->id);
1192          $context = context_module::instance($cm->id);
1193  
1194          $assign = new assign($context, $cm, $course);
1195  
1196          $student1 = self::getDataGenerator()->create_user();
1197          $student2 = self::getDataGenerator()->create_user();
1198          $student3 = self::getDataGenerator()->create_user();
1199          $student4 = self::getDataGenerator()->create_user();
1200          $studentrole = $DB->get_record('role', array('shortname' => 'student'));
1201          $this->getDataGenerator()->enrol_user($student1->id,
1202                                                $course->id,
1203                                                $studentrole->id);
1204          $this->getDataGenerator()->enrol_user($student2->id,
1205                                                $course->id,
1206                                                $studentrole->id);
1207          $this->getDataGenerator()->enrol_user($student3->id,
1208                                                $course->id,
1209                                                $studentrole->id);
1210          $this->getDataGenerator()->enrol_user($student4->id,
1211                                                $course->id,
1212                                                $studentrole->id);
1213  
1214          groups_add_member($group1->id, $student1->id);
1215          groups_add_member($group1->id, $student2->id);
1216          groups_add_member($group1->id, $student3->id);
1217          groups_add_member($group2->id, $student4->id);
1218          $this->setUser($teacher);
1219  
1220          $feedbackpluginparams = array();
1221          $feedbackpluginparams['files_filemanager'] = 0;
1222          $feedbackeditorparams = array('text' => '', 'format' => 1);
1223          $feedbackpluginparams['assignfeedbackcomments_editor'] = $feedbackeditorparams;
1224  
1225          $grades1 = array();
1226          $student1gradeinfo = array();
1227          $student1gradeinfo['userid'] = $student1->id;
1228          $student1gradeinfo['grade'] = 50;
1229          $student1gradeinfo['attemptnumber'] = -1;
1230          $student1gradeinfo['addattempt'] = true;
1231          $student1gradeinfo['workflowstate'] = 'released';
1232          $student1gradeinfo['plugindata'] = $feedbackpluginparams;
1233          $grades1[] = $student1gradeinfo;
1234  
1235          $student2gradeinfo = array();
1236          $student2gradeinfo['userid'] = $student2->id;
1237          $student2gradeinfo['grade'] = 75;
1238          $student2gradeinfo['attemptnumber'] = -1;
1239          $student2gradeinfo['addattempt'] = true;
1240          $student2gradeinfo['workflowstate'] = 'released';
1241          $student2gradeinfo['plugindata'] = $feedbackpluginparams;
1242          $grades1[] = $student2gradeinfo;
1243  
1244          $this->setExpectedException('invalid_parameter_exception');
1245          // Expect an exception since 2 grades have been submitted for the same team.
1246          $result = mod_assign_external::save_grades($instance->id, true, $grades1);
1247  
1248          $grades2 = array();
1249          $student3gradeinfo = array();
1250          $student3gradeinfo['userid'] = $student3->id;
1251          $student3gradeinfo['grade'] = 50;
1252          $student3gradeinfo['attemptnumber'] = -1;
1253          $student3gradeinfo['addattempt'] = true;
1254          $student3gradeinfo['workflowstate'] = 'released';
1255          $student3gradeinfo['plugindata'] = $feedbackpluginparams;
1256          $grades2[] = $student3gradeinfo;
1257  
1258          $student4gradeinfo = array();
1259          $student4gradeinfo['userid'] = $student4->id;
1260          $student4gradeinfo['grade'] = 75;
1261          $student4gradeinfo['attemptnumber'] = -1;
1262          $student4gradeinfo['addattempt'] = true;
1263          $student4gradeinfo['workflowstate'] = 'released';
1264          $student4gradeinfo['plugindata'] = $feedbackpluginparams;
1265          $grades2[] = $student4gradeinfo;
1266          $result = mod_assign_external::save_grades($instance->id, true, $grades2);
1267          // There should be no warnings.
1268          $this->assertEquals(0, count($result));
1269  
1270          $student3grade = $DB->get_record('assign_grades',
1271                                           array('userid' => $student3->id, 'assignment' => $instance->id),
1272                                           '*',
1273                                           MUST_EXIST);
1274          $this->assertEquals($student3grade->grade, '50.0');
1275  
1276          $student4grade = $DB->get_record('assign_grades',
1277                                           array('userid' => $student4->id, 'assignment' => $instance->id),
1278                                           '*',
1279                                           MUST_EXIST);
1280          $this->assertEquals($student4grade->grade, '75.0');
1281      }
1282  
1283      /**
1284       * Test copy_previous_attempt
1285       */
1286      public function test_copy_previous_attempt() {
1287          global $DB, $USER;
1288  
1289          $this->resetAfterTest(true);
1290          // Create a course and assignment and users.
1291          $course = self::getDataGenerator()->create_course();
1292  
1293          $teacher = self::getDataGenerator()->create_user();
1294          $teacherrole = $DB->get_record('role', array('shortname'=>'teacher'));
1295          $this->getDataGenerator()->enrol_user($teacher->id,
1296                                                $course->id,
1297                                                $teacherrole->id);
1298          $this->setUser($teacher);
1299  
1300          $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
1301          $params['course'] = $course->id;
1302          $params['assignsubmission_onlinetext_enabled'] = 1;
1303          $params['assignsubmission_file_enabled'] = 0;
1304          $params['assignfeedback_file_enabled'] = 0;
1305          $params['attemptreopenmethod'] = 'manual';
1306          $params['maxattempts'] = 5;
1307          $instance = $generator->create_instance($params);
1308          $cm = get_coursemodule_from_instance('assign', $instance->id);
1309          $context = context_module::instance($cm->id);
1310  
1311          $assign = new assign($context, $cm, $course);
1312  
1313          $student1 = self::getDataGenerator()->create_user();
1314          $studentrole = $DB->get_record('role', array('shortname'=>'student'));
1315          $this->getDataGenerator()->enrol_user($student1->id,
1316                                                $course->id,
1317                                                $studentrole->id);
1318          // Now try a submission.
1319          $this->setUser($student1);
1320          $draftidonlinetext = file_get_unused_draft_itemid();
1321          $submissionpluginparams = array();
1322          $onlinetexteditorparams = array('text'=>'Yeeha!',
1323                                          'format'=>1,
1324                                          'itemid'=>$draftidonlinetext);
1325          $submissionpluginparams['onlinetext_editor'] = $onlinetexteditorparams;
1326          $submissionpluginparams['files_filemanager'] = file_get_unused_draft_itemid();
1327          $result = mod_assign_external::save_submission($instance->id, $submissionpluginparams);
1328  
1329          $this->setUser($teacher);
1330          // Add a grade and reopen the attempt.
1331          // Now try a grade.
1332          $feedbackpluginparams = array();
1333          $feedbackpluginparams['files_filemanager'] = file_get_unused_draft_itemid();
1334          $feedbackeditorparams = array('text'=>'Yeeha!',
1335                                          'format'=>1);
1336          $feedbackpluginparams['assignfeedbackcomments_editor'] = $feedbackeditorparams;
1337          $result = mod_assign_external::save_grade($instance->id,
1338                                                    $student1->id,
1339                                                    50.0,
1340                                                    -1,
1341                                                    true,
1342                                                    'released',
1343                                                    false,
1344                                                    $feedbackpluginparams);
1345  
1346          $this->setUser($student1);
1347          // Now copy the previous attempt.
1348          $result = mod_assign_external::copy_previous_attempt($instance->id);
1349          // No warnings.
1350          $this->assertEquals(0, count($result));
1351  
1352          $this->setUser($teacher);
1353          $result = mod_assign_external::get_submissions(array($instance->id));
1354  
1355          // Check we are now on the second attempt.
1356          $this->assertEquals($result['assignments'][0]['submissions'][0]['attemptnumber'], 1);
1357          // Check the plugins data is not empty.
1358          $this->assertNotEmpty($result['assignments'][0]['submissions'][0]['plugins']);
1359  
1360      }
1361  
1362      /**
1363       * Test set_user_flags
1364       */
1365      public function test_set_user_flags() {
1366          global $DB, $USER;
1367  
1368          $this->resetAfterTest(true);
1369          // Create a course and assignment.
1370          $coursedata['idnumber'] = 'idnumbercourse';
1371          $coursedata['fullname'] = 'Lightwork Course';
1372          $coursedata['summary'] = 'Lightwork Course description';
1373          $coursedata['summaryformat'] = FORMAT_MOODLE;
1374          $course = self::getDataGenerator()->create_course($coursedata);
1375  
1376          $assigndata['course'] = $course->id;
1377          $assigndata['name'] = 'lightwork assignment';
1378  
1379          $assign = self::getDataGenerator()->create_module('assign', $assigndata);
1380  
1381          // Create a manual enrolment record.
1382          $manualenroldata['enrol'] = 'manual';
1383          $manualenroldata['status'] = 0;
1384          $manualenroldata['courseid'] = $course->id;
1385          $enrolid = $DB->insert_record('enrol', $manualenroldata);
1386  
1387          // Create a teacher and give them capabilities.
1388          $context = context_course::instance($course->id);
1389          $roleid = $this->assignUserCapability('moodle/course:viewparticipants', $context->id, 3);
1390          $context = context_module::instance($assign->cmid);
1391          $this->assignUserCapability('mod/assign:grade', $context->id, $roleid);
1392  
1393          // Create the teacher's enrolment record.
1394          $userenrolmentdata['status'] = 0;
1395          $userenrolmentdata['enrolid'] = $enrolid;
1396          $userenrolmentdata['userid'] = $USER->id;
1397          $DB->insert_record('user_enrolments', $userenrolmentdata);
1398  
1399          // Create a student.
1400          $student = self::getDataGenerator()->create_user();
1401  
1402          // Create test user flags record.
1403          $userflags = array();
1404          $userflag['userid'] = $student->id;
1405          $userflag['workflowstate'] = 'inmarking';
1406          $userflag['allocatedmarker'] = $USER->id;
1407          $userflags = array($userflag);
1408  
1409          $createduserflags = mod_assign_external::set_user_flags($assign->id, $userflags);
1410          // We need to execute the return values cleaning process to simulate the web service server.
1411          $createduserflags = external_api::clean_returnvalue(mod_assign_external::set_user_flags_returns(), $createduserflags);
1412  
1413          $this->assertEquals($student->id, $createduserflags[0]['userid']);
1414          $createduserflag = $DB->get_record('assign_user_flags', array('id' => $createduserflags[0]['id']));
1415  
1416          // Confirm that all data was inserted correctly.
1417          $this->assertEquals($student->id,  $createduserflag->userid);
1418          $this->assertEquals($assign->id, $createduserflag->assignment);
1419          $this->assertEquals(0, $createduserflag->locked);
1420          $this->assertEquals(2, $createduserflag->mailed);
1421          $this->assertEquals(0, $createduserflag->extensionduedate);
1422          $this->assertEquals('inmarking', $createduserflag->workflowstate);
1423          $this->assertEquals($USER->id, $createduserflag->allocatedmarker);
1424  
1425          // Create update data.
1426          $userflags = array();
1427          $userflag['userid'] = $createduserflag->userid;
1428          $userflag['workflowstate'] = 'readyforreview';
1429          $userflags = array($userflag);
1430  
1431          $updateduserflags = mod_assign_external::set_user_flags($assign->id, $userflags);
1432          // We need to execute the return values cleaning process to simulate the web service server.
1433          $updateduserflags = external_api::clean_returnvalue(mod_assign_external::set_user_flags_returns(), $updateduserflags);
1434  
1435          $this->assertEquals($student->id, $updateduserflags[0]['userid']);
1436          $updateduserflag = $DB->get_record('assign_user_flags', array('id' => $updateduserflags[0]['id']));
1437  
1438          // Confirm that all data was updated correctly.
1439          $this->assertEquals($student->id,  $updateduserflag->userid);
1440          $this->assertEquals($assign->id, $updateduserflag->assignment);
1441          $this->assertEquals(0, $updateduserflag->locked);
1442          $this->assertEquals(2, $updateduserflag->mailed);
1443          $this->assertEquals(0, $updateduserflag->extensionduedate);
1444          $this->assertEquals('readyforreview', $updateduserflag->workflowstate);
1445          $this->assertEquals($USER->id, $updateduserflag->allocatedmarker);
1446      }
1447  
1448  }


Generated: Fri Nov 28 20:29:05 2014 Cross-referenced by PHPXref 0.7.1