public function test_observe_course_completed() { $this->resetAfterTest(true); $dg = $this->getDataGenerator(); $lpg = $dg->get_plugin_generator('core_competency'); // Set-up users, framework, competencies and course competencies. $course = $dg->create_course(); $coursectx = context_course::instance($course->id); $u1 = $dg->create_user(); $f1 = $lpg->create_framework(); $c1 = $lpg->create_competency(array('competencyframeworkid' => $f1->get_id())); $c2 = $lpg->create_competency(array('competencyframeworkid' => $f1->get_id())); $c3 = $lpg->create_competency(array('competencyframeworkid' => $f1->get_id())); $c4 = $lpg->create_competency(array('competencyframeworkid' => $f1->get_id())); $cc1 = $lpg->create_course_competency(array('competencyid' => $c1->get_id(), 'courseid' => $course->id, 'ruleoutcome' => \core_competency\course_competency::OUTCOME_NONE)); $cc2 = $lpg->create_course_competency(array('competencyid' => $c2->get_id(), 'courseid' => $course->id, 'ruleoutcome' => \core_competency\course_competency::OUTCOME_EVIDENCE)); $cc3 = $lpg->create_course_competency(array('competencyid' => $c3->get_id(), 'courseid' => $course->id, 'ruleoutcome' => \core_competency\course_competency::OUTCOME_RECOMMEND)); $cc4 = $lpg->create_course_competency(array('competencyid' => $c4->get_id(), 'courseid' => $course->id, 'ruleoutcome' => \core_competency\course_competency::OUTCOME_COMPLETE)); $event = \core\event\course_completed::create(array('objectid' => 1, 'relateduserid' => $u1->id, 'context' => $coursectx, 'courseid' => $course->id, 'other' => array('relateduserid' => $u1->id))); $this->assertEquals(0, \core_competency\user_competency::count_records()); $this->assertEquals(0, \core_competency\evidence::count_records()); // Let's go! api::observe_course_completed($event); $this->assertEquals(3, \core_competency\user_competency::count_records()); $this->assertEquals(3, \core_competency\evidence::count_records()); // Outcome NONE did nothing. $this->assertFalse(\core_competency\user_competency::record_exists_select('userid = :uid AND competencyid = :cid', array('uid' => $u1->id, 'cid' => $c1->get_id()))); // Outcome evidence. $uc2 = \core_competency\user_competency::get_record(array('userid' => $u1->id, 'competencyid' => $c2->get_id())); $ev2 = \core_competency\evidence::get_record(array('usercompetencyid' => $uc2->get_id())); $this->assertEquals(null, $uc2->get_grade()); $this->assertEquals(null, $uc2->get_proficiency()); $this->assertEquals(\core_competency\user_competency::STATUS_IDLE, $uc2->get_status()); $this->assertEquals('evidence_coursecompleted', $ev2->get_descidentifier()); $this->assertEquals('core_competency', $ev2->get_desccomponent()); $this->assertEquals($course->shortname, $ev2->get_desca()); $this->assertStringEndsWith('/report/completion/index.php?course=' . $course->id, $ev2->get_url()); $this->assertEquals(null, $ev2->get_grade()); $this->assertEquals($coursectx->id, $ev2->get_contextid()); $this->assertEquals(\core_competency\evidence::ACTION_LOG, $ev2->get_action()); $this->assertEquals(null, $ev2->get_actionuserid()); // Outcome recommend. $uc3 = \core_competency\user_competency::get_record(array('userid' => $u1->id, 'competencyid' => $c3->get_id())); $ev3 = \core_competency\evidence::get_record(array('usercompetencyid' => $uc3->get_id())); $this->assertEquals(null, $uc3->get_grade()); $this->assertEquals(null, $uc3->get_proficiency()); $this->assertEquals(\core_competency\user_competency::STATUS_WAITING_FOR_REVIEW, $uc3->get_status()); $this->assertEquals('evidence_coursecompleted', $ev3->get_descidentifier()); $this->assertEquals('core_competency', $ev3->get_desccomponent()); $this->assertEquals($course->shortname, $ev3->get_desca()); $this->assertStringEndsWith('/report/completion/index.php?course=' . $course->id, $ev3->get_url()); $this->assertEquals(null, $ev3->get_grade()); $this->assertEquals($coursectx->id, $ev3->get_contextid()); $this->assertEquals(\core_competency\evidence::ACTION_LOG, $ev3->get_action()); $this->assertEquals(null, $ev3->get_actionuserid()); // Outcome complete. $uc4 = \core_competency\user_competency::get_record(array('userid' => $u1->id, 'competencyid' => $c4->get_id())); $ev4 = \core_competency\evidence::get_record(array('usercompetencyid' => $uc4->get_id())); $this->assertEquals(3, $uc4->get_grade()); $this->assertEquals(1, $uc4->get_proficiency()); $this->assertEquals(\core_competency\user_competency::STATUS_IDLE, $uc4->get_status()); $this->assertEquals('evidence_coursecompleted', $ev4->get_descidentifier()); $this->assertEquals('core_competency', $ev4->get_desccomponent()); $this->assertEquals($course->shortname, $ev4->get_desca()); $this->assertStringEndsWith('/report/completion/index.php?course=' . $course->id, $ev4->get_url()); $this->assertEquals(3, $ev4->get_grade()); $this->assertEquals($coursectx->id, $ev4->get_contextid()); $this->assertEquals(\core_competency\evidence::ACTION_COMPLETE, $ev4->get_action()); $this->assertEquals(null, $ev4->get_actionuserid()); }
/** * Mark this user complete in this course * * This generally happens when the required completion criteria * in the course are complete. * * @param integer $timecomplete Time completed (optional) * @return void */ public function mark_complete($timecomplete = null) { global $USER; // Never change a completion time. if ($this->timecompleted) { return; } // Use current time if nothing supplied. if (!$timecomplete) { $timecomplete = time(); } // Set time complete. $this->timecompleted = $timecomplete; // Save record. if ($result = $this->_save()) { $data = $this->get_record_data(); $event = \core\event\course_completed::create(array('objectid' => $data->id, 'userid' => $USER->id, 'context' => context_course::instance($data->course), 'courseid' => $data->course, 'other' => array('relateduserid' => $data->userid))); $event->add_record_snapshot('course_completions', $data); $event->trigger(); } return $result; }