/** * Test get_assignments */ public function test_get_assignments() { global $DB, $USER; $this->resetAfterTest(true); $category = self::getDataGenerator()->create_category(array('name' => 'Test category')); // Create a course. $course1 = self::getDataGenerator()->create_course(array('idnumber' => 'idnumbercourse1', 'fullname' => 'Lightwork Course 1', 'summary' => 'Lightwork Course 1 description', 'summaryformat' => FORMAT_MOODLE, 'category' => $category->id)); // Create a second course, just for testing. $course2 = self::getDataGenerator()->create_course(array('idnumber' => 'idnumbercourse2', 'fullname' => 'Lightwork Course 2', 'summary' => 'Lightwork Course 2 description', 'summaryformat' => FORMAT_MOODLE, 'category' => $category->id)); // Create the assignment module. $assign1 = self::getDataGenerator()->create_module('assign', array('course' => $course1->id, 'name' => 'lightwork assignment')); // Create manual enrolment record. $enrolid = $DB->insert_record('enrol', (object) array('enrol' => 'manual', 'status' => 0, 'courseid' => $course1->id)); // Create the user and give them capabilities. $context = context_course::instance($course1->id); $roleid = $this->assignUserCapability('moodle/course:view', $context->id); $context = context_module::instance($assign1->id); $this->assignUserCapability('mod/assign:view', $context->id, $roleid); // Create the user enrolment record. $DB->insert_record('user_enrolments', (object) array('status' => 0, 'enrolid' => $enrolid, 'userid' => $USER->id)); $result = mod_assign_external::get_assignments(); // Check the course and assignment are returned. $this->assertEquals(1, count($result['courses'])); $course = $result['courses'][0]; $this->assertEquals('Lightwork Course 1', $course['fullname']); $this->assertEquals(1, count($course['assignments'])); $assignment = $course['assignments'][0]; $this->assertEquals($assign1->id, $assignment['id']); $this->assertEquals($course1->id, $assignment['course']); $this->assertEquals('lightwork assignment', $assignment['name']); $result = mod_assign_external::get_assignments(array($course1->id)); $this->assertEquals(1, count($result['courses'])); $course = $result['courses'][0]; $this->assertEquals('Lightwork Course 1', $course['fullname']); $this->assertEquals(1, count($course['assignments'])); $assignment = $course['assignments'][0]; $this->assertEquals($assign1->id, $assignment['id']); $this->assertEquals($course1->id, $assignment['course']); $this->assertEquals('lightwork assignment', $assignment['name']); $result = mod_assign_external::get_assignments(array($course2->id)); $this->assertEquals(0, count($result['courses'])); $this->assertEquals(1, count($result['warnings'])); }
/** * Test for the type of the user-related properties in mod_assign_external::list_participants_returns(). */ public function test_list_participants_returns_user_property_types() { // Get user properties. $userdesc = core_user_external::user_description(); $this->assertTrue(isset($userdesc->keys)); $userproperties = array_keys($userdesc->keys); // Get returns description for mod_assign_external::list_participants_returns(). $listreturns = mod_assign_external::list_participants_returns(); $this->assertTrue(isset($listreturns->content)); $listreturnsdesc = $listreturns->content->keys; // Iterate over list returns description's keys. foreach ($listreturnsdesc as $key => $desc) { // Check if key exists in user properties and the description has a type attribute. if (in_array($key, $userproperties) && isset($desc->type)) { try { // The core_user::get_property_type() method might throw a coding_exception since // core_user_external::user_description() might contain properties that are not yet included in // core_user's $propertiescache. $propertytype = core_user::get_property_type($key); // Assert that user-related property types match those of the defined in core_user. $this->assertEquals($propertytype, $desc->type); } catch (coding_exception $e) { // All good. } } } }
/** * Test test_view_assign */ public function test_view_assign() { global $CFG; $CFG->enablecompletion = 1; $this->resetAfterTest(); $this->setAdminUser(); // Setup test data. $course = $this->getDataGenerator()->create_course(array('enablecompletion' => 1)); $assign = $this->getDataGenerator()->create_module('assign', array('course' => $course->id), array('completion' => 2, 'completionview' => 1)); $context = context_module::instance($assign->cmid); $cm = get_coursemodule_from_instance('assign', $assign->id); $result = mod_assign_external::view_assign($assign->id); $result = external_api::clean_returnvalue(mod_assign_external::view_assign_returns(), $result); $this->assertTrue($result['status']); $this->assertEmpty($result['warnings']); // Check completion status. $completion = new completion_info($course); $completiondata = $completion->get_data($cm); $this->assertEquals(1, $completiondata->completionstate); }
/** * Test set_user_flags */ public function test_set_user_flags() { global $DB, $USER; $this->resetAfterTest(true); // Create a course and assignment. $coursedata['idnumber'] = 'idnumbercourse'; $coursedata['fullname'] = 'Lightwork Course'; $coursedata['summary'] = 'Lightwork Course description'; $coursedata['summaryformat'] = FORMAT_MOODLE; $course = self::getDataGenerator()->create_course($coursedata); $assigndata['course'] = $course->id; $assigndata['name'] = 'lightwork assignment'; $assign = self::getDataGenerator()->create_module('assign', $assigndata); // Create a manual enrolment record. $manualenroldata['enrol'] = 'manual'; $manualenroldata['status'] = 0; $manualenroldata['courseid'] = $course->id; $enrolid = $DB->insert_record('enrol', $manualenroldata); // Create a teacher and give them capabilities. $context = context_course::instance($course->id); $roleid = $this->assignUserCapability('moodle/course:viewparticipants', $context->id, 3); $context = context_module::instance($assign->cmid); $this->assignUserCapability('mod/assign:grade', $context->id, $roleid); // Create the teacher's enrolment record. $userenrolmentdata['status'] = 0; $userenrolmentdata['enrolid'] = $enrolid; $userenrolmentdata['userid'] = $USER->id; $DB->insert_record('user_enrolments', $userenrolmentdata); // Create a student. $student = self::getDataGenerator()->create_user(); // Create test user flags record. $userflags = array(); $userflag['userid'] = $student->id; $userflag['workflowstate'] = 'inmarking'; $userflag['allocatedmarker'] = $USER->id; $userflags = array($userflag); $createduserflags = mod_assign_external::set_user_flags($assign->id, $userflags); // We need to execute the return values cleaning process to simulate the web service server. $createduserflags = external_api::clean_returnvalue(mod_assign_external::set_user_flags_returns(), $createduserflags); $this->assertEquals($student->id, $createduserflags[0]['userid']); $createduserflag = $DB->get_record('assign_user_flags', array('id' => $createduserflags[0]['id'])); // Confirm that all data was inserted correctly. $this->assertEquals($student->id, $createduserflag->userid); $this->assertEquals($assign->id, $createduserflag->assignment); $this->assertEquals(0, $createduserflag->locked); $this->assertEquals(2, $createduserflag->mailed); $this->assertEquals(0, $createduserflag->extensionduedate); $this->assertEquals('inmarking', $createduserflag->workflowstate); $this->assertEquals($USER->id, $createduserflag->allocatedmarker); // Create update data. $userflags = array(); $userflag['userid'] = $createduserflag->userid; $userflag['workflowstate'] = 'readyforreview'; $userflags = array($userflag); $updateduserflags = mod_assign_external::set_user_flags($assign->id, $userflags); // We need to execute the return values cleaning process to simulate the web service server. $updateduserflags = external_api::clean_returnvalue(mod_assign_external::set_user_flags_returns(), $updateduserflags); $this->assertEquals($student->id, $updateduserflags[0]['userid']); $updateduserflag = $DB->get_record('assign_user_flags', array('id' => $updateduserflags[0]['id'])); // Confirm that all data was updated correctly. $this->assertEquals($student->id, $updateduserflag->userid); $this->assertEquals($assign->id, $updateduserflag->assignment); $this->assertEquals(0, $updateduserflag->locked); $this->assertEquals(2, $updateduserflag->mailed); $this->assertEquals(0, $updateduserflag->extensionduedate); $this->assertEquals('readyforreview', $updateduserflag->workflowstate); $this->assertEquals($USER->id, $updateduserflag->allocatedmarker); }
/** * Test test_view_submission_status */ public function test_view_submission_status() { global $DB; $this->resetAfterTest(true); $this->setAdminUser(); // Setup test data. $course = $this->getDataGenerator()->create_course(); $assign = $this->getDataGenerator()->create_module('assign', array('course' => $course->id)); $context = context_module::instance($assign->cmid); $cm = get_coursemodule_from_instance('assign', $assign->id); // Test invalid instance id. try { mod_assign_external::view_submission_status(0); $this->fail('Exception expected due to invalid mod_assign instance id.'); } catch (moodle_exception $e) { $this->assertEquals('invalidrecord', $e->errorcode); } // Test not-enrolled user. $user = self::getDataGenerator()->create_user(); $this->setUser($user); try { mod_assign_external::view_submission_status($assign->id); $this->fail('Exception expected due to not enrolled user.'); } catch (moodle_exception $e) { $this->assertEquals('requireloginerror', $e->errorcode); } // Test user with full capabilities. $studentrole = $DB->get_record('role', array('shortname' => 'student')); $this->getDataGenerator()->enrol_user($user->id, $course->id, $studentrole->id); // Trigger and capture the event. $sink = $this->redirectEvents(); $result = mod_assign_external::view_submission_status($assign->id); $result = external_api::clean_returnvalue(mod_assign_external::view_submission_status_returns(), $result); $events = $sink->get_events(); $this->assertCount(1, $events); $event = array_shift($events); // Checking that the event contains the expected values. $this->assertInstanceOf('\\mod_assign\\event\\submission_status_viewed', $event); $this->assertEquals($context, $event->get_context()); $moodleurl = new \moodle_url('/mod/assign/view.php', array('id' => $cm->id)); $this->assertEquals($moodleurl, $event->get_url()); $this->assertEventContextNotUsed($event); $this->assertNotEmpty($event->get_name()); // Test user with no capabilities. // We need a explicit prohibit since this capability is only defined in authenticated user and guest roles. assign_capability('mod/assign:view', CAP_PROHIBIT, $studentrole->id, $context->id); accesslib_clear_all_caches_for_unit_testing(); course_modinfo::clear_instance_cache(); try { mod_assign_external::view_submission_status($assign->id); $this->fail('Exception expected due to missing capability.'); } catch (moodle_exception $e) { $this->assertEquals('requireloginerror', $e->errorcode); } }
/** * get_participant should return group details if a group submission was * submitted. */ public function test_get_participant_group_submission() { global $DB, $CFG; require_once $CFG->dirroot . '/mod/assign/tests/base_test.php'; $this->resetAfterTest(true); $result = $this->create_assign_with_student_and_teacher(array('assignsubmission_onlinetext_enabled' => 1, 'teamsubmission' => 1)); $assignmodule = $result['assign']; $student = $result['student']; $teacher = $result['teacher']; $course = $result['course']; $context = context_course::instance($course->id); $teacherrole = $DB->get_record('role', array('shortname' => 'teacher')); $group = $this->getDataGenerator()->create_group(array('courseid' => $course->id)); $cm = get_coursemodule_from_instance('assign', $assignmodule->id); $context = context_module::instance($cm->id); $assign = new testable_assign($context, $cm, $course); groups_add_member($group, $student); $this->setUser($student); $submission = $assign->get_group_submission($student->id, $group->id, true); $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED; $assign->testable_update_submission($submission, $student->id, true, false); $data = new stdClass(); $data->onlinetext_editor = array('itemid' => file_get_unused_draft_itemid(), 'text' => 'Submission text', 'format' => FORMAT_MOODLE); $plugin = $assign->get_submission_plugin_by_type('onlinetext'); $plugin->save($submission, $data); $this->setUser($teacher); $result = mod_assign_external::get_participant($assignmodule->id, $student->id, false); // Check some of the extended properties we get when not requesting a summary. $this->assertEquals($student->id, $result['id']); $this->assertEquals($group->id, $result['groupid']); $this->assertEquals($group->name, $result['groupname']); }
/** * Test get_submissions */ public function test_get_submissions () { global $DB, $USER; $this->resetAfterTest(true); // Create a course and assignment. $coursedata['idnumber'] = 'idnumbercourse1'; $coursedata['fullname'] = 'Lightwork Course 1'; $coursedata['summary'] = 'Lightwork Course 1 description'; $coursedata['summaryformat'] = FORMAT_MOODLE; $course1 = self::getDataGenerator()->create_course($coursedata); $assigndata['course'] = $course1->id; $assigndata['name'] = 'lightwork assignment'; $assign1 = self::getDataGenerator()->create_module('assign', $assigndata); // Create a student with an online text submission. // First attempt. $student = self::getDataGenerator()->create_user(); $submission = new stdClass(); $submission->assignment = $assign1->id; $submission->userid = $student->id; $submission->timecreated = time(); $submission->timemodified = $submission->timecreated; $submission->status = 'draft'; $submission->attemptnumber = 0; $sid = $DB->insert_record('assign_submission', $submission); // Second attempt. $submission = new stdClass(); $submission->assignment = $assign1->id; $submission->userid = $student->id; $submission->timecreated = time(); $submission->timemodified = $submission->timecreated; $submission->status = 'submitted'; $submission->attemptnumber = 1; $sid = $DB->insert_record('assign_submission', $submission); $submission->id = $sid; $onlinetextsubmission = new stdClass(); $onlinetextsubmission->onlinetext = "<p>online test text</p>"; $onlinetextsubmission->onlineformat = 1; $onlinetextsubmission->submission = $submission->id; $onlinetextsubmission->assignment = $assign1->id; $DB->insert_record('assignsubmission_onlinetext', $onlinetextsubmission); // Create manual enrolment record. $manual_enrol_data['enrol'] = 'manual'; $manual_enrol_data['status'] = 0; $manual_enrol_data['courseid'] = $course1->id; $enrolid = $DB->insert_record('enrol', $manual_enrol_data); // Create a teacher and give them capabilities. $context = context_course::instance($course1->id); $roleid = $this->assignUserCapability('moodle/course:viewparticipants', $context->id, 3); $context = context_module::instance($assign1->id); $this->assignUserCapability('mod/assign:grade', $context->id, $roleid); // Create the teacher's enrolment record. $user_enrolment_data['status'] = 0; $user_enrolment_data['enrolid'] = $enrolid; $user_enrolment_data['userid'] = $USER->id; $DB->insert_record('user_enrolments', $user_enrolment_data); $assignmentids[] = $assign1->id; $result = mod_assign_external::get_submissions($assignmentids); // Check the online text submission is returned. $this->assertEquals(1, count($result['assignments'])); $assignment = $result['assignments'][0]; $this->assertEquals($assign1->id, $assignment['assignmentid']); $this->assertEquals(1, count($assignment['submissions'])); $submission = $assignment['submissions'][0]; $this->assertEquals($sid, $submission['id']); $this->assertGreaterThanOrEqual(3, count($submission['plugins'])); $plugins = $submission['plugins']; foreach ($plugins as $plugin) { $foundonlinetext = false; if ($plugin['type'] == 'onlinetext') { $foundonlinetext = true; break; } } $this->assertTrue($foundonlinetext); }