2 // This file is part of Moodle - http://moodle.org/
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
22 * @copyright 2013 Mark Nelson <markn@moodle.com>
23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
26 defined('MOODLE_INTERNAL') ||
die();
30 require_once($CFG->dirroot
.'/mod/lesson/locallib.php');
32 class mod_lesson_events_testcase
extends advanced_testcase
{
34 /** @var stdClass the course used for testing */
37 /** @var lesson the lesson used for testing */
43 * This is executed before running any test in this file.
45 public function setUp() {
46 $this->resetAfterTest();
48 $this->setAdminUser();
49 $this->course
= $this->getDataGenerator()->create_course();
50 $lesson = $this->getDataGenerator()->create_module('lesson', array('course' => $this->course
->id
));
52 // Convert to a lesson object.
53 $this->lesson
= new lesson($lesson);
57 * Test the page created event.
60 public function test_page_created() {
62 // Set up a generator to create content.
63 $generator = $this->getDataGenerator()->get_plugin_generator('mod_lesson');
64 // Trigger and capture the event.
65 $sink = $this->redirectEvents();
66 $pagerecord = $generator->create_content($this->lesson
);
67 $page = $this->lesson
->load_page($pagerecord->id
);
69 // Get our event event.
70 $events = $sink->get_events();
71 $event = reset($events);
73 // Check that the event data is valid.
74 $this->assertInstanceOf('\mod_lesson\event\page_created', $event);
75 $this->assertEquals($page->id
, $event->objectid
);
76 $this->assertEventContextNotUsed($event);
77 $this->assertDebuggingNotCalled();
81 * Test the page created event.
84 public function test_page_moved() {
86 // Set up a generator to create content.
87 // paga3 is the first one and page1 the last one.
88 $generator = $this->getDataGenerator()->get_plugin_generator('mod_lesson');
89 $pagerecord1 = $generator->create_content($this->lesson
);
90 $page1 = $this->lesson
->load_page($pagerecord1->id
);
91 $pagerecord2 = $generator->create_content($this->lesson
);
92 $page2 = $this->lesson
->load_page($pagerecord2->id
);
93 $pagerecord3 = $generator->create_content($this->lesson
);
94 $page3 = $this->lesson
->load_page($pagerecord3->id
);
95 // Trigger and capture the event.
96 $sink = $this->redirectEvents();
97 $this->lesson
->resort_pages($page3->id
, $pagerecord2->id
);
98 // Get our event event.
99 $events = $sink->get_events();
100 $event = reset($events);
102 $this->assertCount(1, $events);
103 // Check that the event data is valid.
104 $this->assertInstanceOf('\mod_lesson\event\page_moved', $event);
105 $this->assertEquals($page3->id
, $event->objectid
);
106 $this->assertEquals($pagerecord1->id
, $event->other
['nextpageid']);
107 $this->assertEquals($pagerecord2->id
, $event->other
['prevpageid']);
108 $this->assertEventContextNotUsed($event);
109 $this->assertDebuggingNotCalled();
113 * Test the page deleted event.
116 public function test_page_deleted() {
118 // Set up a generator to create content.
119 $generator = $this->getDataGenerator()->get_plugin_generator('mod_lesson');
120 // Create a content page.
121 $pagerecord = $generator->create_content($this->lesson
);
122 // Get the lesson page information.
123 $page = $this->lesson
->load_page($pagerecord->id
);
124 // Trigger and capture the event.
125 $sink = $this->redirectEvents();
128 // Get our event event.
129 $events = $sink->get_events();
130 $event = reset($events);
132 // Check that the event data is valid.
133 $this->assertInstanceOf('\mod_lesson\event\page_deleted', $event);
134 $this->assertEquals($page->id
, $event->objectid
);
135 $this->assertEventContextNotUsed($event);
136 $this->assertDebuggingNotCalled();
140 * Test the page updated event.
142 * There is no external API for updateing a page, so the unit test will simply
143 * create and trigger the event and ensure data is returned as expected.
145 public function test_page_updated() {
147 // Trigger an event: page updated.
148 $eventparams = array(
149 'context' => context_module
::instance($this->lesson
->properties()->cmid
),
152 'pagetype' => 'True/false'
156 $event = \mod_lesson\event\page_updated
::create($eventparams);
158 // Trigger and capture the event.
159 $sink = $this->redirectEvents();
161 $events = $sink->get_events();
162 $event = reset($events);
164 // Check that the event data is valid.
165 $this->assertInstanceOf('\mod_lesson\event\page_updated', $event);
166 $this->assertEquals(25, $event->objectid
);
167 $this->assertEquals('True/false', $event->other
['pagetype']);
168 $this->assertEventContextNotUsed($event);
169 $this->assertDebuggingNotCalled();
173 * Test the essay attempt viewed event.
175 * There is no external API for viewing an essay attempt, so the unit test will simply
176 * create and trigger the event and ensure the legacy log data is returned as expected.
178 public function test_essay_attempt_viewed() {
179 // Create a essays list viewed event
180 $event = \mod_lesson\event\essay_attempt_viewed
::create(array(
181 'objectid' => $this->lesson
->id
,
182 'relateduserid' => 3,
183 'context' => context_module
::instance($this->lesson
->properties()->cmid
),
184 'courseid' => $this->course
->id
187 // Trigger and capture the event.
188 $sink = $this->redirectEvents();
190 $events = $sink->get_events();
191 $event = reset($events);
193 // Check that the event data is valid.
194 $this->assertInstanceOf('\mod_lesson\event\essay_attempt_viewed', $event);
195 $this->assertEquals(context_module
::instance($this->lesson
->properties()->cmid
), $event->get_context());
196 $expected = array($this->course
->id
, 'lesson', 'view grade', 'essay.php?id=' . $this->lesson
->properties()->cmid
.
197 '&mode=grade&attemptid='.$this->lesson
->id
, get_string('manualgrading', 'lesson'), $this->lesson
->properties()->cmid
);
198 $this->assertEventLegacyLogData($expected, $event);
199 $this->assertEventContextNotUsed($event);
203 * Test the lesson started event.
205 public function test_lesson_started() {
206 // Trigger and capture the event.
207 $sink = $this->redirectEvents();
208 $this->lesson
->start_timer();
209 $events = $sink->get_events();
210 $event = reset($events);
212 // Check that the event data is valid.
213 $this->assertInstanceOf('\mod_lesson\event\lesson_started', $event);
214 $this->assertEquals(context_module
::instance($this->lesson
->properties()->cmid
), $event->get_context());
215 $expected = array($this->course
->id
, 'lesson', 'start', 'view.php?id=' . $this->lesson
->properties()->cmid
,
216 $this->lesson
->properties()->id
, $this->lesson
->properties()->cmid
);
217 $this->assertEventLegacyLogData($expected, $event);
218 $this->assertEventContextNotUsed($event);
222 * Test the lesson restarted event.
224 public function test_lesson_restarted() {
227 $this->lesson
->start_timer();
228 // Trigger and capture the event.
229 $sink = $this->redirectEvents();
230 $this->lesson
->update_timer(true);
231 $events = $sink->get_events();
232 $event = reset($events);
234 // Check that the event data is valid.
235 $this->assertInstanceOf('\mod_lesson\event\lesson_restarted', $event);
236 $this->assertEquals(context_module
::instance($this->lesson
->properties()->cmid
), $event->get_context());
237 $expected = array($this->course
->id
, 'lesson', 'start', 'view.php?id=' . $this->lesson
->properties()->cmid
,
238 $this->lesson
->properties()->id
, $this->lesson
->properties()->cmid
);
239 $this->assertEventContextNotUsed($event);
240 $this->assertDebuggingNotCalled();
245 * Test the lesson restarted event.
247 public function test_lesson_resumed() {
250 $this->lesson
->start_timer();
251 // Trigger and capture the event.
252 $sink = $this->redirectEvents();
253 $this->lesson
->update_timer(true, true);
254 $events = $sink->get_events();
255 $event = reset($events);
257 // Check that the event data is valid.
258 $this->assertInstanceOf('\mod_lesson\event\lesson_resumed', $event);
259 $this->assertEquals(context_module
::instance($this->lesson
->properties()->cmid
), $event->get_context());
260 $expected = array($this->course
->id
, 'lesson', 'start', 'view.php?id=' . $this->lesson
->properties()->cmid
,
261 $this->lesson
->properties()->id
, $this->lesson
->properties()->cmid
);
262 $this->assertEventContextNotUsed($event);
263 $this->assertDebuggingNotCalled();
267 * Test the lesson ended event.
269 public function test_lesson_ended() {
272 // Add a lesson timer so that stop_timer() does not complain.
273 $lessontimer = new stdClass();
274 $lessontimer->lessonid
= $this->lesson
->properties()->id
;
275 $lessontimer->userid
= $USER->id
;
276 $lessontimer->startime
= time();
277 $lessontimer->lessontime
= time();
278 $DB->insert_record('lesson_timer', $lessontimer);
280 // Trigger and capture the event.
281 $sink = $this->redirectEvents();
282 $this->lesson
->stop_timer();
283 $events = $sink->get_events();
284 $event = reset($events);
286 // Check that the event data is valid.
287 $this->assertInstanceOf('\mod_lesson\event\lesson_ended', $event);
288 $this->assertEquals(context_module
::instance($this->lesson
->properties()->cmid
), $event->get_context());
289 $expected = array($this->course
->id
, 'lesson', 'end', 'view.php?id=' . $this->lesson
->properties()->cmid
,
290 $this->lesson
->properties()->id
, $this->lesson
->properties()->cmid
);
291 $this->assertEventLegacyLogData($expected, $event);
292 $this->assertEventContextNotUsed($event);
296 * Test the essay assessed event.
298 * There is no external API for assessing an essay, so the unit test will simply
299 * create and trigger the event and ensure the legacy log data is returned as expected.
301 public function test_essay_assessed() {
302 // Create an essay assessed event
305 $event = \mod_lesson\event\essay_assessed
::create(array(
306 'objectid' => $gradeid,
307 'relateduserid' => 3,
308 'context' => context_module
::instance($this->lesson
->properties()->cmid
),
309 'courseid' => $this->course
->id
,
311 'lessonid' => $this->lesson
->id
,
312 'attemptid' => $attemptid
316 // Trigger and capture the event.
317 $sink = $this->redirectEvents();
319 $events = $sink->get_events();
320 $event = reset($events);
322 // Check that the event data is valid.
323 $this->assertInstanceOf('\mod_lesson\event\essay_assessed', $event);
324 $this->assertEquals(context_module
::instance($this->lesson
->properties()->cmid
), $event->get_context());
325 $expected = array($this->course
->id
, 'lesson', 'update grade', 'essay.php?id=' . $this->lesson
->properties()->cmid
,
326 $this->lesson
->name
, $this->lesson
->properties()->cmid
);
327 $this->assertEventLegacyLogData($expected, $event);
328 $this->assertEventContextNotUsed($event);
332 * Test the content page viewed event.
335 public function test_content_page_viewed() {
338 // Set up a generator to create content.
339 $generator = $this->getDataGenerator()->get_plugin_generator('mod_lesson');
340 // Create a content page.
341 $pagerecord = $generator->create_content($this->lesson
);
342 // Get the lesson page information.
343 $page = $this->lesson
->load_page($pagerecord->id
);
344 // Get the coursemodule record to setup the $PAGE->cm.
345 $coursemodule = $DB->get_record('course_modules', array('id' => $this->lesson
->properties()->cmid
));
346 // Set the $PAGE->cm.
347 $PAGE->set_cm($coursemodule);
348 // Get the appropriate renderer.
349 $lessonoutput = $PAGE->get_renderer('mod_lesson');
351 // Trigger and capture the event.
352 $sink = $this->redirectEvents();
353 // Fire the function that leads to the triggering of our event.
354 $lessonoutput->display_page($this->lesson
, $page, false);
355 $events = $sink->get_events();
356 $event = reset($events);
358 // Check that the event data is valid.
359 $this->assertInstanceOf('\mod_lesson\event\content_page_viewed', $event);
360 $this->assertEquals($page->id
, $event->objectid
);
361 $this->assertEventContextNotUsed($event);
362 $this->assertDebuggingNotCalled();
366 * Test the question viewed event.
369 public function test_question_viewed() {
372 // Set up a generator to create content.
373 $generator = $this->getDataGenerator()->get_plugin_generator('mod_lesson');
374 // Create a question page.
375 $pagerecord = $generator->create_question_truefalse($this->lesson
);
376 // Get the lesson page information.
377 $page = $this->lesson
->load_page($pagerecord->id
);
378 // Get the coursemodule record to setup the $PAGE->cm.
379 $coursemodule = $DB->get_record('course_modules', array('id' => $this->lesson
->properties()->cmid
));
380 // Set the $PAGE->cm.
381 $PAGE->set_cm($coursemodule);
382 // Get the appropriate renderer.
383 $lessonoutput = $PAGE->get_renderer('mod_lesson');
385 // Trigger and capture the event.
386 $sink = $this->redirectEvents();
387 // Fire the function that leads to the triggering of our event.
388 $lessonoutput->display_page($this->lesson
, $page, false);
389 $events = $sink->get_events();
390 $event = reset($events);
392 // Check that the event data is valid.
393 $this->assertInstanceOf('\mod_lesson\event\question_viewed', $event);
394 $this->assertEquals($page->id
, $event->objectid
);
395 $this->assertEquals('True/false', $event->other
['pagetype']);
396 $this->assertEventContextNotUsed($event);
397 $this->assertDebuggingNotCalled();
401 * Test the question answered event.
403 * There is no external API for answering an truefalse question, so the unit test will simply
404 * create and trigger the event and ensure data is returned as expected.
406 public function test_question_answered() {
408 // Trigger an event: truefalse question answered.
409 $eventparams = array(
410 'context' => context_module
::instance($this->lesson
->properties()->cmid
),
413 'pagetype' => 'True/false'
417 $event = \mod_lesson\event\question_answered
::create($eventparams);
419 // Trigger and capture the event.
420 $sink = $this->redirectEvents();
422 $events = $sink->get_events();
423 $event = reset($events);
425 // Check that the event data is valid.
426 $this->assertInstanceOf('\mod_lesson\event\question_answered', $event);
427 $this->assertEquals(25, $event->objectid
);
428 $this->assertEquals('True/false', $event->other
['pagetype']);
429 $this->assertEventContextNotUsed($event);
430 $this->assertDebuggingNotCalled();
434 * Test the user override created event.
436 * There is no external API for creating a user override, so the unit test will simply
437 * create and trigger the event and ensure the event data is returned as expected.
439 public function test_user_override_created() {
443 'relateduserid' => 2,
444 'context' => context_module
::instance($this->lesson
->properties()->cmid
),
446 'lessonid' => $this->lesson
->id
449 $event = \mod_lesson\event\user_override_created
::create($params);
451 // Trigger and capture the event.
452 $sink = $this->redirectEvents();
454 $events = $sink->get_events();
455 $event = reset($events);
457 // Check that the event data is valid.
458 $this->assertInstanceOf('\mod_lesson\event\user_override_created', $event);
459 $this->assertEquals(context_module
::instance($this->lesson
->properties()->cmid
), $event->get_context());
460 $this->assertEventContextNotUsed($event);
464 * Test the group override created event.
466 * There is no external API for creating a group override, so the unit test will simply
467 * create and trigger the event and ensure the event data is returned as expected.
469 public function test_group_override_created() {
473 'context' => context_module
::instance($this->lesson
->properties()->cmid
),
475 'lessonid' => $this->lesson
->id
,
479 $event = \mod_lesson\event\group_override_created
::create($params);
481 // Trigger and capture the event.
482 $sink = $this->redirectEvents();
484 $events = $sink->get_events();
485 $event = reset($events);
487 // Check that the event data is valid.
488 $this->assertInstanceOf('\mod_lesson\event\group_override_created', $event);
489 $this->assertEquals(context_module
::instance($this->lesson
->properties()->cmid
), $event->get_context());
490 $this->assertEventContextNotUsed($event);
494 * Test the user override updated event.
496 * There is no external API for updating a user override, so the unit test will simply
497 * create and trigger the event and ensure the event data is returned as expected.
499 public function test_user_override_updated() {
503 'relateduserid' => 2,
504 'context' => context_module
::instance($this->lesson
->properties()->cmid
),
506 'lessonid' => $this->lesson
->id
509 $event = \mod_lesson\event\user_override_updated
::create($params);
511 // Trigger and capture the event.
512 $sink = $this->redirectEvents();
514 $events = $sink->get_events();
515 $event = reset($events);
517 // Check that the event data is valid.
518 $this->assertInstanceOf('\mod_lesson\event\user_override_updated', $event);
519 $this->assertEquals(context_module
::instance($this->lesson
->properties()->cmid
), $event->get_context());
520 $this->assertEventContextNotUsed($event);
524 * Test the group override updated event.
526 * There is no external API for updating a group override, so the unit test will simply
527 * create and trigger the event and ensure the event data is returned as expected.
529 public function test_group_override_updated() {
533 'context' => context_module
::instance($this->lesson
->properties()->cmid
),
535 'lessonid' => $this->lesson
->id
,
539 $event = \mod_lesson\event\group_override_updated
::create($params);
541 // Trigger and capture the event.
542 $sink = $this->redirectEvents();
544 $events = $sink->get_events();
545 $event = reset($events);
547 // Check that the event data is valid.
548 $this->assertInstanceOf('\mod_lesson\event\group_override_updated', $event);
549 $this->assertEquals(context_module
::instance($this->lesson
->properties()->cmid
), $event->get_context());
550 $this->assertEventContextNotUsed($event);
554 * Test the user override deleted event.
556 public function test_user_override_deleted() {
559 // Create an override.
560 $override = new stdClass();
561 $override->lesson
= $this->lesson
->id
;
562 $override->userid
= 2;
563 $override->id
= $DB->insert_record('lesson_overrides', $override);
565 // Trigger and capture the event.
566 $sink = $this->redirectEvents();
567 $this->lesson
->delete_override($override->id
);
568 $events = $sink->get_events();
569 $event = reset($events);
571 // Check that the event data is valid.
572 $this->assertInstanceOf('\mod_lesson\event\user_override_deleted', $event);
573 $this->assertEquals(context_module
::instance($this->lesson
->properties()->cmid
), $event->get_context());
574 $this->assertEventContextNotUsed($event);
578 * Test the group override deleted event.
580 public function test_group_override_deleted() {
583 // Create an override.
584 $override = new stdClass();
585 $override->lesson
= $this->lesson
->id
;
586 $override->groupid
= 2;
587 $override->id
= $DB->insert_record('lesson_overrides', $override);
589 // Trigger and capture the event.
590 $sink = $this->redirectEvents();
591 $this->lesson
->delete_override($override->id
);
592 $events = $sink->get_events();
593 $event = reset($events);
595 // Check that the event data is valid.
596 $this->assertInstanceOf('\mod_lesson\event\group_override_deleted', $event);
597 $this->assertEquals(context_module
::instance($this->lesson
->properties()->cmid
), $event->get_context());
598 $this->assertEventContextNotUsed($event);