Proyectos de Subversion Moodle

Rev

Rev 11 | | Comparar con el anterior | Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
// This file is part of Moodle - http://moodle.org/
3
//
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.
8
//
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.
13
//
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/>.
16
 
17
/**
18
 * Events tests.
19
 *
20
 * @package    mod_lesson
21
 * @category   test
22
 * @copyright  2013 Mark Nelson <markn@moodle.com>
23
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24
 */
25
 
26
namespace mod_lesson\event;
27
 
28
use lesson;
29
 
30
defined('MOODLE_INTERNAL') || die();
31
 
32
global $CFG;
33
 
34
require_once($CFG->dirroot.'/mod/lesson/locallib.php');
35
 
1441 ariadna 36
final class events_test extends \advanced_testcase {
1 efrain 37
 
38
    /** @var stdClass the course used for testing */
39
    private $course;
40
 
41
    /** @var lesson the lesson used for testing */
42
    private $lesson;
43
 
44
    /**
45
     * Test set up.
46
     *
47
     * This is executed before running any test in this file.
48
     */
49
    public function setUp(): void {
1441 ariadna 50
        parent::setUp();
1 efrain 51
        $this->resetAfterTest();
52
 
53
        $this->setAdminUser();
54
        $this->course = $this->getDataGenerator()->create_course();
55
        $lesson = $this->getDataGenerator()->create_module('lesson', array('course' => $this->course->id));
56
 
57
        // Convert to a lesson object.
58
        $this->lesson = new lesson($lesson);
59
    }
60
 
61
    /**
62
     * Test the page created event.
63
     *
64
     */
11 efrain 65
    public function test_page_created(): void {
1 efrain 66
 
67
        // Set up a generator to create content.
68
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_lesson');
69
        // Trigger and capture the event.
70
        $sink = $this->redirectEvents();
71
        $pagerecord = $generator->create_content($this->lesson);
72
        $page = $this->lesson->load_page($pagerecord->id);
73
 
74
        // Get our event event.
75
        $events = $sink->get_events();
76
        $event = reset($events);
77
 
78
        // Check that the event data is valid.
79
        $this->assertInstanceOf('\mod_lesson\event\page_created', $event);
80
        $this->assertEquals($page->id, $event->objectid);
81
        $this->assertEventContextNotUsed($event);
82
        $this->assertDebuggingNotCalled();
83
    }
84
 
85
    /**
86
     * Test the page created event.
87
     *
88
     */
11 efrain 89
    public function test_page_moved(): void {
1 efrain 90
 
91
        // Set up a generator to create content.
92
        // paga3 is the first one and page1 the last one.
93
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_lesson');
94
        $pagerecord1 = $generator->create_content($this->lesson);
95
        $page1 = $this->lesson->load_page($pagerecord1->id);
96
        $pagerecord2 = $generator->create_content($this->lesson);
97
        $page2 = $this->lesson->load_page($pagerecord2->id);
98
        $pagerecord3 = $generator->create_content($this->lesson);
99
        $page3 = $this->lesson->load_page($pagerecord3->id);
100
        // Trigger and capture the event.
101
        $sink = $this->redirectEvents();
102
        $this->lesson->resort_pages($page3->id, $pagerecord2->id);
103
        // Get our event event.
104
        $events = $sink->get_events();
105
        $event = reset($events);
106
 
107
        $this->assertCount(1, $events);
108
        // Check that the event data is valid.
109
        $this->assertInstanceOf('\mod_lesson\event\page_moved', $event);
110
        $this->assertEquals($page3->id, $event->objectid);
111
        $this->assertEquals($pagerecord1->id, $event->other['nextpageid']);
112
        $this->assertEquals($pagerecord2->id, $event->other['prevpageid']);
113
        $this->assertEventContextNotUsed($event);
114
        $this->assertDebuggingNotCalled();
115
    }
116
 
117
    /**
118
     * Test the page deleted event.
119
     *
120
     */
11 efrain 121
    public function test_page_deleted(): void {
1 efrain 122
 
123
        // Set up a generator to create content.
124
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_lesson');
125
        // Create a content page.
126
        $pagerecord = $generator->create_content($this->lesson);
127
        // Get the lesson page information.
128
        $page = $this->lesson->load_page($pagerecord->id);
129
        // Trigger and capture the event.
130
        $sink = $this->redirectEvents();
131
        $page->delete();
132
 
133
        // Get our event event.
134
        $events = $sink->get_events();
135
        $event = reset($events);
136
 
137
        // Check that the event data is valid.
138
        $this->assertInstanceOf('\mod_lesson\event\page_deleted', $event);
139
        $this->assertEquals($page->id, $event->objectid);
140
        $this->assertEventContextNotUsed($event);
141
        $this->assertDebuggingNotCalled();
142
    }
143
 
144
    /**
145
     * Test the page updated event.
146
     *
147
     * There is no external API for updateing a page, so the unit test will simply
148
     * create and trigger the event and ensure data is returned as expected.
149
     */
11 efrain 150
    public function test_page_updated(): void {
1 efrain 151
 
152
        // Trigger an event: page updated.
153
        $eventparams = array(
154
            'context' => \context_module::instance($this->lesson->properties()->cmid),
155
            'objectid' => 25,
156
            'other' => array(
157
                'pagetype' => 'True/false'
158
                )
159
        );
160
 
161
        $event = \mod_lesson\event\page_updated::create($eventparams);
162
 
163
        // Trigger and capture the event.
164
        $sink = $this->redirectEvents();
165
        $event->trigger();
166
        $events = $sink->get_events();
167
        $event = reset($events);
168
 
169
        // Check that the event data is valid.
170
        $this->assertInstanceOf('\mod_lesson\event\page_updated', $event);
171
        $this->assertEquals(25, $event->objectid);
172
        $this->assertEquals('True/false', $event->other['pagetype']);
173
        $this->assertEventContextNotUsed($event);
174
        $this->assertDebuggingNotCalled();
175
    }
176
 
177
    /**
178
     * Test the essay attempt viewed event.
179
     *
180
     * There is no external API for viewing an essay attempt, so the unit test will simply
181
     * create and trigger the event and ensure the legacy log data is returned as expected.
182
     */
11 efrain 183
    public function test_essay_attempt_viewed(): void {
1 efrain 184
        // Create a essays list viewed event
185
        $event = \mod_lesson\event\essay_attempt_viewed::create(array(
186
            'objectid' => $this->lesson->id,
187
            'relateduserid' => 3,
188
            'context' => \context_module::instance($this->lesson->properties()->cmid),
189
            'courseid' => $this->course->id
190
        ));
191
 
192
        // Trigger and capture the event.
193
        $sink = $this->redirectEvents();
194
        $event->trigger();
195
        $events = $sink->get_events();
196
        $event = reset($events);
197
 
198
        // Check that the event data is valid.
199
        $this->assertInstanceOf('\mod_lesson\event\essay_attempt_viewed', $event);
200
        $this->assertEquals(\context_module::instance($this->lesson->properties()->cmid), $event->get_context());
201
        $this->assertEventContextNotUsed($event);
202
    }
203
 
204
    /**
205
     * Test the lesson started event.
206
     */
11 efrain 207
    public function test_lesson_started(): void {
1 efrain 208
        // Trigger and capture the event.
209
        $sink = $this->redirectEvents();
210
        $this->lesson->start_timer();
211
        $events = $sink->get_events();
212
        $event = reset($events);
213
 
214
        // Check that the event data is valid.
215
        $this->assertInstanceOf('\mod_lesson\event\lesson_started', $event);
216
        $this->assertEquals(\context_module::instance($this->lesson->properties()->cmid), $event->get_context());
217
        $this->assertEventContextNotUsed($event);
218
    }
219
 
220
    /**
221
     * Test the lesson restarted event.
222
     */
11 efrain 223
    public function test_lesson_restarted(): void {
1 efrain 224
 
225
        // Initialize timer.
226
        $this->lesson->start_timer();
227
        // Trigger and capture the event.
228
        $sink = $this->redirectEvents();
229
        $this->lesson->update_timer(true);
230
        $events = $sink->get_events();
231
        $event = reset($events);
232
 
233
        // Check that the event data is valid.
234
        $this->assertInstanceOf('\mod_lesson\event\lesson_restarted', $event);
235
        $this->assertEquals(\context_module::instance($this->lesson->properties()->cmid), $event->get_context());
236
        $expected = array($this->course->id, 'lesson', 'start', 'view.php?id=' . $this->lesson->properties()->cmid,
237
            $this->lesson->properties()->id, $this->lesson->properties()->cmid);
238
        $this->assertEventContextNotUsed($event);
239
        $this->assertDebuggingNotCalled();
240
 
241
    }
242
 
243
    /**
244
     * Test the lesson restarted event.
245
     */
11 efrain 246
    public function test_lesson_resumed(): void {
1 efrain 247
 
248
        // Initialize timer.
249
        $this->lesson->start_timer();
250
        // Trigger and capture the event.
251
        $sink = $this->redirectEvents();
252
        $this->lesson->update_timer(true, true);
253
        $events = $sink->get_events();
254
        $event = reset($events);
255
 
256
        // Check that the event data is valid.
257
        $this->assertInstanceOf('\mod_lesson\event\lesson_resumed', $event);
258
        $this->assertEquals(\context_module::instance($this->lesson->properties()->cmid), $event->get_context());
259
        $expected = array($this->course->id, 'lesson', 'start', 'view.php?id=' . $this->lesson->properties()->cmid,
260
            $this->lesson->properties()->id, $this->lesson->properties()->cmid);
261
        $this->assertEventContextNotUsed($event);
262
        $this->assertDebuggingNotCalled();
263
 
264
    }
265
    /**
266
     * Test the lesson ended event.
267
     */
11 efrain 268
    public function test_lesson_ended(): void {
1 efrain 269
        global $DB, $USER;
270
 
271
        // Add a lesson timer so that stop_timer() does not complain.
272
        $lessontimer = new \stdClass();
273
        $lessontimer->lessonid = $this->lesson->properties()->id;
274
        $lessontimer->userid = $USER->id;
275
        $lessontimer->startime = time();
276
        $lessontimer->lessontime = time();
277
        $DB->insert_record('lesson_timer', $lessontimer);
278
 
279
        // Trigger and capture the event.
280
        $sink = $this->redirectEvents();
281
        $this->lesson->stop_timer();
282
        $events = $sink->get_events();
283
        $event = reset($events);
284
 
285
        // Check that the event data is valid.
286
        $this->assertInstanceOf('\mod_lesson\event\lesson_ended', $event);
287
        $this->assertEquals(\context_module::instance($this->lesson->properties()->cmid), $event->get_context());
288
        $this->assertEventContextNotUsed($event);
289
    }
290
 
291
    /**
292
     * Test the essay assessed event.
293
     *
294
     * There is no external API for assessing an essay, so the unit test will simply
295
     * create and trigger the event and ensure the legacy log data is returned as expected.
296
     */
11 efrain 297
    public function test_essay_assessed(): void {
1 efrain 298
        // Create an essay assessed event
299
        $gradeid = 5;
300
        $attemptid = 7;
301
        $event = \mod_lesson\event\essay_assessed::create(array(
302
            'objectid' => $gradeid,
303
            'relateduserid' => 3,
304
            'context' => \context_module::instance($this->lesson->properties()->cmid),
305
            'courseid' => $this->course->id,
306
            'other' => array(
307
                'lessonid' => $this->lesson->id,
308
                'attemptid' => $attemptid
309
            )
310
        ));
311
 
312
        // Trigger and capture the event.
313
        $sink = $this->redirectEvents();
314
        $event->trigger();
315
        $events = $sink->get_events();
316
        $event = reset($events);
317
 
318
        // Check that the event data is valid.
319
        $this->assertInstanceOf('\mod_lesson\event\essay_assessed', $event);
320
        $this->assertEquals(\context_module::instance($this->lesson->properties()->cmid), $event->get_context());
321
        $this->assertEventContextNotUsed($event);
322
    }
323
 
324
    /**
325
     * Test the content page viewed event.
326
     *
327
     */
11 efrain 328
    public function test_content_page_viewed(): void {
1 efrain 329
        global $DB, $PAGE;
330
 
331
        // Set up a generator to create content.
332
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_lesson');
333
        // Create a content page.
334
        $pagerecord = $generator->create_content($this->lesson);
335
        // Get the lesson page information.
336
        $page = $this->lesson->load_page($pagerecord->id);
337
        // Get the coursemodule record to setup the $PAGE->cm.
338
        $coursemodule = $DB->get_record('course_modules', array('id' => $this->lesson->properties()->cmid));
339
        // Set the $PAGE->cm.
340
        $PAGE->set_cm($coursemodule);
341
        // Get the appropriate renderer.
342
        $lessonoutput = $PAGE->get_renderer('mod_lesson');
343
 
344
        // Trigger and capture the event.
345
        $sink = $this->redirectEvents();
346
        // Fire the function that leads to the triggering of our event.
347
        $lessonoutput->display_page($this->lesson, $page, false);
348
        $events = $sink->get_events();
349
        $event = reset($events);
350
 
351
        // Check that the event data is valid.
352
        $this->assertInstanceOf('\mod_lesson\event\content_page_viewed', $event);
353
        $this->assertEquals($page->id, $event->objectid);
354
        $this->assertEventContextNotUsed($event);
355
        $this->assertDebuggingNotCalled();
356
    }
357
 
358
    /**
359
     * Test the question viewed event.
360
     *
361
     */
11 efrain 362
    public function test_question_viewed(): void {
1 efrain 363
        global $DB, $PAGE;
364
 
365
        // Set up a generator to create content.
366
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_lesson');
367
        // Create a question page.
368
        $pagerecord = $generator->create_question_truefalse($this->lesson);
369
        // Get the lesson page information.
370
        $page = $this->lesson->load_page($pagerecord->id);
371
        // Get the coursemodule record to setup the $PAGE->cm.
372
        $coursemodule = $DB->get_record('course_modules', array('id' => $this->lesson->properties()->cmid));
373
        // Set the $PAGE->cm.
374
        $PAGE->set_cm($coursemodule);
375
        // Get the appropriate renderer.
376
        $lessonoutput = $PAGE->get_renderer('mod_lesson');
377
 
378
        // Trigger and capture the event.
379
        $sink = $this->redirectEvents();
380
        // Fire the function that leads to the triggering of our event.
381
        $lessonoutput->display_page($this->lesson, $page, false);
382
        $events = $sink->get_events();
383
        $event = reset($events);
384
 
385
        // Check that the event data is valid.
386
        $this->assertInstanceOf('\mod_lesson\event\question_viewed', $event);
387
        $this->assertEquals($page->id, $event->objectid);
388
        $this->assertEquals('True/false', $event->other['pagetype']);
389
        $this->assertEventContextNotUsed($event);
390
        $this->assertDebuggingNotCalled();
391
    }
392
 
393
    /**
394
     * Test the question answered event.
395
     *
396
     * There is no external API for answering an truefalse question, so the unit test will simply
397
     * create and trigger the event and ensure data is returned as expected.
398
     */
11 efrain 399
    public function test_question_answered(): void {
1 efrain 400
 
401
        // Trigger an event: truefalse question answered.
402
        $eventparams = array(
403
            'context' => \context_module::instance($this->lesson->properties()->cmid),
404
            'objectid' => 25,
405
            'other' => array(
406
                'pagetype' => 'True/false'
407
                )
408
        );
409
 
410
        $event = \mod_lesson\event\question_answered::create($eventparams);
411
 
412
        // Trigger and capture the event.
413
        $sink = $this->redirectEvents();
414
        $event->trigger();
415
        $events = $sink->get_events();
416
        $event = reset($events);
417
 
418
        // Check that the event data is valid.
419
        $this->assertInstanceOf('\mod_lesson\event\question_answered', $event);
420
        $this->assertEquals(25, $event->objectid);
421
        $this->assertEquals('True/false', $event->other['pagetype']);
422
        $this->assertEventContextNotUsed($event);
423
        $this->assertDebuggingNotCalled();
424
    }
425
 
426
    /**
427
     * Test the user override created event.
428
     *
429
     * There is no external API for creating a user override, so the unit test will simply
430
     * create and trigger the event and ensure the event data is returned as expected.
431
     */
11 efrain 432
    public function test_user_override_created(): void {
1 efrain 433
 
434
        $params = array(
435
            'objectid' => 1,
436
            'relateduserid' => 2,
437
            'context' => \context_module::instance($this->lesson->properties()->cmid),
438
            'other' => array(
439
                'lessonid' => $this->lesson->id
440
            )
441
        );
442
        $event = \mod_lesson\event\user_override_created::create($params);
443
 
444
        // Trigger and capture the event.
445
        $sink = $this->redirectEvents();
446
        $event->trigger();
447
        $events = $sink->get_events();
448
        $event = reset($events);
449
 
450
        // Check that the event data is valid.
451
        $this->assertInstanceOf('\mod_lesson\event\user_override_created', $event);
452
        $this->assertEquals(\context_module::instance($this->lesson->properties()->cmid), $event->get_context());
453
        $this->assertEventContextNotUsed($event);
454
    }
455
 
456
    /**
457
     * Test the group override created event.
458
     *
459
     * There is no external API for creating a group override, so the unit test will simply
460
     * create and trigger the event and ensure the event data is returned as expected.
461
     */
11 efrain 462
    public function test_group_override_created(): void {
1 efrain 463
 
464
        $params = array(
465
            'objectid' => 1,
466
            'context' => \context_module::instance($this->lesson->properties()->cmid),
467
            'other' => array(
468
                'lessonid' => $this->lesson->id,
469
                'groupid' => 2
470
            )
471
        );
472
        $event = \mod_lesson\event\group_override_created::create($params);
473
 
474
        // Trigger and capture the event.
475
        $sink = $this->redirectEvents();
476
        $event->trigger();
477
        $events = $sink->get_events();
478
        $event = reset($events);
479
 
480
        // Check that the event data is valid.
481
        $this->assertInstanceOf('\mod_lesson\event\group_override_created', $event);
482
        $this->assertEquals(\context_module::instance($this->lesson->properties()->cmid), $event->get_context());
483
        $this->assertEventContextNotUsed($event);
484
    }
485
 
486
    /**
487
     * Test the user override updated event.
488
     *
489
     * There is no external API for updating a user override, so the unit test will simply
490
     * create and trigger the event and ensure the event data is returned as expected.
491
     */
11 efrain 492
    public function test_user_override_updated(): void {
1 efrain 493
 
494
        $params = array(
495
            'objectid' => 1,
496
            'relateduserid' => 2,
497
            'context' => \context_module::instance($this->lesson->properties()->cmid),
498
            'other' => array(
499
                'lessonid' => $this->lesson->id
500
            )
501
        );
502
        $event = \mod_lesson\event\user_override_updated::create($params);
503
 
504
        // Trigger and capture the event.
505
        $sink = $this->redirectEvents();
506
        $event->trigger();
507
        $events = $sink->get_events();
508
        $event = reset($events);
509
 
510
        // Check that the event data is valid.
511
        $this->assertInstanceOf('\mod_lesson\event\user_override_updated', $event);
512
        $this->assertEquals(\context_module::instance($this->lesson->properties()->cmid), $event->get_context());
513
        $this->assertEventContextNotUsed($event);
514
    }
515
 
516
    /**
517
     * Test the group override updated event.
518
     *
519
     * There is no external API for updating a group override, so the unit test will simply
520
     * create and trigger the event and ensure the event data is returned as expected.
521
     */
11 efrain 522
    public function test_group_override_updated(): void {
1 efrain 523
 
524
        $params = array(
525
            'objectid' => 1,
526
            'context' => \context_module::instance($this->lesson->properties()->cmid),
527
            'other' => array(
528
                'lessonid' => $this->lesson->id,
529
                'groupid' => 2
530
            )
531
        );
532
        $event = \mod_lesson\event\group_override_updated::create($params);
533
 
534
        // Trigger and capture the event.
535
        $sink = $this->redirectEvents();
536
        $event->trigger();
537
        $events = $sink->get_events();
538
        $event = reset($events);
539
 
540
        // Check that the event data is valid.
541
        $this->assertInstanceOf('\mod_lesson\event\group_override_updated', $event);
542
        $this->assertEquals(\context_module::instance($this->lesson->properties()->cmid), $event->get_context());
543
        $this->assertEventContextNotUsed($event);
544
    }
545
 
546
    /**
547
     * Test the user override deleted event.
548
     */
11 efrain 549
    public function test_user_override_deleted(): void {
1 efrain 550
        global $DB;
551
 
552
        // Create an override.
553
        $override = new \stdClass();
554
        $override->lesson = $this->lesson->id;
555
        $override->userid = 2;
556
        $override->id = $DB->insert_record('lesson_overrides', $override);
557
 
558
        // Trigger and capture the event.
559
        $sink = $this->redirectEvents();
560
        $this->lesson->delete_override($override->id);
561
        $events = $sink->get_events();
562
        $event = reset($events);
563
 
564
        // Check that the event data is valid.
565
        $this->assertInstanceOf('\mod_lesson\event\user_override_deleted', $event);
566
        $this->assertEquals(\context_module::instance($this->lesson->properties()->cmid), $event->get_context());
567
        $this->assertEventContextNotUsed($event);
568
    }
569
 
570
    /**
571
     * Test the group override deleted event.
572
     */
11 efrain 573
    public function test_group_override_deleted(): void {
1 efrain 574
        global $DB;
575
 
576
        // Create an override.
577
        $override = new \stdClass();
578
        $override->lesson = $this->lesson->id;
579
        $override->groupid = 2;
580
        $override->id = $DB->insert_record('lesson_overrides', $override);
581
 
582
        // Trigger and capture the event.
583
        $sink = $this->redirectEvents();
584
        $this->lesson->delete_override($override->id);
585
        $events = $sink->get_events();
586
        $event = reset($events);
587
 
588
        // Check that the event data is valid.
589
        $this->assertInstanceOf('\mod_lesson\event\group_override_deleted', $event);
590
        $this->assertEquals(\context_module::instance($this->lesson->properties()->cmid), $event->get_context());
591
        $this->assertEventContextNotUsed($event);
592
    }
593
}