. /** * Quiz events tests. * * @package mod_quiz * @category phpunit * @copyright 2013 Adrian Greeve * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); global $CFG; require_once($CFG->dirroot . '/mod/quiz/attemptlib.php'); require_once($CFG->dirroot . '/mod/quiz/editlib.php'); /** * Unit tests for quiz events. * * @package mod_quiz * @category phpunit * @copyright 2013 Adrian Greeve * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class mod_quiz_events_testcase extends advanced_testcase { protected function prepare_quiz_data() { $this->resetAfterTest(true); // Create a course $course = $this->getDataGenerator()->create_course(); // Make a quiz. $quizgenerator = $this->getDataGenerator()->get_plugin_generator('mod_quiz'); $quiz = $quizgenerator->create_instance(array('course'=>$course->id, 'questionsperpage' => 0, 'grade' => 100.0, 'sumgrades' => 2)); $cm = get_coursemodule_from_instance('quiz', $quiz->id, $course->id); // Create a couple of questions. $questiongenerator = $this->getDataGenerator()->get_plugin_generator('core_question'); $cat = $questiongenerator->create_question_category(); $saq = $questiongenerator->create_question('shortanswer', null, array('category' => $cat->id)); $numq = $questiongenerator->create_question('numerical', null, array('category' => $cat->id)); // Add them to the quiz. quiz_add_quiz_question($saq->id, $quiz); quiz_add_quiz_question($numq->id, $quiz); // Make a user to do the quiz. $user1 = $this->getDataGenerator()->create_user(); $this->setUser($user1); $quizobj = quiz::create($quiz->id, $user1->id); // Start the attempt. $quba = question_engine::make_questions_usage_by_activity('mod_quiz', $quizobj->get_context()); $quba->set_preferred_behaviour($quizobj->get_quiz()->preferredbehaviour); $timenow = time(); $attempt = quiz_create_attempt($quizobj, 1, false, $timenow); quiz_start_new_attempt($quizobj, $quba, $attempt, 1, $timenow); quiz_attempt_save_started($quizobj, $quba, $attempt); return array($quizobj, $quba, $attempt); } public function test_attempt_submitted() { list($quizobj, $quba, $attempt) = $this->prepare_quiz_data(); $attemptobj = quiz_attempt::create($attempt->id); // Catch the event. $sink = $this->redirectEvents(); $timefinish = time(); $attemptobj->process_finish($timefinish, false); $events = $sink->get_events(); $sink->close(); // Validate the event. $this->assertCount(1, $events); $event = $events[0]; $this->assertInstanceOf('\mod_quiz\event\attempt_submitted', $event); $this->assertEquals('quiz_attempts', $event->objecttable); $this->assertEquals($quizobj->get_context(), $event->get_context()); $this->assertEquals($attempt->userid, $event->relateduserid); $this->assertEquals(null, $event->other['submitterid']); // Should be the user, but PHP Unit complains... $this->assertEquals('quiz_attempt_submitted', $event->get_legacy_eventname()); $legacydata = new stdClass(); $legacydata->component = 'mod_quiz'; $legacydata->attemptid = (string) $attempt->id; $legacydata->timestamp = $timefinish; $legacydata->userid = $attempt->userid; $legacydata->cmid = $quizobj->get_cmid(); $legacydata->courseid = $quizobj->get_courseid(); $legacydata->quizid = $quizobj->get_quizid(); // Submitterid should be the user, but as we are in PHP Unit, CLI_SCRIPT is set to true which sets null in submitterid. $legacydata->submitterid = null; $legacydata->timefinish = $timefinish; $this->assertEventLegacyData($legacydata, $event); } public function test_attempt_becameoverdue() { list($quizobj, $quba, $attempt) = $this->prepare_quiz_data(); $attemptobj = quiz_attempt::create($attempt->id); // Catch the event. $sink = $this->redirectEvents(); $timefinish = time(); $attemptobj->process_going_overdue($timefinish, false); $events = $sink->get_events(); $sink->close(); $this->assertCount(1, $events); $event = $events[0]; $this->assertInstanceOf('\mod_quiz\event\attempt_becameoverdue', $event); $this->assertEquals('quiz_attempts', $event->objecttable); $this->assertEquals($quizobj->get_context(), $event->get_context()); $this->assertEquals($attempt->userid, $event->relateduserid); // Submitterid should be the user, but as we are in PHP Unit, CLI_SCRIPT is set to true which sets null in submitterid. $this->assertEquals(null, $event->other['submitterid']); $this->assertEquals('quiz_attempt_overdue', $event->get_legacy_eventname()); $legacydata = new stdClass(); $legacydata->component = 'mod_quiz'; $legacydata->attemptid = (string) $attempt->id; $legacydata->timestamp = $timefinish; $legacydata->userid = $attempt->userid; $legacydata->cmid = $quizobj->get_cmid(); $legacydata->courseid = $quizobj->get_courseid(); $legacydata->quizid = $quizobj->get_quizid(); $legacydata->submitterid = null; // Should be the user, but PHP Unit complains... $this->assertEventLegacyData($legacydata, $event); } public function test_attempt_abandoned() { list($quizobj, $quba, $attempt) = $this->prepare_quiz_data(); $attemptobj = quiz_attempt::create($attempt->id); // Catch the event. $sink = $this->redirectEvents(); $timefinish = time(); $attemptobj->process_abandon($timefinish, false); $events = $sink->get_events(); $sink->close(); $this->assertCount(1, $events); $event = $events[0]; $this->assertInstanceOf('\mod_quiz\event\attempt_abandoned', $event); $this->assertEquals('quiz_attempts', $event->objecttable); $this->assertEquals($quizobj->get_context(), $event->get_context()); $this->assertEquals($attempt->userid, $event->relateduserid); // Submitterid should be the user, but as we are in PHP Unit, CLI_SCRIPT is set to true which sets null in submitterid. $this->assertEquals(null, $event->other['submitterid']); $this->assertEquals('quiz_attempt_abandoned', $event->get_legacy_eventname()); $legacydata = new stdClass(); $legacydata->component = 'mod_quiz'; $legacydata->attemptid = (string) $attempt->id; $legacydata->timestamp = $timefinish; $legacydata->userid = $attempt->userid; $legacydata->cmid = $quizobj->get_cmid(); $legacydata->courseid = $quizobj->get_courseid(); $legacydata->quizid = $quizobj->get_quizid(); $legacydata->submitterid = null; // Should be the user, but PHP Unit complains... $this->assertEventLegacyData($legacydata, $event); } public function test_attempt_started() { global $USER; list($quizobj, $quba, $attempt) = $this->prepare_quiz_data(); $attemptobj = quiz_attempt::create($attempt->id); // Catch the event. $sink = $this->redirectEvents(); quiz_fire_attempt_started_event($attempt, $quizobj); $events = $sink->get_events(); $sink->close(); // Legacy event data. $legacydata = new stdClass(); $legacydata->component = 'mod_quiz'; $legacydata->attemptid = $attempt->id; $legacydata->timestart = $attempt->timestart; $legacydata->timestamp = $attempt->timestart; $legacydata->userid = $attempt->userid; $legacydata->quizid = $quizobj->get_quizid(); $legacydata->cmid = $quizobj->get_cmid(); $legacydata->courseid = $quizobj->get_courseid(); // Validate the event. $this->assertCount(1, $events); $event = $events[0]; $this->assertInstanceOf('\mod_quiz\event\attempt_started', $event); $this->assertEquals('quiz_attempts', $event->objecttable); $this->assertEquals($attempt->id, $event->objectid); $this->assertEquals($attempt->userid, $event->relateduserid); $this->assertEquals($quizobj->get_context(), $event->get_context()); $this->assertEquals('quiz_attempt_started', $event->get_legacy_eventname()); $this->assertEventLegacyData($legacydata, $event); } }