From 08db22c105e12608c23f877649fa69a3aadb0cd8 Mon Sep 17 00:00:00 2001 From: Mark Nelson Date: Thu, 23 Mar 2017 13:04:45 +0800 Subject: [PATCH] MDL-58017 mod_quiz: added action event unit tests Part of MDL-55611 epic. --- mod/quiz/tests/lib_test.php | 194 ++++++++++++++++++++++++++++++++++++ 1 file changed, 194 insertions(+) diff --git a/mod/quiz/tests/lib_test.php b/mod/quiz/tests/lib_test.php index e1f7029e057..1c31d26a023 100644 --- a/mod/quiz/tests/lib_test.php +++ b/mod/quiz/tests/lib_test.php @@ -497,4 +497,198 @@ class mod_quiz_lib_testcase extends advanced_testcase { $this->assertEquals(2, $closepriorities[$override1->timeclose]); $this->assertEquals(1, $closepriorities[$override2->timeclose]); } + + public function test_quiz_core_calendar_provide_event_action_open() { + $this->resetAfterTest(); + + $this->setAdminUser(); + + // Create a course. + $course = $this->getDataGenerator()->create_course(); + + // Create a quiz. + $quiz = $this->getDataGenerator()->create_module('quiz', array('course' => $course->id, + 'timeopen' => time() - DAYSECS, 'timeclose' => time() + DAYSECS)); + + // Create a calendar event. + $event = $this->create_action_event($course->id, $quiz->id, QUIZ_EVENT_TYPE_OPEN); + + // Create an action factory. + $factory = new \core_calendar\action_factory(); + + // Decorate action event. + $actionevent = mod_quiz_core_calendar_provide_event_action($event, $factory); + + // Confirm the event was decorated. + $this->assertInstanceOf('\core_calendar\local\event\value_objects\action', $actionevent); + $this->assertEquals(get_string('attemptquiznow', 'quiz'), $actionevent->get_name()); + $this->assertInstanceOf('moodle_url', $actionevent->get_url()); + $this->assertEquals(1, $actionevent->get_item_count()); + $this->assertTrue($actionevent->is_actionable()); + } + + public function test_quiz_core_calendar_provide_event_action_closed() { + $this->resetAfterTest(); + + $this->setAdminUser(); + + // Create a course. + $course = $this->getDataGenerator()->create_course(); + + // Create a quiz. + $quiz = $this->getDataGenerator()->create_module('quiz', array('course' => $course->id, + 'timeclose' => time() - DAYSECS)); + + // Create a calendar event. + $event = $this->create_action_event($course->id, $quiz->id, QUIZ_EVENT_TYPE_CLOSE); + + // Create an action factory. + $factory = new \core_calendar\action_factory(); + + // Confirm the result was null. + $this->assertNull(mod_quiz_core_calendar_provide_event_action($event, $factory)); + } + + public function test_quiz_core_calendar_provide_event_action_open_in_future() { + $this->resetAfterTest(); + + $this->setAdminUser(); + + // Create a course. + $course = $this->getDataGenerator()->create_course(); + + // Create a quiz. + $quiz = $this->getDataGenerator()->create_module('quiz', array('course' => $course->id, + 'timeopen' => time() + DAYSECS)); + + // Create a calendar event. + $event = $this->create_action_event($course->id, $quiz->id, QUIZ_EVENT_TYPE_CLOSE); + + // Create an action factory. + $factory = new \core_calendar\action_factory(); + + // Decorate action event. + $actionevent = mod_quiz_core_calendar_provide_event_action($event, $factory); + + // Confirm the event was decorated. + $this->assertInstanceOf('\core_calendar\local\event\value_objects\action', $actionevent); + $this->assertEquals(get_string('attemptquiznow', 'quiz'), $actionevent->get_name()); + $this->assertInstanceOf('moodle_url', $actionevent->get_url()); + $this->assertEquals(1, $actionevent->get_item_count()); + $this->assertFalse($actionevent->is_actionable()); + } + + public function test_quiz_core_calendar_provide_event_action_no_capability() { + global $DB; + + $this->resetAfterTest(); + $this->setAdminUser(); + + // Create a course. + $course = $this->getDataGenerator()->create_course(); + + // Create a student. + $student = $this->getDataGenerator()->create_user(); + $studentrole = $DB->get_record('role', array('shortname' => 'student')); + + // Enrol student. + $this->assertTrue($this->getDataGenerator()->enrol_user($student->id, $course->id, $studentrole->id)); + + // Create a quiz. + $quiz = $this->getDataGenerator()->create_module('quiz', array('course' => $course->id)); + + // Remove the permission to attempt or review the quiz for the student role. + $coursecontext = context_course::instance($course->id); + assign_capability('mod/quiz:reviewmyattempts', CAP_PROHIBIT, $studentrole->id, $coursecontext); + assign_capability('mod/quiz:attempt', CAP_PROHIBIT, $studentrole->id, $coursecontext); + + // Create a calendar event. + $event = $this->create_action_event($course->id, $quiz->id, QUIZ_EVENT_TYPE_OPEN); + + // Create an action factory. + $factory = new \core_calendar\action_factory(); + + // Set current user to the student. + $this->setUser($student); + + // Confirm null is returned. + $this->assertNull(mod_quiz_core_calendar_provide_event_action($event, $factory)); + } + + public function test_quiz_core_calendar_provide_event_action_already_finished() { + global $DB; + + $this->resetAfterTest(); + + $this->setAdminUser(); + + // Create a course. + $course = $this->getDataGenerator()->create_course(); + + // Create a student. + $student = $this->getDataGenerator()->create_user(); + $studentrole = $DB->get_record('role', array('shortname' => 'student')); + + // Enrol student. + $this->assertTrue($this->getDataGenerator()->enrol_user($student->id, $course->id, $studentrole->id)); + + // Create a quiz. + $quiz = $this->getDataGenerator()->create_module('quiz', array('course' => $course->id, + 'sumgrades' => 1)); + + // Add a question to the quiz. + $questiongenerator = $this->getDataGenerator()->get_plugin_generator('core_question'); + $cat = $questiongenerator->create_question_category(); + $question = $questiongenerator->create_question('numerical', null, array('category' => $cat->id)); + quiz_add_quiz_question($question->id, $quiz); + + // Get the quiz object. + $quizobj = quiz::create($quiz->id, $student->id); + + // Create an attempt for the student in the quiz. + $timenow = time(); + $attempt = quiz_create_attempt($quizobj, 1, false, $timenow, false, $student->id); + $quba = question_engine::make_questions_usage_by_activity('mod_quiz', $quizobj->get_context()); + $quba->set_preferred_behaviour($quizobj->get_quiz()->preferredbehaviour); + quiz_start_new_attempt($quizobj, $quba, $attempt, 1, $timenow); + quiz_attempt_save_started($quizobj, $quba, $attempt); + + // Finish the attempt. + $attemptobj = quiz_attempt::create($attempt->id); + $attemptobj->process_finish($timenow, false); + + // Create a calendar event. + $event = $this->create_action_event($course->id, $quiz->id, QUIZ_EVENT_TYPE_OPEN); + + // Create an action factory. + $factory = new \core_calendar\action_factory(); + + // Set current user to the student. + $this->setUser($student); + + // Confirm null is returned. + $this->assertNull(mod_quiz_core_calendar_provide_event_action($event, $factory)); + } + + /** + * Creates an action event. + * + * @param int $courseid + * @param int $instanceid The quiz id. + * @param string $eventtype The event type. eg. QUIZ_EVENT_TYPE_OPEN. + * @return bool|\core_calendar\event + */ + private function create_action_event($courseid, $instanceid, $eventtype) { + $event = new stdClass(); + $event->name = 'Calendar event'; + $event->modulename = 'quiz'; + $event->courseid = $courseid; + $event->instance = $instanceid; + $event->type = CALENDAR_EVENT_TYPE_ACTION; + $event->eventtype = $eventtype; + $event->timestart = time(); + + return \core_calendar\event::create($event); + } + }