Commit | Line | Data |
---|---|---|
c17e70e5 MN |
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 | defined('MOODLE_INTERNAL') || die(); | |
26 | ||
27 | global $CFG; | |
28 | require_once($CFG->dirroot . '/mod/assign/tests/base_test.php'); | |
29 | require_once($CFG->dirroot . '/mod/assign/tests/fixtures/event_mod_assign_fixtures.php'); | |
30 | ||
31 | /** | |
32 | * Contains the event tests for the module assign. | |
33 | * | |
34 | * @package mod_assign | |
35 | * @copyright 2014 Adrian Greeve <adrian@moodle.com> | |
36 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later | |
37 | */ | |
38 | class assign_events_testcase extends mod_assign_base_testcase { | |
39 | ||
bf5b4413 PS |
40 | /** |
41 | * Basic tests for the submission_created() abstract class. | |
42 | */ | |
43 | public function test_base_event() { | |
44 | $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign'); | |
45 | $instance = $generator->create_instance(array('course' => $this->course->id)); | |
46 | $modcontext = context_module::instance($instance->cmid); | |
47 | ||
48 | $data = array( | |
49 | 'context' => $modcontext, | |
50 | ); | |
51 | /** @var \mod_assign_unittests\event\nothing_happened $event */ | |
52 | $event = \mod_assign_unittests\event\nothing_happened::create($data); | |
53 | $assign = $event->get_assign(); | |
54 | $this->assertDebuggingCalled(); | |
55 | $this->assertInstanceOf('assign', $assign); | |
56 | ||
57 | $event = \mod_assign_unittests\event\nothing_happened::create($data); | |
58 | $event->set_assign($assign); | |
59 | $assign2 = $event->get_assign(); | |
60 | $this->assertDebuggingNotCalled(); | |
61 | $this->assertSame($assign, $assign2); | |
62 | } | |
63 | ||
c17e70e5 MN |
64 | /** |
65 | * Basic tests for the submission_created() abstract class. | |
66 | */ | |
67 | public function test_submission_created() { | |
68 | $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign'); | |
69 | $instance = $generator->create_instance(array('course' => $this->course->id)); | |
70 | $modcontext = context_module::instance($instance->cmid); | |
71 | ||
72 | // Standard Event parameters. | |
73 | $params = array( | |
74 | 'context' => $modcontext, | |
75 | 'courseid' => $this->course->id | |
76 | ); | |
77 | ||
78 | $eventinfo = $params; | |
79 | $eventinfo['other'] = array( | |
80 | 'submissionid' => '17', | |
81 | 'submissionattempt' => 0, | |
82 | 'submissionstatus' => 'submitted' | |
83 | ); | |
84 | ||
85 | $sink = $this->redirectEvents(); | |
86 | $event = \mod_assign_unittests\event\submission_created::create($eventinfo); | |
87 | $event->trigger(); | |
88 | $result = $sink->get_events(); | |
89 | $event = reset($result); | |
90 | $sink->close(); | |
91 | ||
92 | $this->assertEquals($modcontext->id, $event->contextid); | |
93 | $this->assertEquals($this->course->id, $event->courseid); | |
94 | ||
95 | // Check that an error occurs when teamsubmission is not set. | |
96 | try { | |
97 | \mod_assign_unittests\event\submission_created::create($params); | |
98 | $this->fail('Other must contain the key submissionid.'); | |
99 | } catch (Exception $e) { | |
100 | $this->assertInstanceOf('coding_exception', $e); | |
101 | } | |
102 | // Check that the submission status debugging is fired. | |
103 | $subinfo = $params; | |
104 | $subinfo['other'] = array('submissionid' => '23'); | |
105 | try { | |
106 | \mod_assign_unittests\event\submission_created::create($subinfo); | |
107 | $this->fail('Other must contain the key submissionattempt.'); | |
108 | } catch (Exception $e) { | |
109 | $this->assertInstanceOf('coding_exception', $e); | |
110 | } | |
111 | ||
112 | $subinfo['other'] = array('submissionattempt' => '0'); | |
113 | try { | |
114 | \mod_assign_unittests\event\submission_created::create($subinfo); | |
115 | $this->fail('Other must contain the key submissionstatus.'); | |
116 | } catch (Exception $e) { | |
117 | $this->assertInstanceOf('coding_exception', $e); | |
118 | } | |
119 | } | |
120 | ||
121 | /** | |
122 | * Basic tests for the submission_updated() abstract class. | |
123 | */ | |
124 | public function test_submission_updated() { | |
125 | $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign'); | |
126 | $instance = $generator->create_instance(array('course' => $this->course->id)); | |
127 | $modcontext = context_module::instance($instance->cmid); | |
128 | ||
129 | // Standard Event parameters. | |
130 | $params = array( | |
131 | 'context' => $modcontext, | |
132 | 'courseid' => $this->course->id | |
133 | ); | |
134 | ||
135 | $eventinfo = $params; | |
136 | $eventinfo['other'] = array( | |
137 | 'submissionid' => '17', | |
138 | 'submissionattempt' => 0, | |
139 | 'submissionstatus' => 'submitted' | |
140 | ); | |
141 | ||
142 | $sink = $this->redirectEvents(); | |
143 | $event = \mod_assign_unittests\event\submission_updated::create($eventinfo); | |
144 | $event->trigger(); | |
145 | $result = $sink->get_events(); | |
146 | $event = reset($result); | |
147 | $sink->close(); | |
148 | ||
149 | $this->assertEquals($modcontext->id, $event->contextid); | |
150 | $this->assertEquals($this->course->id, $event->courseid); | |
151 | ||
152 | // Check that an error occurs when teamsubmission is not set. | |
153 | try { | |
154 | \mod_assign_unittests\event\submission_created::create($params); | |
155 | $this->fail('Other must contain the key submissionid.'); | |
156 | } catch (Exception $e) { | |
157 | $this->assertInstanceOf('coding_exception', $e); | |
158 | } | |
159 | // Check that the submission status debugging is fired. | |
160 | $subinfo = $params; | |
161 | $subinfo['other'] = array('submissionid' => '23'); | |
162 | try { | |
163 | \mod_assign_unittests\event\submission_created::create($subinfo); | |
164 | $this->fail('Other must contain the key submissionattempt.'); | |
165 | } catch (Exception $e) { | |
166 | $this->assertInstanceOf('coding_exception', $e); | |
167 | } | |
168 | ||
169 | $subinfo['other'] = array('submissionattempt' => '0'); | |
170 | try { | |
171 | \mod_assign_unittests\event\submission_created::create($subinfo); | |
172 | $this->fail('Other must contain the key submissionstatus.'); | |
173 | } catch (Exception $e) { | |
174 | $this->assertInstanceOf('coding_exception', $e); | |
175 | } | |
176 | } | |
177 | ||
178 | public function test_extension_granted() { | |
179 | $this->setUser($this->editingteachers[0]); | |
180 | ||
181 | $tomorrow = time() + 24*60*60; | |
182 | $yesterday = time() - 24*60*60; | |
183 | ||
184 | $assign = $this->create_instance(array('duedate' => $yesterday, 'cutoffdate' => $yesterday)); | |
185 | $sink = $this->redirectEvents(); | |
186 | ||
187 | $assign->testable_save_user_extension($this->students[0]->id, $tomorrow); | |
188 | ||
189 | $events = $sink->get_events(); | |
190 | $this->assertCount(1, $events); | |
191 | $event = reset($events); | |
192 | $this->assertInstanceOf('\mod_assign\event\extension_granted', $event); | |
193 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
194 | $this->assertEquals($assign->get_instance()->id, $event->objectid); | |
195 | $this->assertEquals($this->students[0]->id, $event->relateduserid); | |
196 | $expected = array( | |
197 | $assign->get_course()->id, | |
198 | 'assign', | |
199 | 'grant extension', | |
200 | 'view.php?id=' . $assign->get_course_module()->id, | |
201 | $this->students[0]->id, | |
202 | $assign->get_course_module()->id | |
203 | ); | |
204 | $this->assertEventLegacyLogData($expected, $event); | |
205 | $sink->close(); | |
206 | } | |
207 | ||
208 | public function test_submission_locked() { | |
209 | $this->editingteachers[0]->ignoresesskey = true; | |
210 | $this->setUser($this->editingteachers[0]); | |
211 | ||
212 | $assign = $this->create_instance(); | |
213 | $sink = $this->redirectEvents(); | |
214 | ||
215 | $assign->lock_submission($this->students[0]->id); | |
216 | ||
217 | $events = $sink->get_events(); | |
218 | $this->assertCount(1, $events); | |
219 | $event = reset($events); | |
220 | $this->assertInstanceOf('\mod_assign\event\submission_locked', $event); | |
221 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
222 | $this->assertEquals($assign->get_instance()->id, $event->objectid); | |
223 | $this->assertEquals($this->students[0]->id, $event->relateduserid); | |
224 | $expected = array( | |
225 | $assign->get_course()->id, | |
226 | 'assign', | |
227 | 'lock submission', | |
228 | 'view.php?id=' . $assign->get_course_module()->id, | |
229 | get_string('locksubmissionforstudent', 'assign', array('id' => $this->students[0]->id, | |
230 | 'fullname' => fullname($this->students[0]))), | |
231 | $assign->get_course_module()->id | |
232 | ); | |
233 | $this->assertEventLegacyLogData($expected, $event); | |
234 | $sink->close(); | |
235 | ||
236 | // Revert to defaults. | |
237 | $this->editingteachers[0]->ignoresesskey = false; | |
238 | } | |
239 | ||
240 | public function test_identities_revealed() { | |
241 | $this->editingteachers[0]->ignoresesskey = true; | |
242 | $this->setUser($this->editingteachers[0]); | |
243 | ||
244 | $assign = $this->create_instance(array('blindmarking'=>1)); | |
245 | $sink = $this->redirectEvents(); | |
246 | ||
247 | $assign->reveal_identities(); | |
248 | ||
249 | $events = $sink->get_events(); | |
250 | $this->assertCount(1, $events); | |
251 | $event = reset($events); | |
252 | $this->assertInstanceOf('\mod_assign\event\identities_revealed', $event); | |
253 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
254 | $this->assertEquals($assign->get_instance()->id, $event->objectid); | |
255 | $expected = array( | |
256 | $assign->get_course()->id, | |
257 | 'assign', | |
258 | 'reveal identities', | |
259 | 'view.php?id=' . $assign->get_course_module()->id, | |
260 | get_string('revealidentities', 'assign'), | |
261 | $assign->get_course_module()->id | |
262 | ); | |
263 | $this->assertEventLegacyLogData($expected, $event); | |
264 | $sink->close(); | |
265 | ||
266 | // Revert to defaults. | |
267 | $this->editingteachers[0]->ignoresesskey = false; | |
268 | } | |
269 | ||
cf2d7bfb MN |
270 | /** |
271 | * Test the submission_status_viewed event. | |
272 | */ | |
273 | public function test_submission_status_viewed() { | |
274 | global $PAGE; | |
275 | ||
276 | $this->setUser($this->editingteachers[0]); | |
277 | ||
278 | $assign = $this->create_instance(); | |
279 | ||
280 | // We need to set the URL in order to view the feedback. | |
281 | $PAGE->set_url('/a_url'); | |
282 | ||
283 | // Trigger and capture the event. | |
284 | $sink = $this->redirectEvents(); | |
285 | $assign->view(); | |
286 | $events = $sink->get_events(); | |
287 | $this->assertCount(1, $events); | |
288 | $event = reset($events); | |
289 | ||
290 | // Check that the event contains the expected values. | |
291 | $this->assertInstanceOf('\mod_assign\event\submission_status_viewed', $event); | |
292 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
293 | $expected = array( | |
294 | $assign->get_course()->id, | |
295 | 'assign', | |
296 | 'view', | |
297 | 'view.php?id=' . $assign->get_course_module()->id, | |
298 | get_string('viewownsubmissionstatus', 'assign'), | |
299 | $assign->get_course_module()->id | |
300 | ); | |
301 | $this->assertEventLegacyLogData($expected, $event); | |
302 | $this->assertEventContextNotUsed($event); | |
303 | } | |
304 | ||
c17e70e5 MN |
305 | public function test_submission_status_updated() { |
306 | $this->editingteachers[0]->ignoresesskey = true; | |
307 | $this->setUser($this->editingteachers[0]); | |
308 | ||
309 | $assign = $this->create_instance(); | |
310 | $submission = $assign->get_user_submission($this->students[0]->id, true); | |
311 | $submission->status = ASSIGN_SUBMISSION_STATUS_SUBMITTED; | |
312 | $assign->testable_update_submission($submission, $this->students[0]->id, true, false); | |
313 | ||
314 | $sink = $this->redirectEvents(); | |
315 | $assign->revert_to_draft($this->students[0]->id); | |
316 | ||
317 | $events = $sink->get_events(); | |
9147c4e0 MN |
318 | $this->assertCount(2, $events); |
319 | $event = $events[1]; | |
c17e70e5 MN |
320 | $this->assertInstanceOf('\mod_assign\event\submission_status_updated', $event); |
321 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
322 | $this->assertEquals($submission->id, $event->objectid); | |
323 | $this->assertEquals($this->students[0]->id, $event->relateduserid); | |
324 | $this->assertEquals(ASSIGN_SUBMISSION_STATUS_DRAFT, $event->other['newstatus']); | |
325 | $expected = array( | |
326 | $assign->get_course()->id, | |
327 | 'assign', | |
328 | 'revert submission to draft', | |
329 | 'view.php?id=' . $assign->get_course_module()->id, | |
330 | get_string('reverttodraftforstudent', 'assign', array('id' => $this->students[0]->id, | |
331 | 'fullname' => fullname($this->students[0]))), | |
332 | $assign->get_course_module()->id | |
333 | ); | |
334 | $this->assertEventLegacyLogData($expected, $event); | |
335 | $sink->close(); | |
336 | ||
337 | // Revert to defaults. | |
338 | $this->editingteachers[0]->ignoresesskey = false; | |
339 | } | |
340 | ||
341 | public function test_marker_updated() { | |
342 | $this->editingteachers[0]->ignoresesskey = true; | |
343 | $this->setUser($this->editingteachers[0]); | |
344 | ||
345 | $assign = $this->create_instance(); | |
346 | ||
347 | $sink = $this->redirectEvents(); | |
348 | $assign->testable_process_set_batch_marking_allocation($this->students[0]->id, $this->teachers[0]->id); | |
349 | ||
350 | $events = $sink->get_events(); | |
351 | $this->assertCount(1, $events); | |
352 | $event = reset($events); | |
353 | $this->assertInstanceOf('\mod_assign\event\marker_updated', $event); | |
354 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
355 | $this->assertEquals($assign->get_instance()->id, $event->objectid); | |
356 | $this->assertEquals($this->students[0]->id, $event->relateduserid); | |
357 | $this->assertEquals($this->editingteachers[0]->id, $event->userid); | |
358 | $this->assertEquals($this->teachers[0]->id, $event->other['markerid']); | |
359 | $expected = array( | |
360 | $assign->get_course()->id, | |
361 | 'assign', | |
362 | 'set marking allocation', | |
363 | 'view.php?id=' . $assign->get_course_module()->id, | |
364 | get_string('setmarkerallocationforlog', 'assign', array('id' => $this->students[0]->id, | |
365 | 'fullname' => fullname($this->students[0]), 'marker' => fullname($this->teachers[0]))), | |
366 | $assign->get_course_module()->id | |
367 | ); | |
368 | $this->assertEventLegacyLogData($expected, $event); | |
369 | $sink->close(); | |
370 | ||
371 | // Revert to defaults. | |
372 | $this->editingteachers[0]->ignoresesskey = false; | |
373 | } | |
374 | ||
375 | public function test_workflow_state_updated() { | |
376 | $this->editingteachers[0]->ignoresesskey = true; | |
377 | $this->setUser($this->editingteachers[0]); | |
378 | ||
379 | $assign = $this->create_instance(); | |
380 | ||
381 | $sink = $this->redirectEvents(); | |
382 | $assign->testable_process_set_batch_marking_workflow_state($this->students[0]->id, ASSIGN_MARKING_WORKFLOW_STATE_INREVIEW); | |
383 | ||
384 | $events = $sink->get_events(); | |
385 | $this->assertCount(1, $events); | |
386 | $event = reset($events); | |
387 | $this->assertInstanceOf('\mod_assign\event\workflow_state_updated', $event); | |
388 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
389 | $this->assertEquals($assign->get_instance()->id, $event->objectid); | |
390 | $this->assertEquals($this->students[0]->id, $event->relateduserid); | |
391 | $this->assertEquals($this->editingteachers[0]->id, $event->userid); | |
392 | $this->assertEquals(ASSIGN_MARKING_WORKFLOW_STATE_INREVIEW, $event->other['newstate']); | |
393 | $expected = array( | |
394 | $assign->get_course()->id, | |
395 | 'assign', | |
396 | 'set marking workflow state', | |
397 | 'view.php?id=' . $assign->get_course_module()->id, | |
398 | get_string('setmarkingworkflowstateforlog', 'assign', array('id' => $this->students[0]->id, | |
399 | 'fullname' => fullname($this->students[0]), 'state' => ASSIGN_MARKING_WORKFLOW_STATE_INREVIEW)), | |
400 | $assign->get_course_module()->id | |
401 | ); | |
402 | $this->assertEventLegacyLogData($expected, $event); | |
403 | $sink->close(); | |
404 | ||
405 | // Revert to defaults. | |
406 | $this->editingteachers[0]->ignoresesskey = false; | |
407 | } | |
408 | ||
409 | public function test_submission_duplicated() { | |
410 | $this->setUser($this->students[0]); | |
411 | ||
412 | $assign = $this->create_instance(); | |
413 | $submission1 = $assign->get_user_submission($this->students[0]->id, true, 0); | |
414 | $submission2 = $assign->get_user_submission($this->students[0]->id, true, 1); | |
415 | $submission2->status = ASSIGN_SUBMISSION_STATUS_REOPENED; | |
416 | $assign->testable_update_submission($submission2, $this->students[0]->id, time(), $assign->get_instance()->teamsubmission); | |
417 | ||
418 | $sink = $this->redirectEvents(); | |
419 | $notices = null; | |
420 | $assign->copy_previous_attempt($notices); | |
421 | ||
422 | $events = $sink->get_events(); | |
423 | $this->assertCount(1, $events); | |
424 | $event = reset($events); | |
425 | $this->assertInstanceOf('\mod_assign\event\submission_duplicated', $event); | |
426 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
427 | $this->assertEquals($submission2->id, $event->objectid); | |
428 | $this->assertEquals($this->students[0]->id, $event->userid); | |
429 | $submission2->status = ASSIGN_SUBMISSION_STATUS_DRAFT; | |
430 | $expected = array( | |
431 | $assign->get_course()->id, | |
432 | 'assign', | |
433 | 'submissioncopied', | |
434 | 'view.php?id=' . $assign->get_course_module()->id, | |
435 | $assign->testable_format_submission_for_log($submission2), | |
436 | $assign->get_course_module()->id | |
437 | ); | |
438 | $this->assertEventLegacyLogData($expected, $event); | |
439 | $sink->close(); | |
440 | } | |
441 | ||
442 | public function test_submission_unlocked() { | |
443 | $this->editingteachers[0]->ignoresesskey = true; | |
444 | $this->setUser($this->editingteachers[0]); | |
445 | ||
446 | $assign = $this->create_instance(); | |
447 | $sink = $this->redirectEvents(); | |
448 | ||
449 | $assign->unlock_submission($this->students[0]->id); | |
450 | ||
451 | $events = $sink->get_events(); | |
452 | $this->assertCount(1, $events); | |
453 | $event = reset($events); | |
454 | $this->assertInstanceOf('\mod_assign\event\submission_unlocked', $event); | |
455 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
456 | $this->assertEquals($assign->get_instance()->id, $event->objectid); | |
457 | $this->assertEquals($this->students[0]->id, $event->relateduserid); | |
458 | $expected = array( | |
459 | $assign->get_course()->id, | |
460 | 'assign', | |
461 | 'unlock submission', | |
462 | 'view.php?id=' . $assign->get_course_module()->id, | |
463 | get_string('unlocksubmissionforstudent', 'assign', array('id' => $this->students[0]->id, | |
464 | 'fullname' => fullname($this->students[0]))), | |
465 | $assign->get_course_module()->id | |
466 | ); | |
467 | $this->assertEventLegacyLogData($expected, $event); | |
468 | $sink->close(); | |
469 | ||
470 | // Revert to defaults. | |
471 | $this->editingteachers[0]->ignoresesskey = false; | |
472 | } | |
473 | ||
474 | public function test_submission_graded() { | |
0cd720fe | 475 | $this->editingteachers[0]->ignoresesskey = true; |
c17e70e5 MN |
476 | $this->setUser($this->editingteachers[0]); |
477 | $assign = $this->create_instance(); | |
478 | ||
479 | // Test apply_grade_to_user. | |
480 | $sink = $this->redirectEvents(); | |
481 | ||
482 | $data = new stdClass(); | |
483 | $data->grade = '50.0'; | |
484 | $assign->testable_apply_grade_to_user($data, $this->students[0]->id, 0); | |
485 | $grade = $assign->get_user_grade($this->students[0]->id, false, 0); | |
486 | ||
487 | $events = $sink->get_events(); | |
488 | $this->assertCount(1, $events); | |
489 | $event = reset($events); | |
490 | $this->assertInstanceOf('\mod_assign\event\submission_graded', $event); | |
491 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
492 | $this->assertEquals($grade->id, $event->objectid); | |
493 | $this->assertEquals($this->students[0]->id, $event->relateduserid); | |
494 | $expected = array( | |
495 | $assign->get_course()->id, | |
496 | 'assign', | |
497 | 'grade submission', | |
498 | 'view.php?id=' . $assign->get_course_module()->id, | |
499 | $assign->format_grade_for_log($grade), | |
500 | $assign->get_course_module()->id | |
501 | ); | |
502 | $this->assertEventLegacyLogData($expected, $event); | |
503 | $sink->close(); | |
504 | ||
505 | // Test process_save_quick_grades. | |
506 | $sink = $this->redirectEvents(); | |
507 | ||
508 | $data = array( | |
509 | 'grademodified_' . $this->students[0]->id => time(), | |
510 | 'quickgrade_' . $this->students[0]->id => '60.0' | |
511 | ); | |
512 | $assign->testable_process_save_quick_grades($data); | |
513 | $grade = $assign->get_user_grade($this->students[0]->id, false); | |
514 | $this->assertEquals('60.0', $grade->grade); | |
515 | ||
516 | $events = $sink->get_events(); | |
517 | $this->assertCount(1, $events); | |
518 | $event = reset($events); | |
519 | $this->assertInstanceOf('\mod_assign\event\submission_graded', $event); | |
520 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
521 | $this->assertEquals($grade->id, $event->objectid); | |
522 | $this->assertEquals($this->students[0]->id, $event->relateduserid); | |
523 | $expected = array( | |
524 | $assign->get_course()->id, | |
525 | 'assign', | |
526 | 'grade submission', | |
527 | 'view.php?id=' . $assign->get_course_module()->id, | |
528 | $assign->format_grade_for_log($grade), | |
529 | $assign->get_course_module()->id | |
9147c4e0 MN |
530 | ); |
531 | $this->assertEventLegacyLogData($expected, $event); | |
532 | $sink->close(); | |
533 | ||
534 | // Test update_grade. | |
535 | $sink = $this->redirectEvents(); | |
536 | $data = clone($grade); | |
537 | $data->grade = '50.0'; | |
538 | $assign->update_grade($data); | |
539 | $grade = $assign->get_user_grade($this->students[0]->id, false, 0); | |
540 | $this->assertEquals('50.0', $grade->grade); | |
541 | $events = $sink->get_events(); | |
542 | ||
543 | $this->assertCount(1, $events); | |
544 | $event = reset($events); | |
545 | $this->assertInstanceOf('\mod_assign\event\submission_graded', $event); | |
546 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
547 | $this->assertEquals($grade->id, $event->objectid); | |
548 | $this->assertEquals($this->students[0]->id, $event->relateduserid); | |
549 | $expected = array( | |
550 | $assign->get_course()->id, | |
551 | 'assign', | |
552 | 'grade submission', | |
553 | 'view.php?id=' . $assign->get_course_module()->id, | |
554 | $assign->format_grade_for_log($grade), | |
555 | $assign->get_course_module()->id | |
c17e70e5 MN |
556 | ); |
557 | $this->assertEventLegacyLogData($expected, $event); | |
558 | $sink->close(); | |
0cd720fe DW |
559 | // Revert to defaults. |
560 | $this->editingteachers[0]->ignoresesskey = false; | |
c17e70e5 | 561 | } |
1be7aef2 MN |
562 | |
563 | /** | |
564 | * Test the submission_viewed event. | |
565 | */ | |
566 | public function test_submission_viewed() { | |
567 | global $PAGE; | |
568 | ||
569 | $this->setUser($this->editingteachers[0]); | |
570 | ||
571 | $assign = $this->create_instance(); | |
572 | $submission = $assign->get_user_submission($this->students[0]->id, true); | |
573 | ||
574 | // We need to set the URL in order to view the submission. | |
575 | $PAGE->set_url('/a_url'); | |
576 | // A hack - these variables are used by the view_plugin_content function to | |
577 | // determine what we actually want to view - would usually be set in URL. | |
578 | global $_POST; | |
579 | $_POST['plugin'] = 'comments'; | |
580 | $_POST['sid'] = $submission->id; | |
581 | ||
582 | // Trigger and capture the event. | |
583 | $sink = $this->redirectEvents(); | |
584 | $assign->view('viewpluginassignsubmission'); | |
585 | $events = $sink->get_events(); | |
586 | $this->assertCount(1, $events); | |
587 | $event = reset($events); | |
588 | ||
589 | // Check that the event contains the expected values. | |
590 | $this->assertInstanceOf('\mod_assign\event\submission_viewed', $event); | |
591 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
592 | $this->assertEquals($submission->id, $event->objectid); | |
593 | $expected = array( | |
594 | $assign->get_course()->id, | |
595 | 'assign', | |
596 | 'view submission', | |
597 | 'view.php?id=' . $assign->get_course_module()->id, | |
598 | get_string('viewsubmissionforuser', 'assign', $this->students[0]->id), | |
599 | $assign->get_course_module()->id | |
600 | ); | |
601 | $this->assertEventLegacyLogData($expected, $event); | |
602 | $this->assertEventContextNotUsed($event); | |
603 | } | |
3290c01d MN |
604 | |
605 | /** | |
606 | * Test the feedback_viewed event. | |
607 | */ | |
608 | public function test_feedback_viewed() { | |
609 | global $DB, $PAGE; | |
610 | ||
611 | $this->setUser($this->editingteachers[0]); | |
612 | ||
613 | $assign = $this->create_instance(); | |
614 | $submission = $assign->get_user_submission($this->students[0]->id, true); | |
615 | ||
616 | // Insert a grade for this submission. | |
617 | $grade = new stdClass(); | |
618 | $grade->assignment = 1; | |
619 | $grade->userid = $this->students[0]->id; | |
620 | $gradeid = $DB->insert_record('assign_grades', $grade); | |
621 | ||
622 | // We need to set the URL in order to view the feedback. | |
623 | $PAGE->set_url('/a_url'); | |
624 | // A hack - these variables are used by the view_plugin_content function to | |
625 | // determine what we actually want to view - would usually be set in URL. | |
626 | global $_POST; | |
627 | $_POST['plugin'] = 'comments'; | |
628 | $_POST['gid'] = $gradeid; | |
629 | $_POST['sid'] = $submission->id; | |
630 | ||
631 | // Trigger and capture the event. | |
632 | $sink = $this->redirectEvents(); | |
633 | $assign->view('viewpluginassignfeedback'); | |
634 | $events = $sink->get_events(); | |
635 | $this->assertCount(1, $events); | |
636 | $event = reset($events); | |
637 | ||
638 | // Check that the event contains the expected values. | |
639 | $this->assertInstanceOf('\mod_assign\event\feedback_viewed', $event); | |
640 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
641 | $this->assertEquals($gradeid, $event->objectid); | |
642 | $expected = array( | |
643 | $assign->get_course()->id, | |
644 | 'assign', | |
645 | 'view feedback', | |
646 | 'view.php?id=' . $assign->get_course_module()->id, | |
647 | get_string('viewfeedbackforuser', 'assign', $this->students[0]->id), | |
648 | $assign->get_course_module()->id | |
649 | ); | |
650 | $this->assertEventLegacyLogData($expected, $event); | |
651 | $this->assertEventContextNotUsed($event); | |
652 | } | |
1045b6e3 MN |
653 | |
654 | /** | |
655 | * Test the grading_form_viewed event. | |
656 | */ | |
657 | public function test_grading_form_viewed() { | |
658 | global $PAGE; | |
659 | ||
660 | $this->setUser($this->editingteachers[0]); | |
661 | ||
662 | $assign = $this->create_instance(); | |
663 | ||
664 | // We need to set the URL in order to view the feedback. | |
665 | $PAGE->set_url('/a_url'); | |
666 | // A hack - this variable is used by the view_single_grade_page function. | |
667 | global $_POST; | |
668 | $_POST['rownum'] = 1; | |
669 | $_POST['userid'] = $this->students[0]->id; | |
670 | ||
671 | // Trigger and capture the event. | |
672 | $sink = $this->redirectEvents(); | |
673 | $assign->view('grade'); | |
674 | $events = $sink->get_events(); | |
675 | $this->assertCount(1, $events); | |
676 | $event = reset($events); | |
677 | ||
678 | // Check that the event contains the expected values. | |
679 | $this->assertInstanceOf('\mod_assign\event\grading_form_viewed', $event); | |
680 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
681 | $expected = array( | |
682 | $assign->get_course()->id, | |
683 | 'assign', | |
684 | 'view grading form', | |
685 | 'view.php?id=' . $assign->get_course_module()->id, | |
686 | get_string('viewgradingformforstudent', 'assign', array('id' => $this->students[0]->id, | |
687 | 'fullname' => fullname($this->students[0]))), | |
688 | $assign->get_course_module()->id | |
689 | ); | |
690 | $this->assertEventLegacyLogData($expected, $event); | |
691 | $this->assertEventContextNotUsed($event); | |
692 | } | |
7eda466c MN |
693 | |
694 | /** | |
695 | * Test the grading_table_viewed event. | |
696 | */ | |
697 | public function test_grading_table_viewed() { | |
698 | global $PAGE; | |
699 | ||
700 | $this->setUser($this->editingteachers[0]); | |
701 | ||
702 | $assign = $this->create_instance(); | |
703 | ||
704 | // We need to set the URL in order to view the feedback. | |
705 | $PAGE->set_url('/a_url'); | |
706 | // A hack - this variable is used by the view_single_grade_page function. | |
707 | global $_POST; | |
708 | $_POST['rownum'] = 1; | |
709 | $_POST['userid'] = $this->students[0]->id; | |
710 | ||
711 | // Trigger and capture the event. | |
712 | $sink = $this->redirectEvents(); | |
713 | $assign->view('grading'); | |
714 | $events = $sink->get_events(); | |
715 | $this->assertCount(1, $events); | |
716 | $event = reset($events); | |
717 | ||
718 | // Check that the event contains the expected values. | |
719 | $this->assertInstanceOf('\mod_assign\event\grading_table_viewed', $event); | |
720 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
721 | $expected = array( | |
722 | $assign->get_course()->id, | |
723 | 'assign', | |
724 | 'view submission grading table', | |
725 | 'view.php?id=' . $assign->get_course_module()->id, | |
726 | get_string('viewsubmissiongradingtable', 'assign'), | |
727 | $assign->get_course_module()->id | |
728 | ); | |
729 | $this->assertEventLegacyLogData($expected, $event); | |
730 | $this->assertEventContextNotUsed($event); | |
731 | } | |
e65221c2 MN |
732 | |
733 | /** | |
734 | * Test the submission_form_viewed event. | |
735 | */ | |
736 | public function test_submission_form_viewed() { | |
737 | global $PAGE; | |
738 | ||
739 | $this->setUser($this->students[0]); | |
740 | ||
741 | $assign = $this->create_instance(); | |
742 | ||
743 | // We need to set the URL in order to view the submission form. | |
744 | $PAGE->set_url('/a_url'); | |
745 | ||
746 | // Trigger and capture the event. | |
747 | $sink = $this->redirectEvents(); | |
748 | $assign->view('editsubmission'); | |
749 | $events = $sink->get_events(); | |
750 | $this->assertCount(1, $events); | |
751 | $event = reset($events); | |
752 | ||
753 | // Check that the event contains the expected values. | |
754 | $this->assertInstanceOf('\mod_assign\event\submission_form_viewed', $event); | |
755 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
756 | $expected = array( | |
757 | $assign->get_course()->id, | |
758 | 'assign', | |
759 | 'view submit assignment form', | |
760 | 'view.php?id=' . $assign->get_course_module()->id, | |
761 | get_string('editsubmission', 'assign'), | |
762 | $assign->get_course_module()->id | |
763 | ); | |
764 | $this->assertEventLegacyLogData($expected, $event); | |
765 | $this->assertEventContextNotUsed($event); | |
766 | } | |
b06decdd | 767 | |
47349e4e MN |
768 | /** |
769 | * Test the submission_form_viewed event. | |
770 | */ | |
771 | public function test_submission_confirmation_form_viewed() { | |
772 | global $PAGE; | |
773 | ||
774 | $this->setUser($this->students[0]); | |
775 | ||
776 | $assign = $this->create_instance(); | |
777 | ||
778 | // We need to set the URL in order to view the submission form. | |
779 | $PAGE->set_url('/a_url'); | |
780 | ||
781 | // Trigger and capture the event. | |
782 | $sink = $this->redirectEvents(); | |
783 | $assign->view('submit'); | |
784 | $events = $sink->get_events(); | |
785 | $this->assertCount(1, $events); | |
786 | $event = reset($events); | |
787 | ||
788 | // Check that the event contains the expected values. | |
789 | $this->assertInstanceOf('\mod_assign\event\submission_confirmation_form_viewed', $event); | |
790 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
791 | $expected = array( | |
792 | $assign->get_course()->id, | |
793 | 'assign', | |
794 | 'view confirm submit assignment form', | |
795 | 'view.php?id=' . $assign->get_course_module()->id, | |
796 | get_string('viewownsubmissionform', 'assign'), | |
797 | $assign->get_course_module()->id | |
798 | ); | |
799 | $this->assertEventLegacyLogData($expected, $event); | |
800 | $this->assertEventContextNotUsed($event); | |
801 | } | |
802 | ||
b06decdd MN |
803 | /** |
804 | * Test the reveal_identities_confirmation_page_viewed event. | |
805 | */ | |
806 | public function test_reveal_identities_confirmation_page_viewed() { | |
807 | global $PAGE; | |
808 | ||
809 | // Set to the admin user so we have the permission to reveal identities. | |
810 | $this->setAdminUser(); | |
811 | ||
812 | $assign = $this->create_instance(); | |
813 | ||
814 | // We need to set the URL in order to view the submission form. | |
815 | $PAGE->set_url('/a_url'); | |
816 | ||
817 | // Trigger and capture the event. | |
818 | $sink = $this->redirectEvents(); | |
819 | $assign->view('revealidentities'); | |
820 | $events = $sink->get_events(); | |
821 | $this->assertCount(1, $events); | |
822 | $event = reset($events); | |
823 | ||
824 | // Check that the event contains the expected values. | |
825 | $this->assertInstanceOf('\mod_assign\event\reveal_identities_confirmation_page_viewed', $event); | |
826 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
827 | $expected = array( | |
828 | $assign->get_course()->id, | |
829 | 'assign', | |
830 | 'view', | |
831 | 'view.php?id=' . $assign->get_course_module()->id, | |
832 | get_string('viewrevealidentitiesconfirm', 'assign'), | |
833 | $assign->get_course_module()->id | |
834 | ); | |
835 | $this->assertEventLegacyLogData($expected, $event); | |
836 | $this->assertEventContextNotUsed($event); | |
837 | } | |
c24aaa38 MN |
838 | |
839 | /** | |
840 | * Test the statement_accepted event. | |
841 | */ | |
842 | public function test_statement_accepted() { | |
843 | // We want to be a student so we can submit assignments. | |
844 | $this->setUser($this->students[0]); | |
845 | ||
846 | // We do not want to send any messages to the student during the PHPUNIT test. | |
847 | set_config('submissionreceipts', false, 'assign'); | |
848 | ||
849 | $assign = $this->create_instance(); | |
850 | ||
851 | // Create the data we want to pass to the submit_for_grading function. | |
852 | $data = new stdClass(); | |
853 | $data->submissionstatement = 'We are the Borg. You will be assimilated. Resistance is futile. - do you agree | |
854 | to these terms?'; | |
855 | ||
856 | // Trigger and capture the event. | |
857 | $sink = $this->redirectEvents(); | |
858 | $assign->submit_for_grading($data, array()); | |
859 | $events = $sink->get_events(); | |
860 | $event = reset($events); | |
861 | ||
862 | // Check that the event contains the expected values. | |
863 | $this->assertInstanceOf('\mod_assign\event\statement_accepted', $event); | |
864 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
865 | $expected = array( | |
866 | $assign->get_course()->id, | |
867 | 'assign', | |
868 | 'submission statement accepted', | |
869 | 'view.php?id=' . $assign->get_course_module()->id, | |
870 | get_string('submissionstatementacceptedlog', | |
871 | 'mod_assign', | |
872 | fullname($this->students[0])), | |
873 | $assign->get_course_module()->id | |
874 | ); | |
875 | $this->assertEventLegacyLogData($expected, $event); | |
876 | $this->assertEventContextNotUsed($event); | |
877 | ||
878 | // Enable the online text submission plugin. | |
879 | $submissionplugins = $assign->get_submission_plugins(); | |
880 | foreach ($submissionplugins as $plugin) { | |
881 | if ($plugin->get_type() === 'onlinetext') { | |
882 | $plugin->enable(); | |
883 | break; | |
884 | } | |
885 | } | |
886 | ||
887 | // Create the data we want to pass to the save_submission function. | |
888 | $data = new stdClass(); | |
889 | $data->onlinetext_editor = array( | |
890 | 'text' => 'Online text', | |
891 | 'format' => FORMAT_HTML, | |
892 | 'itemid' => file_get_unused_draft_itemid() | |
893 | ); | |
894 | $data->submissionstatement = 'We are the Borg. You will be assimilated. Resistance is futile. - do you agree | |
895 | to these terms?'; | |
896 | ||
897 | // Trigger and capture the event. | |
898 | $sink = $this->redirectEvents(); | |
899 | $assign->save_submission($data, $notices); | |
900 | $events = $sink->get_events(); | |
901 | $event = $events[2]; | |
902 | ||
903 | // Check that the event contains the expected values. | |
904 | $this->assertInstanceOf('\mod_assign\event\statement_accepted', $event); | |
905 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
906 | $this->assertEventLegacyLogData($expected, $event); | |
907 | $this->assertEventContextNotUsed($event); | |
908 | } | |
eef4d594 MN |
909 | |
910 | /** | |
911 | * Test the batch_set_workflow_state_viewed event. | |
912 | */ | |
913 | public function test_batch_set_workflow_state_viewed() { | |
914 | $assign = $this->create_instance(); | |
915 | ||
916 | // Trigger and capture the event. | |
917 | $sink = $this->redirectEvents(); | |
918 | $assign->testable_view_batch_set_workflow_state(); | |
919 | $events = $sink->get_events(); | |
920 | $event = reset($events); | |
921 | ||
922 | // Check that the event contains the expected values. | |
923 | $this->assertInstanceOf('\mod_assign\event\batch_set_workflow_state_viewed', $event); | |
924 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
925 | $expected = array( | |
926 | $assign->get_course()->id, | |
927 | 'assign', | |
928 | 'view batch set marking workflow state', | |
929 | 'view.php?id=' . $assign->get_course_module()->id, | |
930 | get_string('viewbatchsetmarkingworkflowstate', 'assign'), | |
931 | $assign->get_course_module()->id | |
932 | ); | |
933 | $this->assertEventLegacyLogData($expected, $event); | |
934 | $this->assertEventContextNotUsed($event); | |
935 | } | |
81f92c22 MN |
936 | |
937 | /** | |
938 | * Test the batch_set_marker_allocation_viewed event. | |
939 | */ | |
940 | public function test_batch_set_marker_allocation_viewed() { | |
941 | $assign = $this->create_instance(); | |
942 | ||
943 | // Trigger and capture the event. | |
944 | $sink = $this->redirectEvents(); | |
945 | $assign->testable_view_batch_markingallocation(); | |
946 | $events = $sink->get_events(); | |
947 | $event = reset($events); | |
948 | ||
949 | // Check that the event contains the expected values. | |
950 | $this->assertInstanceOf('\mod_assign\event\batch_set_marker_allocation_viewed', $event); | |
951 | $this->assertEquals($assign->get_context(), $event->get_context()); | |
952 | $expected = array( | |
953 | $assign->get_course()->id, | |
954 | 'assign', | |
955 | 'view batch set marker allocation', | |
956 | 'view.php?id=' . $assign->get_course_module()->id, | |
957 | get_string('viewbatchmarkingallocation', 'assign'), | |
958 | $assign->get_course_module()->id | |
959 | ); | |
960 | $this->assertEventLegacyLogData($expected, $event); | |
961 | $this->assertEventContextNotUsed($event); | |
962 | } | |
c17e70e5 | 963 | } |