Proyectos de Subversion Moodle

Rev

Rev 1 | | 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
 * Contains the event tests for the module assign.
19
 *
20
 * @package   mod_assign
21
 * @copyright 2014 Adrian Greeve <adrian@moodle.com>
22
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23
 */
24
 
25
namespace mod_assign\event;
26
 
27
use mod_assign_test_generator;
28
 
29
defined('MOODLE_INTERNAL') || die();
30
 
31
global $CFG;
32
require_once($CFG->dirroot . '/mod/assign/tests/generator.php');
33
require_once($CFG->dirroot . '/mod/assign/tests/fixtures/event_mod_assign_fixtures.php');
34
require_once($CFG->dirroot . '/mod/assign/locallib.php');
35
 
36
/**
37
 * Contains the event tests for the module assign.
38
 *
39
 * @package   mod_assign
40
 * @copyright 2014 Adrian Greeve <adrian@moodle.com>
41
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
42
 */
43
class events_test extends \advanced_testcase {
44
    // Use the generator helper.
45
    use mod_assign_test_generator;
46
 
47
    /**
48
     * Basic tests for the submission_created() abstract class.
49
     */
11 efrain 50
    public function test_base_event(): void {
1 efrain 51
        $this->resetAfterTest();
52
 
53
        $course = $this->getDataGenerator()->create_course();
54
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
55
        $instance = $generator->create_instance(array('course' => $course->id));
56
        $modcontext = \context_module::instance($instance->cmid);
57
 
58
        $data = array(
59
            'context' => $modcontext,
60
        );
61
 
62
        $event = \mod_assign_unittests\event\nothing_happened::create($data);
63
        $assign = $event->get_assign();
64
        $this->assertDebuggingCalled();
65
        $this->assertInstanceOf('assign', $assign);
66
 
67
        $event = \mod_assign_unittests\event\nothing_happened::create($data);
68
        $event->set_assign($assign);
69
        $assign2 = $event->get_assign();
70
        $this->assertDebuggingNotCalled();
71
        $this->assertSame($assign, $assign2);
72
    }
73
 
74
    /**
75
     * Basic tests for the submission_created() abstract class.
76
     */
11 efrain 77
    public function test_submission_created(): void {
1 efrain 78
        $this->resetAfterTest();
79
 
80
        $course = $this->getDataGenerator()->create_course();
81
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
82
        $instance = $generator->create_instance(array('course' => $course->id));
83
        $modcontext = \context_module::instance($instance->cmid);
84
 
85
        // Standard Event parameters.
86
        $params = array(
87
            'context' => $modcontext,
88
            'courseid' => $course->id
89
        );
90
 
91
        $eventinfo = $params;
92
        $eventinfo['other'] = array(
93
            'submissionid' => '17',
94
            'submissionattempt' => 0,
95
            'submissionstatus' => 'submitted'
96
        );
97
 
98
        $sink = $this->redirectEvents();
99
        $event = \mod_assign_unittests\event\submission_created::create($eventinfo);
100
        $event->trigger();
101
        $result = $sink->get_events();
102
        $event = reset($result);
103
        $sink->close();
104
 
105
        $this->assertEquals($modcontext->id, $event->contextid);
106
        $this->assertEquals($course->id, $event->courseid);
107
 
108
        // Check that an error occurs when teamsubmission is not set.
109
        try {
110
            \mod_assign_unittests\event\submission_created::create($params);
111
            $this->fail('Other must contain the key submissionid.');
112
        } catch (\Exception $e) {
113
            $this->assertInstanceOf('coding_exception', $e);
114
        }
115
        // Check that the submission status debugging is fired.
116
        $subinfo = $params;
117
        $subinfo['other'] = array('submissionid' => '23');
118
        try {
119
            \mod_assign_unittests\event\submission_created::create($subinfo);
120
            $this->fail('Other must contain the key submissionattempt.');
121
        } catch (\Exception $e) {
122
            $this->assertInstanceOf('coding_exception', $e);
123
        }
124
 
125
        $subinfo['other'] = array('submissionattempt' => '0');
126
        try {
127
            \mod_assign_unittests\event\submission_created::create($subinfo);
128
            $this->fail('Other must contain the key submissionstatus.');
129
        } catch (\Exception $e) {
130
            $this->assertInstanceOf('coding_exception', $e);
131
        }
132
    }
133
 
134
    /**
135
     * Basic tests for the submission_updated() abstract class.
136
     */
11 efrain 137
    public function test_submission_updated(): void {
1 efrain 138
        $this->resetAfterTest();
139
 
140
        $course = $this->getDataGenerator()->create_course();
141
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
142
        $instance = $generator->create_instance(array('course' => $course->id));
143
        $modcontext = \context_module::instance($instance->cmid);
144
 
145
        // Standard Event parameters.
146
        $params = array(
147
            'context' => $modcontext,
148
            'courseid' => $course->id
149
        );
150
 
151
        $eventinfo = $params;
152
        $eventinfo['other'] = array(
153
            'submissionid' => '17',
154
            'submissionattempt' => 0,
155
            'submissionstatus' => 'submitted'
156
        );
157
 
158
        $sink = $this->redirectEvents();
159
        $event = \mod_assign_unittests\event\submission_updated::create($eventinfo);
160
        $event->trigger();
161
        $result = $sink->get_events();
162
        $event = reset($result);
163
        $sink->close();
164
 
165
        $this->assertEquals($modcontext->id, $event->contextid);
166
        $this->assertEquals($course->id, $event->courseid);
167
 
168
        // Check that an error occurs when teamsubmission is not set.
169
        try {
170
            \mod_assign_unittests\event\submission_created::create($params);
171
            $this->fail('Other must contain the key submissionid.');
172
        } catch (\Exception $e) {
173
            $this->assertInstanceOf('coding_exception', $e);
174
        }
175
        // Check that the submission status debugging is fired.
176
        $subinfo = $params;
177
        $subinfo['other'] = array('submissionid' => '23');
178
        try {
179
            \mod_assign_unittests\event\submission_created::create($subinfo);
180
            $this->fail('Other must contain the key submissionattempt.');
181
        } catch (\Exception $e) {
182
            $this->assertInstanceOf('coding_exception', $e);
183
        }
184
 
185
        $subinfo['other'] = array('submissionattempt' => '0');
186
        try {
187
            \mod_assign_unittests\event\submission_created::create($subinfo);
188
            $this->fail('Other must contain the key submissionstatus.');
189
        } catch (\Exception $e) {
190
            $this->assertInstanceOf('coding_exception', $e);
191
        }
192
    }
193
 
194
    /**
195
     * Test submission_removed event.
196
     *
197
     * @covers \mod_assign\event\submission_removed
198
     */
11 efrain 199
    public function test_submission_removed(): void {
1 efrain 200
        $this->resetAfterTest();
201
 
202
        $course = $this->getDataGenerator()->create_course();
203
        $this->getDataGenerator()->create_and_enrol($course, 'teacher');
204
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
205
 
206
        $assign = $this->create_instance($course);
207
        $this->add_submission($student, $assign);
208
        $submission = $assign->get_user_submission($student->id, 0);
209
 
210
        $sink = $this->redirectEvents();
211
        $assign->remove_submission($student->id);
212
        $events = $sink->get_events();
213
        $this->assertCount(2, $events);
214
        $event = $events[0];
215
        $this->assertInstanceOf('mod_assign\event\submission_removed', $event);
216
        $this->assertEquals($assign->get_context(), $event->get_context());
217
        $this->assertEquals($submission->id, $event->objectid);
218
        $this->assertEquals($student->id, $event->relateduserid);
219
        $this->assertEquals($submission->id, $event->other['submissionid']);
220
        $this->assertEquals(0, $event->other['submissionattempt']);
221
        $this->assertEquals(ASSIGN_SUBMISSION_STATUS_NEW, $event->other['submissionstatus']);
222
        $this->assertEquals(0, $event->other['groupid']);
223
        $this->assertEquals(null, $event->other['groupname']);
224
        $sink->close();
225
    }
226
 
227
    /**
228
     * Test submission_removed event when a team submission is removed.
229
     *
230
     * @covers \mod_assign\event\submission_removed
231
     */
11 efrain 232
    public function test_team_submission_removed(): void {
1 efrain 233
        $this->resetAfterTest();
234
 
235
        $course = $this->getDataGenerator()->create_course();
236
        $this->getDataGenerator()->create_and_enrol($course, 'teacher');
237
        $group = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
238
 
239
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
240
        groups_add_member($group, $student);
241
 
242
        $otherstudent = $this->getDataGenerator()->create_and_enrol($course, 'student');
243
        groups_add_member($group, $otherstudent);
244
 
245
        $assign = $this->create_instance($course, [
246
            'teamsubmission' => 1,
247
        ]);
248
        $this->add_submission($student, $assign);
249
        $submission = $assign->get_group_submission($student->id, 0, true);
250
 
251
        $sink = $this->redirectEvents();
252
        $assign->remove_submission($student->id);
253
        $events = $sink->get_events();
254
        $this->assertCount(2, $events);
255
        $event = $events[0];
256
        $this->assertInstanceOf('mod_assign\event\submission_removed', $event);
257
        $this->assertEquals($assign->get_context(), $event->get_context());
258
        $this->assertEquals($submission->id, $event->objectid);
259
        $this->assertEquals(null, $event->relateduserid);
260
        $this->assertEquals($submission->id, $event->other['submissionid']);
261
        $this->assertEquals(0, $event->other['submissionattempt']);
262
        $this->assertEquals(ASSIGN_SUBMISSION_STATUS_NEW, $event->other['submissionstatus']);
263
        $this->assertEquals($group->id, $event->other['groupid']);
264
        $this->assertEquals($group->name, $event->other['groupname']);
265
        $sink->close();
266
    }
267
 
11 efrain 268
    public function test_extension_granted(): void {
1 efrain 269
        $this->resetAfterTest();
270
 
271
        $course = $this->getDataGenerator()->create_course();
272
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
273
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
274
 
275
        $this->setUser($teacher);
276
 
277
        $now = time();
278
        $tomorrow = $now + DAYSECS;
279
        $yesterday = $now - DAYSECS;
280
 
281
        $assign = $this->create_instance($course, [
282
            'duedate' => $yesterday,
283
            'cutoffdate' => $yesterday,
284
        ]);
285
        $sink = $this->redirectEvents();
286
 
287
        $assign->testable_save_user_extension($student->id, $tomorrow);
288
 
289
        $events = $sink->get_events();
290
        $this->assertCount(1, $events);
291
        $event = reset($events);
292
        $this->assertInstanceOf('\mod_assign\event\extension_granted', $event);
293
        $this->assertEquals($assign->get_context(), $event->get_context());
294
        $this->assertEquals($assign->get_instance()->id, $event->objectid);
295
        $this->assertEquals($student->id, $event->relateduserid);
296
        $sink->close();
297
    }
298
 
11 efrain 299
    public function test_submission_locked(): void {
1 efrain 300
        $this->resetAfterTest();
301
 
302
        $course = $this->getDataGenerator()->create_course();
303
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
304
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
305
 
306
        $teacher->ignoresesskey = true;
307
        $this->setUser($teacher);
308
 
309
        $assign = $this->create_instance($course);
310
        $sink = $this->redirectEvents();
311
 
312
        $assign->lock_submission($student->id);
313
 
314
        $events = $sink->get_events();
315
        $this->assertCount(1, $events);
316
        $event = reset($events);
317
        $this->assertInstanceOf('\mod_assign\event\submission_locked', $event);
318
        $this->assertEquals($assign->get_context(), $event->get_context());
319
        $this->assertEquals($assign->get_instance()->id, $event->objectid);
320
        $this->assertEquals($student->id, $event->relateduserid);
321
        $sink->close();
322
    }
323
 
11 efrain 324
    public function test_identities_revealed(): void {
1 efrain 325
        $this->resetAfterTest();
326
 
327
        $course = $this->getDataGenerator()->create_course();
328
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
329
 
330
        $teacher->ignoresesskey = true;
331
        $this->setUser($teacher);
332
 
333
        $assign = $this->create_instance($course, ['blindmarking' => 1]);
334
        $sink = $this->redirectEvents();
335
 
336
        $assign->reveal_identities();
337
 
338
        $events = $sink->get_events();
339
        $eventscount = 0;
340
 
341
        foreach ($events as $event) {
342
            if ($event instanceof \mod_assign\event\identities_revealed) {
343
                $eventscount++;
344
                $this->assertInstanceOf('\mod_assign\event\identities_revealed', $event);
345
                $this->assertEquals($assign->get_context(), $event->get_context());
346
                $this->assertEquals($assign->get_instance()->id, $event->objectid);
347
            }
348
        }
349
 
350
        $this->assertEquals(1, $eventscount);
351
        $sink->close();
352
    }
353
 
354
    /**
355
     * Test the submission_status_viewed event.
356
     */
11 efrain 357
    public function test_submission_status_viewed(): void {
1 efrain 358
        global $PAGE;
359
        $this->resetAfterTest();
360
 
361
        $course = $this->getDataGenerator()->create_course();
362
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
363
 
364
        $this->setUser($teacher);
365
 
366
        $assign = $this->create_instance($course);
367
 
368
        // We need to set the URL in order to view the feedback.
369
        $PAGE->set_url('/a_url');
370
 
371
        // Trigger and capture the event.
372
        $sink = $this->redirectEvents();
373
        $assign->view();
374
        $events = $sink->get_events();
375
        $this->assertCount(1, $events);
376
        $event = reset($events);
377
 
378
        // Check that the event contains the expected values.
379
        $this->assertInstanceOf('\mod_assign\event\submission_status_viewed', $event);
380
        $this->assertEquals($assign->get_context(), $event->get_context());
381
    }
382
 
383
    /**
384
     * Test submission_status_updated event when a submission is updated.
385
     *
386
     * @covers \mod_assign\event\submission_status_updated
387
     */
11 efrain 388
    public function test_submission_status_updated_on_update(): void {
1 efrain 389
        $this->resetAfterTest();
390
 
391
        $course = $this->getDataGenerator()->create_course();
392
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
393
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
394
 
395
        $this->setUser($teacher);
396
 
397
        $assign = $this->create_instance($course);
398
        $submission = $assign->get_user_submission($student->id, true);
399
        $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED;
400
        $assign->testable_update_submission($submission, $student->id, true, false);
401
 
402
        $sink = $this->redirectEvents();
403
        $assign->revert_to_draft($student->id);
404
 
405
        $events = $sink->get_events();
406
        $this->assertCount(2, $events);
407
        $event = $events[1];
408
        $this->assertInstanceOf('\mod_assign\event\submission_status_updated', $event);
409
        $this->assertEquals($assign->get_context(), $event->get_context());
410
        $this->assertEquals($submission->id, $event->objectid);
411
        $this->assertEquals($student->id, $event->relateduserid);
412
        $this->assertEquals(ASSIGN_SUBMISSION_STATUS_DRAFT, $event->other['newstatus']);
413
        $sink->close();
414
    }
415
 
416
    /**
417
     * Test submission_status_updated event when a submission is removed.
418
     *
419
     * @covers \mod_assign\event\submission_status_updated
420
     */
11 efrain 421
    public function test_submission_status_updated_on_remove(): void {
1 efrain 422
        $this->resetAfterTest();
423
 
424
        $course = $this->getDataGenerator()->create_course();
425
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
426
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
427
 
428
        $assign = $this->create_instance($course);
429
        $this->add_submission($student, $assign);
430
        $submission = $assign->get_user_submission($student->id, false);
431
 
432
        $sink = $this->redirectEvents();
433
        $assign->remove_submission($student->id);
434
 
435
        $events = $sink->get_events();
436
        $this->assertCount(2, $events);
437
 
438
        $event = $events[1];
439
        $this->assertInstanceOf('\mod_assign\event\submission_status_updated', $event);
440
        $this->assertEquals($assign->get_context(), $event->get_context());
441
        $this->assertEquals($submission->id, $event->objectid);
442
        $this->assertEquals($student->id, $event->relateduserid);
443
        $this->assertEquals(ASSIGN_SUBMISSION_STATUS_NEW, $event->other['newstatus']);
444
        $sink->close();
445
    }
446
 
447
    /**
448
     * Test submission_status_updated event when a team submission is removed.
449
     *
450
     * @covers \mod_assign\event\submission_status_updated
451
     */
11 efrain 452
    public function test_team_submission_status_updated_on_remove(): void {
1 efrain 453
        $this->resetAfterTest();
454
 
455
        $course = $this->getDataGenerator()->create_course();
456
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
457
        $group = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
458
 
459
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
460
        groups_add_member($group, $student);
461
 
462
        $otherstudent = $this->getDataGenerator()->create_and_enrol($course, 'student');
463
        groups_add_member($group, $otherstudent);
464
 
465
        $assign = $this->create_instance($course, [
466
            'teamsubmission' => 1,
467
        ]);
468
        $this->add_submission($student, $assign);
469
        $submission = $assign->get_group_submission($student->id, 0, false);
470
 
471
        $sink = $this->redirectEvents();
472
        $assign->remove_submission($student->id);
473
 
474
        $events = $sink->get_events();
475
        $this->assertCount(2, $events);
476
 
477
        $event = $events[1];
478
        $this->assertInstanceOf('\mod_assign\event\submission_status_updated', $event);
479
        $this->assertEquals($assign->get_context(), $event->get_context());
480
        $this->assertEquals($submission->id, $event->objectid);
481
        $this->assertEquals(null, $event->relateduserid);
482
        $this->assertEquals(ASSIGN_SUBMISSION_STATUS_NEW, $event->other['newstatus']);
483
        $sink->close();
484
    }
485
 
11 efrain 486
    public function test_marker_updated(): void {
1 efrain 487
        $this->resetAfterTest();
488
 
489
        $course = $this->getDataGenerator()->create_course();
490
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
491
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
492
 
493
        $teacher->ignoresesskey = true;
494
        $this->setUser($teacher);
495
 
496
        $assign = $this->create_instance($course);
497
 
498
        $sink = $this->redirectEvents();
499
        $assign->testable_process_set_batch_marking_allocation($student->id, $teacher->id);
500
 
501
        $events = $sink->get_events();
502
        $this->assertCount(1, $events);
503
        $event = reset($events);
504
        $this->assertInstanceOf('\mod_assign\event\marker_updated', $event);
505
        $this->assertEquals($assign->get_context(), $event->get_context());
506
        $this->assertEquals($assign->get_instance()->id, $event->objectid);
507
        $this->assertEquals($student->id, $event->relateduserid);
508
        $this->assertEquals($teacher->id, $event->userid);
509
        $this->assertEquals($teacher->id, $event->other['markerid']);
510
        $sink->close();
511
    }
512
 
11 efrain 513
    public function test_workflow_state_updated(): void {
1 efrain 514
        $this->resetAfterTest();
515
 
516
        $course = $this->getDataGenerator()->create_course();
517
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
518
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
519
 
520
        $teacher->ignoresesskey = true;
521
        $this->setUser($teacher);
522
 
523
        $assign = $this->create_instance($course);
524
 
525
        // Test process_set_batch_marking_workflow_state.
526
        $sink = $this->redirectEvents();
527
        $assign->testable_process_set_batch_marking_workflow_state($student->id, ASSIGN_MARKING_WORKFLOW_STATE_INREVIEW);
528
 
529
        $events = $sink->get_events();
530
        $eventcount = 0;
531
        foreach ($events as $event) {
532
            if ($event instanceof \mod_assign\event\submission_graded) {
533
                $eventcount++;
534
                $this->assertInstanceOf('\mod_assign\event\submission_graded', $event);
535
                $this->assertEquals($assign->get_context(), $event->get_context());
536
            }
537
            if ($event instanceof \mod_assign\event\workflow_state_updated) {
538
                $eventcount++;
539
                $this->assertInstanceOf('\mod_assign\event\workflow_state_updated', $event);
540
                $this->assertEquals($assign->get_context(), $event->get_context());
541
                $this->assertEquals($assign->get_instance()->id, $event->objectid);
542
                $this->assertEquals($student->id, $event->relateduserid);
543
                $this->assertEquals($teacher->id, $event->userid);
544
                $this->assertEquals(ASSIGN_MARKING_WORKFLOW_STATE_INREVIEW, $event->other['newstate']);
545
            }
546
        }
547
        $this->assertEquals(2, $eventcount);
548
        $sink->close();
549
 
550
        // Test setting workflow state in apply_grade_to_user.
551
        $sink = $this->redirectEvents();
552
        $data = new \stdClass();
553
        $data->grade = '50.0';
554
        $data->workflowstate = 'readyforrelease';
555
        $assign->testable_apply_grade_to_user($data, $student->id, 0);
556
 
557
        $events = $sink->get_events();
558
        $this->assertCount(4, $events);
559
        $event = reset($events);
560
        $this->assertInstanceOf('\mod_assign\event\workflow_state_updated', $event);
561
        $this->assertEquals($assign->get_context(), $event->get_context());
562
        $this->assertEquals($assign->get_instance()->id, $event->objectid);
563
        $this->assertEquals($student->id, $event->relateduserid);
564
        $this->assertEquals($teacher->id, $event->userid);
565
        $this->assertEquals(ASSIGN_MARKING_WORKFLOW_STATE_READYFORRELEASE, $event->other['newstate']);
566
        $sink->close();
567
 
568
        // Test setting workflow state in process_save_quick_grades.
569
        $sink = $this->redirectEvents();
570
 
571
        $data = array(
572
            'grademodified_' . $student->id => time(),
573
            'gradeattempt_' . $student->id => '',
574
            'quickgrade_' . $student->id => '60.0',
575
            'quickgrade_' . $student->id . '_workflowstate' => 'inmarking'
576
        );
577
        $assign->testable_process_save_quick_grades($data);
578
 
579
        $events = $sink->get_events();
580
        $this->assertCount(4, $events);
581
        $event = reset($events);
582
        $this->assertInstanceOf('\mod_assign\event\workflow_state_updated', $event);
583
        $this->assertEquals($assign->get_context(), $event->get_context());
584
        $this->assertEquals($assign->get_instance()->id, $event->objectid);
585
        $this->assertEquals($student->id, $event->relateduserid);
586
        $this->assertEquals($teacher->id, $event->userid);
587
        $this->assertEquals(ASSIGN_MARKING_WORKFLOW_STATE_INMARKING, $event->other['newstate']);
588
        $sink->close();
589
    }
590
 
11 efrain 591
    public function test_submission_duplicated(): void {
1 efrain 592
        $this->resetAfterTest();
593
 
594
        $course = $this->getDataGenerator()->create_course();
595
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
596
 
597
        $this->setUser($student);
598
 
599
        $assign = $this->create_instance($course);
600
        $submission1 = $assign->get_user_submission($student->id, true, 0);
601
        $submission2 = $assign->get_user_submission($student->id, true, 1);
602
        $submission2->status = ASSIGN_SUBMISSION_STATUS_REOPENED;
603
        $assign->testable_update_submission($submission2, $student->id, time(), $assign->get_instance()->teamsubmission);
604
 
605
        $sink = $this->redirectEvents();
606
        $notices = null;
607
        $assign->copy_previous_attempt($notices);
608
 
609
        $events = $sink->get_events();
610
        $this->assertCount(1, $events);
611
        $event = reset($events);
612
        $this->assertInstanceOf('\mod_assign\event\submission_duplicated', $event);
613
        $this->assertEquals($assign->get_context(), $event->get_context());
614
        $this->assertEquals($submission2->id, $event->objectid);
615
        $this->assertEquals($student->id, $event->userid);
616
        $submission2->status = ASSIGN_SUBMISSION_STATUS_DRAFT;
617
        $sink->close();
618
    }
619
 
11 efrain 620
    public function test_submission_unlocked(): void {
1 efrain 621
        $this->resetAfterTest();
622
 
623
        $course = $this->getDataGenerator()->create_course();
624
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
625
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
626
 
627
        $teacher->ignoresesskey = true;
628
        $this->setUser($teacher);
629
 
630
        $assign = $this->create_instance($course);
631
        $sink = $this->redirectEvents();
632
 
633
        $assign->unlock_submission($student->id);
634
 
635
        $events = $sink->get_events();
636
        $this->assertCount(1, $events);
637
        $event = reset($events);
638
        $this->assertInstanceOf('\mod_assign\event\submission_unlocked', $event);
639
        $this->assertEquals($assign->get_context(), $event->get_context());
640
        $this->assertEquals($assign->get_instance()->id, $event->objectid);
641
        $this->assertEquals($student->id, $event->relateduserid);
642
        $sink->close();
643
    }
644
 
11 efrain 645
    public function test_submission_graded(): void {
1 efrain 646
        $this->resetAfterTest();
647
 
648
        $course = $this->getDataGenerator()->create_course();
649
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
650
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
651
 
652
        $teacher->ignoresesskey = true;
653
        $this->setUser($teacher);
654
 
655
        $assign = $this->create_instance($course);
656
 
657
        // Test apply_grade_to_user.
658
        $sink = $this->redirectEvents();
659
 
660
        $data = new \stdClass();
661
        $data->grade = '50.0';
662
        $assign->testable_apply_grade_to_user($data, $student->id, 0);
663
        $grade = $assign->get_user_grade($student->id, false, 0);
664
 
665
        $events = $sink->get_events();
666
        $this->assertCount(3, $events);
667
        $event = $events[2];
668
        $this->assertInstanceOf('\mod_assign\event\submission_graded', $event);
669
        $this->assertEquals($assign->get_context(), $event->get_context());
670
        $this->assertEquals($grade->id, $event->objectid);
671
        $this->assertEquals($student->id, $event->relateduserid);
672
        $sink->close();
673
 
674
        // Test process_save_quick_grades.
675
        $sink = $this->redirectEvents();
676
 
677
        $grade = $assign->get_user_grade($student->id, false);
678
        $data = array(
679
            'grademodified_' . $student->id => time(),
680
            'gradeattempt_' . $student->id => $grade->attemptnumber,
681
            'quickgrade_' . $student->id => '60.0'
682
        );
683
        $assign->testable_process_save_quick_grades($data);
684
        $grade = $assign->get_user_grade($student->id, false);
685
        $this->assertEquals(60.0, $grade->grade);
686
 
687
        $events = $sink->get_events();
688
        $this->assertCount(3, $events);
689
        $event = $events[2];
690
        $this->assertInstanceOf('\mod_assign\event\submission_graded', $event);
691
        $this->assertEquals($assign->get_context(), $event->get_context());
692
        $this->assertEquals($grade->id, $event->objectid);
693
        $this->assertEquals($student->id, $event->relateduserid);
694
        $sink->close();
695
 
696
        // Test update_grade.
697
        $sink = $this->redirectEvents();
698
        $data = clone($grade);
699
        $data->grade = '50.0';
700
        $assign->update_grade($data);
701
        $grade = $assign->get_user_grade($student->id, false, 0);
702
        $this->assertEquals(50.0, $grade->grade);
703
        $events = $sink->get_events();
704
 
705
        $this->assertCount(3, $events);
706
        $event = $events[2];
707
        $this->assertInstanceOf('\mod_assign\event\submission_graded', $event);
708
        $this->assertEquals($assign->get_context(), $event->get_context());
709
        $this->assertEquals($grade->id, $event->objectid);
710
        $this->assertEquals($student->id, $event->relateduserid);
711
        $sink->close();
712
    }
713
 
714
    /**
715
     * Test the submission_viewed event.
716
     */
11 efrain 717
    public function test_submission_viewed(): void {
1 efrain 718
        global $PAGE;
719
 
720
        $this->resetAfterTest();
721
 
722
        $course = $this->getDataGenerator()->create_course();
723
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
724
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
725
 
726
        $this->setUser($teacher);
727
 
728
        $assign = $this->create_instance($course);
729
        $submission = $assign->get_user_submission($student->id, true);
730
 
731
        // We need to set the URL in order to view the submission.
732
        $PAGE->set_url('/a_url');
733
        // A hack - these variables are used by the view_plugin_content function to
734
        // determine what we actually want to view - would usually be set in URL.
735
        global $_POST;
736
        $_POST['plugin'] = 'comments';
737
        $_POST['sid'] = $submission->id;
738
 
739
        // Trigger and capture the event.
740
        $sink = $this->redirectEvents();
741
        $assign->view('viewpluginassignsubmission');
742
        $events = $sink->get_events();
743
        $this->assertCount(1, $events);
744
        $event = reset($events);
745
 
746
        // Check that the event contains the expected values.
747
        $this->assertInstanceOf('\mod_assign\event\submission_viewed', $event);
748
        $this->assertEquals($assign->get_context(), $event->get_context());
749
        $this->assertEquals($submission->id, $event->objectid);
750
    }
751
 
752
    /**
753
     * Test the feedback_viewed event.
754
     */
11 efrain 755
    public function test_feedback_viewed(): void {
1 efrain 756
        global $DB, $PAGE;
757
 
758
        $this->resetAfterTest();
759
 
760
        $course = $this->getDataGenerator()->create_course();
761
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
762
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
763
 
764
        $this->setUser($teacher);
765
 
766
        $assign = $this->create_instance($course);
767
        $submission = $assign->get_user_submission($student->id, true);
768
 
769
        // Insert a grade for this submission.
770
        $grade = new \stdClass();
771
        $grade->assignment = $assign->get_instance()->id;
772
        $grade->userid = $student->id;
773
        $gradeid = $DB->insert_record('assign_grades', $grade);
774
 
775
        // We need to set the URL in order to view the feedback.
776
        $PAGE->set_url('/a_url');
777
        // A hack - these variables are used by the view_plugin_content function to
778
        // determine what we actually want to view - would usually be set in URL.
779
        global $_POST;
780
        $_POST['plugin'] = 'comments';
781
        $_POST['gid'] = $gradeid;
782
        $_POST['sid'] = $submission->id;
783
 
784
        // Trigger and capture the event.
785
        $sink = $this->redirectEvents();
786
        $assign->view('viewpluginassignfeedback');
787
        $events = $sink->get_events();
788
        $this->assertCount(1, $events);
789
        $event = reset($events);
790
 
791
        // Check that the event contains the expected values.
792
        $this->assertInstanceOf('\mod_assign\event\feedback_viewed', $event);
793
        $this->assertEquals($assign->get_context(), $event->get_context());
794
        $this->assertEquals($gradeid, $event->objectid);
795
    }
796
 
797
    /**
798
     * Test the grading_form_viewed event.
799
     */
11 efrain 800
    public function test_grading_form_viewed(): void {
1 efrain 801
        global $PAGE;
802
 
803
        $this->resetAfterTest();
804
 
805
        $course = $this->getDataGenerator()->create_course();
806
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
807
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
808
 
809
        $this->setUser($teacher);
810
 
811
        $assign = $this->create_instance($course);
812
 
813
        // We need to set the URL in order to view the feedback.
814
        $PAGE->set_url('/a_url');
815
        // A hack - this variable is used by the view_single_grade_page function.
816
        global $_POST;
817
        $_POST['rownum'] = 1;
818
        $_POST['userid'] = $student->id;
819
 
820
        // Trigger and capture the event.
821
        $sink = $this->redirectEvents();
822
        $assign->view('grade');
823
        $events = $sink->get_events();
824
        $this->assertCount(1, $events);
825
        $event = reset($events);
826
 
827
        // Check that the event contains the expected values.
828
        $this->assertInstanceOf('\mod_assign\event\grading_form_viewed', $event);
829
        $this->assertEquals($assign->get_context(), $event->get_context());
830
    }
831
 
832
    /**
833
     * Test the grading_table_viewed event.
834
     */
11 efrain 835
    public function test_grading_table_viewed(): void {
1 efrain 836
        global $PAGE;
837
 
838
        $this->resetAfterTest();
839
 
840
        $course = $this->getDataGenerator()->create_course();
841
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
842
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
843
 
844
        $this->setUser($teacher);
845
 
846
        $assign = $this->create_instance($course);
847
 
848
        // We need to set the URL in order to view the feedback.
849
        $PAGE->set_url('/a_url');
850
        // A hack - this variable is used by the view_single_grade_page function.
851
        global $_POST;
852
        $_POST['rownum'] = 1;
853
        $_POST['userid'] = $student->id;
854
 
855
        // Trigger and capture the event.
856
        $sink = $this->redirectEvents();
857
        $assign->view('grading');
858
        $events = $sink->get_events();
859
        $this->assertCount(1, $events);
860
        $event = reset($events);
861
 
862
        // Check that the event contains the expected values.
863
        $this->assertInstanceOf('\mod_assign\event\grading_table_viewed', $event);
864
        $this->assertEquals($assign->get_context(), $event->get_context());
865
        $this->assertEventContextNotUsed($event);
866
    }
867
 
868
    /**
869
     * Test the submission_form_viewed event.
870
     */
11 efrain 871
    public function test_submission_form_viewed(): void {
1 efrain 872
        global $PAGE;
873
 
874
        $this->resetAfterTest();
875
 
876
        $course = $this->getDataGenerator()->create_course();
877
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
878
 
879
        $this->setUser($student);
880
 
881
        $assign = $this->create_instance($course);
882
 
883
        // We need to set the URL in order to view the submission form.
884
        $PAGE->set_url('/a_url');
885
 
886
        // Trigger and capture the event.
887
        $sink = $this->redirectEvents();
888
        $assign->view('editsubmission');
889
        $events = $sink->get_events();
890
        $this->assertCount(1, $events);
891
        $event = reset($events);
892
 
893
        // Check that the event contains the expected values.
894
        $this->assertInstanceOf('\mod_assign\event\submission_form_viewed', $event);
895
        $this->assertEquals($assign->get_context(), $event->get_context());
896
        $this->assertEventContextNotUsed($event);
897
    }
898
 
899
    /**
900
     * Test the submission_form_viewed event.
901
     */
11 efrain 902
    public function test_submission_confirmation_form_viewed(): void {
1 efrain 903
        global $PAGE;
904
 
905
        $this->resetAfterTest();
906
 
907
        $course = $this->getDataGenerator()->create_course();
908
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
909
 
910
        $this->setUser($student);
911
 
912
        $assign = $this->create_instance($course);
913
 
914
        // We need to set the URL in order to view the submission form.
915
        $PAGE->set_url('/a_url');
916
 
917
        // Trigger and capture the event.
918
        $sink = $this->redirectEvents();
919
        $assign->view('submit');
920
        $events = $sink->get_events();
921
        $this->assertCount(1, $events);
922
        $event = reset($events);
923
 
924
        // Check that the event contains the expected values.
925
        $this->assertInstanceOf('\mod_assign\event\submission_confirmation_form_viewed', $event);
926
        $this->assertEquals($assign->get_context(), $event->get_context());
927
        $this->assertEventContextNotUsed($event);
928
    }
929
 
930
    /**
931
     * Test the reveal_identities_confirmation_page_viewed event.
932
     */
11 efrain 933
    public function test_reveal_identities_confirmation_page_viewed(): void {
1 efrain 934
        global $PAGE;
935
        $this->resetAfterTest();
936
 
937
        // Set to the admin user so we have the permission to reveal identities.
938
        $this->setAdminUser();
939
 
940
        $course = $this->getDataGenerator()->create_course();
941
        $assign = $this->create_instance($course);
942
 
943
        // We need to set the URL in order to view the submission form.
944
        $PAGE->set_url('/a_url');
945
 
946
        // Trigger and capture the event.
947
        $sink = $this->redirectEvents();
948
        $assign->view('revealidentities');
949
        $events = $sink->get_events();
950
        $this->assertCount(1, $events);
951
        $event = reset($events);
952
 
953
        // Check that the event contains the expected values.
954
        $this->assertInstanceOf('\mod_assign\event\reveal_identities_confirmation_page_viewed', $event);
955
        $this->assertEquals($assign->get_context(), $event->get_context());
956
        $this->assertEventContextNotUsed($event);
957
    }
958
 
959
    /**
960
     * Test the statement_accepted event.
961
     */
11 efrain 962
    public function test_statement_accepted(): void {
1 efrain 963
        // We want to be a student so we can submit assignments.
964
        $this->resetAfterTest();
965
 
966
        $course = $this->getDataGenerator()->create_course();
967
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
968
 
969
        $this->setUser($student);
970
 
971
        // We do not want to send any messages to the student during the PHPUNIT test.
972
        set_config('submissionreceipts', false, 'assign');
973
 
974
        $assign = $this->create_instance($course);
975
 
976
        // Create the data we want to pass to the submit_for_grading function.
977
        $data = new \stdClass();
978
        $data->submissionstatement = 'We are the Borg. You will be assimilated. Resistance is futile. - do you agree
979
            to these terms?';
980
 
981
        // Trigger and capture the event.
982
        $sink = $this->redirectEvents();
983
        $assign->submit_for_grading($data, array());
984
        $events = $sink->get_events();
985
        $event = reset($events);
986
 
987
        // Check that the event contains the expected values.
988
        $this->assertInstanceOf('\mod_assign\event\statement_accepted', $event);
989
        $this->assertEquals($assign->get_context(), $event->get_context());
990
        $this->assertEventContextNotUsed($event);
991
 
992
        // Enable the online text submission plugin.
993
        $submissionplugins = $assign->get_submission_plugins();
994
        foreach ($submissionplugins as $plugin) {
995
            if ($plugin->get_type() === 'onlinetext') {
996
                $plugin->enable();
997
                break;
998
            }
999
        }
1000
 
1001
        // Create the data we want to pass to the save_submission function.
1002
        $data = new \stdClass();
1003
        $data->onlinetext_editor = array(
1004
            'text' => 'Online text',
1005
            'format' => FORMAT_HTML,
1006
            'itemid' => file_get_unused_draft_itemid()
1007
        );
1008
        $data->submissionstatement = 'We are the Borg. You will be assimilated. Resistance is futile. - do you agree
1009
            to these terms?';
1010
 
1011
        // Trigger and capture the event.
1012
        $sink = $this->redirectEvents();
1013
        $assign->save_submission($data, $notices);
1014
        $events = $sink->get_events();
1015
        $event = $events[2];
1016
 
1017
        // Check that the event contains the expected values.
1018
        $this->assertInstanceOf('\mod_assign\event\statement_accepted', $event);
1019
        $this->assertEquals($assign->get_context(), $event->get_context());
1020
        $this->assertEventContextNotUsed($event);
1021
    }
1022
 
1023
    /**
1024
     * Test the batch_set_workflow_state_viewed event.
1025
     */
11 efrain 1026
    public function test_batch_set_workflow_state_viewed(): void {
1 efrain 1027
        $this->resetAfterTest();
1028
 
1029
        $course = $this->getDataGenerator()->create_course();
1030
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
1031
        $assign = $this->create_instance($course);
1032
 
1033
        // Trigger and capture the event.
1034
        $sink = $this->redirectEvents();
1035
        $assign->testable_view_batch_set_workflow_state($student->id);
1036
        $events = $sink->get_events();
1037
        $event = reset($events);
1038
 
1039
        // Check that the event contains the expected values.
1040
        $this->assertInstanceOf('\mod_assign\event\batch_set_workflow_state_viewed', $event);
1041
        $this->assertEquals($assign->get_context(), $event->get_context());
1042
        $this->assertEventContextNotUsed($event);
1043
    }
1044
 
1045
    /**
1046
     * Test the batch_set_marker_allocation_viewed event.
1047
     */
11 efrain 1048
    public function test_batch_set_marker_allocation_viewed(): void {
1 efrain 1049
        $this->resetAfterTest();
1050
 
1051
        $course = $this->getDataGenerator()->create_course();
1052
        $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
1053
        $assign = $this->create_instance($course);
1054
 
1055
        // Trigger and capture the event.
1056
        $sink = $this->redirectEvents();
1057
        $assign->testable_view_batch_markingallocation($student->id);
1058
        $events = $sink->get_events();
1059
        $event = reset($events);
1060
 
1061
        // Check that the event contains the expected values.
1062
        $this->assertInstanceOf('\mod_assign\event\batch_set_marker_allocation_viewed', $event);
1063
        $this->assertEquals($assign->get_context(), $event->get_context());
1064
        $this->assertEventContextNotUsed($event);
1065
    }
1066
 
1067
    /**
1068
     * Test the user override created event.
1069
     *
1070
     * There is no external API for creating a user override, so the unit test will simply
1071
     * create and trigger the event and ensure the event data is returned as expected.
1072
     */
11 efrain 1073
    public function test_user_override_created(): void {
1 efrain 1074
        $this->resetAfterTest();
1075
 
1076
        $course = $this->getDataGenerator()->create_course();
1077
        $assign = $this->getDataGenerator()->get_plugin_generator('mod_assign')->create_instance(['course' => $course->id]);
1078
 
1079
        $params = array(
1080
            'objectid' => 1,
1081
            'relateduserid' => 2,
1082
            'context' => \context_module::instance($assign->cmid),
1083
            'other' => array(
1084
                'assignid' => $assign->id
1085
            )
1086
        );
1087
        $event = \mod_assign\event\user_override_created::create($params);
1088
 
1089
        // Trigger and capture the event.
1090
        $sink = $this->redirectEvents();
1091
        $event->trigger();
1092
        $events = $sink->get_events();
1093
        $event = reset($events);
1094
 
1095
        // Check that the event data is valid.
1096
        $this->assertInstanceOf('\mod_assign\event\user_override_created', $event);
1097
        $this->assertEquals(\context_module::instance($assign->cmid), $event->get_context());
1098
        $this->assertEventContextNotUsed($event);
1099
    }
1100
 
1101
    /**
1102
     * Test the group override created event.
1103
     *
1104
     * There is no external API for creating a group override, so the unit test will simply
1105
     * create and trigger the event and ensure the event data is returned as expected.
1106
     */
11 efrain 1107
    public function test_group_override_created(): void {
1 efrain 1108
        $this->resetAfterTest();
1109
 
1110
        $course = $this->getDataGenerator()->create_course();
1111
        $assign = $this->getDataGenerator()->get_plugin_generator('mod_assign')->create_instance(['course' => $course->id]);
1112
 
1113
        $params = array(
1114
            'objectid' => 1,
1115
            'context' => \context_module::instance($assign->cmid),
1116
            'other' => array(
1117
                'assignid' => $assign->id,
1118
                'groupid' => 2
1119
            )
1120
        );
1121
        $event = \mod_assign\event\group_override_created::create($params);
1122
 
1123
        // Trigger and capture the event.
1124
        $sink = $this->redirectEvents();
1125
        $event->trigger();
1126
        $events = $sink->get_events();
1127
        $event = reset($events);
1128
 
1129
        // Check that the event data is valid.
1130
        $this->assertInstanceOf('\mod_assign\event\group_override_created', $event);
1131
        $this->assertEquals(\context_module::instance($assign->cmid), $event->get_context());
1132
        $this->assertEventContextNotUsed($event);
1133
    }
1134
 
1135
    /**
1136
     * Test the user override updated event.
1137
     *
1138
     * There is no external API for updating a user override, so the unit test will simply
1139
     * create and trigger the event and ensure the event data is returned as expected.
1140
     */
11 efrain 1141
    public function test_user_override_updated(): void {
1 efrain 1142
        $this->resetAfterTest();
1143
 
1144
        $course = $this->getDataGenerator()->create_course();
1145
        $assign = $this->getDataGenerator()->get_plugin_generator('mod_assign')->create_instance(['course' => $course->id]);
1146
 
1147
        $params = array(
1148
            'objectid' => 1,
1149
            'relateduserid' => 2,
1150
            'context' => \context_module::instance($assign->cmid),
1151
            'other' => array(
1152
                'assignid' => $assign->id
1153
            )
1154
        );
1155
        $event = \mod_assign\event\user_override_updated::create($params);
1156
 
1157
        // Trigger and capture the event.
1158
        $sink = $this->redirectEvents();
1159
        $event->trigger();
1160
        $events = $sink->get_events();
1161
        $event = reset($events);
1162
 
1163
        // Check that the event data is valid.
1164
        $this->assertInstanceOf('\mod_assign\event\user_override_updated', $event);
1165
        $this->assertEquals(\context_module::instance($assign->cmid), $event->get_context());
1166
        $this->assertEventContextNotUsed($event);
1167
    }
1168
 
1169
    /**
1170
     * Test the group override updated event.
1171
     *
1172
     * There is no external API for updating a group override, so the unit test will simply
1173
     * create and trigger the event and ensure the event data is returned as expected.
1174
     */
11 efrain 1175
    public function test_group_override_updated(): void {
1 efrain 1176
        $this->resetAfterTest();
1177
 
1178
        $course = $this->getDataGenerator()->create_course();
1179
        $assign = $this->getDataGenerator()->get_plugin_generator('mod_assign')->create_instance(['course' => $course->id]);
1180
 
1181
        $params = array(
1182
            'objectid' => 1,
1183
            'context' => \context_module::instance($assign->cmid),
1184
            'other' => array(
1185
                'assignid' => $assign->id,
1186
                'groupid' => 2
1187
            )
1188
        );
1189
        $event = \mod_assign\event\group_override_updated::create($params);
1190
 
1191
        // Trigger and capture the event.
1192
        $sink = $this->redirectEvents();
1193
        $event->trigger();
1194
        $events = $sink->get_events();
1195
        $event = reset($events);
1196
 
1197
        // Check that the event data is valid.
1198
        $this->assertInstanceOf('\mod_assign\event\group_override_updated', $event);
1199
        $this->assertEquals(\context_module::instance($assign->cmid), $event->get_context());
1200
        $this->assertEventContextNotUsed($event);
1201
    }
1202
 
1203
    /**
1204
     * Test the user override deleted event.
1205
     */
11 efrain 1206
    public function test_user_override_deleted(): void {
1 efrain 1207
        global $DB;
1208
        $this->resetAfterTest();
1209
 
1210
        $course = $this->getDataGenerator()->create_course();
1211
        $assigninstance = $this->getDataGenerator()->create_module('assign', array('course' => $course->id));
1212
        $cm = get_coursemodule_from_instance('assign', $assigninstance->id, $course->id);
1213
        $context = \context_module::instance($cm->id);
1214
        $assign = new \assign($context, $cm, $course);
1215
 
1216
        // Create an override.
1217
        $override = new \stdClass();
1218
        $override->assign = $assigninstance->id;
1219
        $override->userid = 2;
1220
        $override->id = $DB->insert_record('assign_overrides', $override);
1221
 
1222
        // Trigger and capture the event.
1223
        $sink = $this->redirectEvents();
1224
        $assign->delete_override($override->id);
1225
        $events = $sink->get_events();
1226
        $event = reset($events);
1227
 
1228
        // Check that the event data is valid.
1229
        $this->assertInstanceOf('\mod_assign\event\user_override_deleted', $event);
1230
        $this->assertEquals(\context_module::instance($cm->id), $event->get_context());
1231
        $this->assertEventContextNotUsed($event);
1232
    }
1233
 
1234
    /**
1235
     * Test the group override deleted event.
1236
     */
11 efrain 1237
    public function test_group_override_deleted(): void {
1 efrain 1238
        global $DB;
1239
        $this->resetAfterTest();
1240
 
1241
        $course = $this->getDataGenerator()->create_course();
1242
        $assigninstance = $this->getDataGenerator()->create_module('assign', array('course' => $course->id));
1243
        $cm = get_coursemodule_from_instance('assign', $assigninstance->id, $course->id);
1244
        $context = \context_module::instance($cm->id);
1245
        $assign = new \assign($context, $cm, $course);
1246
 
1247
        // Create an override.
1248
        $override = new \stdClass();
1249
        $override->assign = $assigninstance->id;
1250
        $override->groupid = 2;
1251
        $override->id = $DB->insert_record('assign_overrides', $override);
1252
 
1253
        // Trigger and capture the event.
1254
        $sink = $this->redirectEvents();
1255
        $assign->delete_override($override->id);
1256
        $events = $sink->get_events();
1257
        $event = reset($events);
1258
 
1259
        // Check that the event data is valid.
1260
        $this->assertInstanceOf('\mod_assign\event\group_override_deleted', $event);
1261
        $this->assertEquals(\context_module::instance($cm->id), $event->get_context());
1262
        $this->assertEventContextNotUsed($event);
1263
    }
1264
 
1265
    /**
1266
     * Test the course module viewed event.
1267
     */
11 efrain 1268
    public function test_course_module_viewed(): void {
1 efrain 1269
        $this->resetAfterTest();
1270
 
1271
        $course = $this->getDataGenerator()->create_course();
1272
        $assign = $this->create_instance($course);
1273
 
1274
        $context = $assign->get_context();
1275
 
1276
        $params = array(
1277
            'context' => $context,
1278
            'objectid' => $assign->get_instance()->id
1279
        );
1280
 
1281
        $event = \mod_assign\event\course_module_viewed::create($params);
1282
 
1283
        // Trigger and capture the event.
1284
        $sink = $this->redirectEvents();
1285
        $event->trigger();
1286
        $events = $sink->get_events();
1287
        $this->assertCount(1, $events);
1288
        $event = reset($events);
1289
 
1290
        // Check that the event contains the expected values.
1291
        $this->assertInstanceOf('\mod_assign\event\course_module_viewed', $event);
1292
        $this->assertEquals($context, $event->get_context());
1293
    }
1294
 
1295
    /**
1296
     * Test that all events generated with blindmarking enabled are anonymous
1297
     */
11 efrain 1298
    public function test_anonymous_events(): void {
1 efrain 1299
        $this->resetAfterTest();
1300
 
1301
        $course = $this->getDataGenerator()->create_course();
1302
        $teacher = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
1303
        $student1 = $this->getDataGenerator()->create_and_enrol($course, 'student');
1304
        $student2 = $this->getDataGenerator()->create_and_enrol($course, 'student');
1305
 
1306
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
1307
        $instance = $generator->create_instance(array('course' => $course->id, 'blindmarking' => 1));
1308
 
1309
        $cm = get_coursemodule_from_instance('assign', $instance->id, $course->id);
1310
        $context = \context_module::instance($cm->id);
1311
        $assign = new \assign($context, $cm, $course);
1312
 
1313
        $this->setUser($teacher);
1314
        $sink = $this->redirectEvents();
1315
 
1316
        $assign->lock_submission($student1->id);
1317
 
1318
        $events = $sink->get_events();
1319
        $event = reset($events);
1320
 
1321
        $this->assertTrue((bool)$event->anonymous);
1322
 
1323
        $assign->reveal_identities();
1324
        $sink = $this->redirectEvents();
1325
        $assign->lock_submission($student2->id);
1326
 
1327
        $events = $sink->get_events();
1328
        $event = reset($events);
1329
 
1330
        $this->assertFalse((bool)$event->anonymous);
1331
    }
1332
 
1333
}