mirror of
https://github.com/moodle/moodle.git
synced 2025-03-06 16:59:56 +01:00
223 lines
9.2 KiB
PHP
223 lines
9.2 KiB
PHP
<?php
|
|
// This file is part of Moodle - http://moodle.org/
|
|
//
|
|
// Moodle is free software: you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// Moodle is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
// GNU General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
/**
|
|
* 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);
|
|
}
|
|
}
|