2 // This file is part of Moodle - http://moodle.org/
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>.
18 * Contains the class containing unit tests for the calendar local API.
20 * @package core_calendar
21 * @copyright 2017 Mark Nelson <markn@moodle.com>
22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25 defined('MOODLE_INTERNAL') ||
die();
27 require_once(__DIR__
. '/helpers.php');
29 use \core_calendar\local\event\container
;
32 * Class contaning unit tests for the calendar local API.
34 * @package core_calendar
35 * @copyright 2017 Mark Nelson <markn@moodle.com>
36 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38 class core_calendar_local_api_testcase
extends advanced_testcase
{
43 protected function setUp() {
44 $this->resetAfterTest();
48 * Create a feedback activity instance and a calendar event for
51 * @param array $feedbackproperties Properties to set on the feedback activity
52 * @param array $eventproperties Properties to set on the calendar event
53 * @return array The feedback activity and the calendar event
55 protected function create_feedback_activity_and_event(array $feedbackproperties = [], array $eventproperties = []) {
56 $generator = $this->getDataGenerator();
57 $course = $generator->create_course();
58 $mapper = container
::get_event_mapper();
59 $feedbackgenerator = $generator->get_plugin_generator('mod_feedback');
60 $feedback = $feedbackgenerator->create_instance(array_merge(
61 ['course' => $course->id
],
65 $event = create_event(array_merge(
67 'courseid' => $course->id
,
68 'modulename' => 'feedback',
69 'instance' => $feedback->id
73 $event = $mapper->from_legacy_event_to_event($event);
75 return [$feedback, $event];
79 * Requesting calendar events from a given time should return all events with a sort
80 * time at or after the requested time. All events prior to that time should not
83 * If there are no events on or after the given time then an empty result set should
86 public function test_get_calendar_action_events_by_timesort_after_time() {
87 $user = $this->getDataGenerator()->create_user();
88 $course = $this->getDataGenerator()->create_course();
89 $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
90 $moduleinstance = $generator->create_instance(['course' => $course->id
]);
92 $this->getDataGenerator()->enrol_user($user->id
, $course->id
);
93 $this->resetAfterTest(true);
94 $this->setAdminUser();
97 'type' => CALENDAR_EVENT_TYPE_ACTION
,
98 'courseid' => $course->id
,
99 'modulename' => 'assign',
100 'instance' => $moduleinstance->id
,
101 'userid' => $user->id
,
102 'eventtype' => 'user',
107 $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 1]));
108 $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 2]));
109 $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 3]));
110 $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 4]));
111 $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 5]));
112 $event6 = create_event(array_merge($params, ['name' => 'Event 6', 'timesort' => 6]));
113 $event7 = create_event(array_merge($params, ['name' => 'Event 7', 'timesort' => 7]));
114 $event8 = create_event(array_merge($params, ['name' => 'Event 8', 'timesort' => 8]));
116 $this->setUser($user);
117 $result = \core_calendar\local\api
::get_action_events_by_timesort(5);
119 $this->assertCount(4, $result);
120 $this->assertEquals('Event 5', $result[0]->get_name());
121 $this->assertEquals('Event 6', $result[1]->get_name());
122 $this->assertEquals('Event 7', $result[2]->get_name());
123 $this->assertEquals('Event 8', $result[3]->get_name());
125 $result = \core_calendar\local\api
::get_action_events_by_timesort(9);
127 $this->assertEmpty($result);
129 $this->setAdminUser();
130 $result = \core_calendar\local\api
::get_action_events_by_timesort(5, null, null, 20, false, $user);
131 $this->assertCount(4, $result);
135 * Requesting calendar events before a given time should return all events with a sort
136 * time at or before the requested time (inclusive). All events after that time
137 * should not be returned.
139 * If there are no events before the given time then an empty result set should be
142 public function test_get_calendar_action_events_by_timesort_before_time() {
143 $user = $this->getDataGenerator()->create_user();
144 $course = $this->getDataGenerator()->create_course();
145 $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
146 $moduleinstance = $generator->create_instance(['course' => $course->id
]);
148 $this->getDataGenerator()->enrol_user($user->id
, $course->id
);
149 $this->resetAfterTest(true);
150 $this->setAdminUser();
153 'type' => CALENDAR_EVENT_TYPE_ACTION
,
154 'courseid' => $course->id
,
155 'modulename' => 'assign',
156 'instance' => $moduleinstance->id
,
158 'eventtype' => 'user',
163 $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 2]));
164 $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 3]));
165 $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 4]));
166 $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 5]));
167 $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 6]));
168 $event6 = create_event(array_merge($params, ['name' => 'Event 6', 'timesort' => 7]));
169 $event7 = create_event(array_merge($params, ['name' => 'Event 7', 'timesort' => 8]));
170 $event8 = create_event(array_merge($params, ['name' => 'Event 8', 'timesort' => 9]));
172 $this->setUser($user);
173 $result = \core_calendar\local\api
::get_action_events_by_timesort(null, 5);
175 $this->assertCount(4, $result);
176 $this->assertEquals('Event 1', $result[0]->get_name());
177 $this->assertEquals('Event 2', $result[1]->get_name());
178 $this->assertEquals('Event 3', $result[2]->get_name());
179 $this->assertEquals('Event 4', $result[3]->get_name());
181 $result = \core_calendar\local\api
::get_action_events_by_timesort(null, 1);
183 $this->assertEmpty($result);
187 * Requesting calendar events within a given time range should return all events with
188 * a sort time between the lower and upper time bound (inclusive).
190 * If there are no events in the given time range then an empty result set should be
193 public function test_get_calendar_action_events_by_timesort_time_range() {
194 $user = $this->getDataGenerator()->create_user();
195 $course = $this->getDataGenerator()->create_course();
196 $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
197 $moduleinstance = $generator->create_instance(['course' => $course->id
]);
199 $this->getDataGenerator()->enrol_user($user->id
, $course->id
);
200 $this->resetAfterTest(true);
201 $this->setAdminUser();
204 'type' => CALENDAR_EVENT_TYPE_ACTION
,
205 'courseid' => $course->id
,
206 'modulename' => 'assign',
207 'instance' => $moduleinstance->id
,
209 'eventtype' => 'user',
214 $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 1]));
215 $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 2]));
216 $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 3]));
217 $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 4]));
218 $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 5]));
219 $event6 = create_event(array_merge($params, ['name' => 'Event 6', 'timesort' => 6]));
220 $event7 = create_event(array_merge($params, ['name' => 'Event 7', 'timesort' => 7]));
221 $event8 = create_event(array_merge($params, ['name' => 'Event 8', 'timesort' => 8]));
223 $this->setUser($user);
224 $result = \core_calendar\local\api
::get_action_events_by_timesort(3, 6);
226 $this->assertCount(4, $result);
227 $this->assertEquals('Event 3', $result[0]->get_name());
228 $this->assertEquals('Event 4', $result[1]->get_name());
229 $this->assertEquals('Event 5', $result[2]->get_name());
230 $this->assertEquals('Event 6', $result[3]->get_name());
232 $result = \core_calendar\local\api
::get_action_events_by_timesort(10, 15);
234 $this->assertEmpty($result);
238 * Requesting calendar events within a given time range and a limit and offset should return
239 * the number of events up to the given limit value that have a sort time between the lower
240 * and uppper time bound (inclusive) where the result set is shifted by the offset value.
242 * If there are no events in the given time range then an empty result set should be
245 public function test_get_calendar_action_events_by_timesort_time_limit_offset() {
246 $user = $this->getDataGenerator()->create_user();
247 $course = $this->getDataGenerator()->create_course();
248 $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
249 $moduleinstance = $generator->create_instance(['course' => $course->id
]);
251 $this->getDataGenerator()->enrol_user($user->id
, $course->id
);
252 $this->resetAfterTest(true);
253 $this->setAdminUser();
256 'type' => CALENDAR_EVENT_TYPE_ACTION
,
257 'courseid' => $course->id
,
258 'modulename' => 'assign',
259 'instance' => $moduleinstance->id
,
261 'eventtype' => 'user',
266 $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 1]));
267 $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 2]));
268 $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 3]));
269 $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 4]));
270 $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 5]));
271 $event6 = create_event(array_merge($params, ['name' => 'Event 6', 'timesort' => 6]));
272 $event7 = create_event(array_merge($params, ['name' => 'Event 7', 'timesort' => 7]));
273 $event8 = create_event(array_merge($params, ['name' => 'Event 8', 'timesort' => 8]));
275 $this->setUser($user);
276 $result = \core_calendar\local\api
::get_action_events_by_timesort(2, 7, $event3->id
, 2);
278 $this->assertCount(2, $result);
279 $this->assertEquals('Event 4', $result[0]->get_name());
280 $this->assertEquals('Event 5', $result[1]->get_name());
282 $result = \core_calendar\local\api
::get_action_events_by_timesort(2, 7, $event5->id
, 2);
284 $this->assertCount(2, $result);
285 $this->assertEquals('Event 6', $result[0]->get_name());
286 $this->assertEquals('Event 7', $result[1]->get_name());
288 $result = \core_calendar\local\api
::get_action_events_by_timesort(2, 7, $event7->id
, 2);
290 $this->assertEmpty($result);
294 * Requesting calendar events from a given course and time should return all
295 * events with a sort time at or after the requested time. All events prior
296 * to that time should not be return.
298 * If there are no events on or after the given time then an empty result set should
301 public function test_get_calendar_action_events_by_course_after_time() {
302 $user = $this->getDataGenerator()->create_user();
303 $course1 = $this->getDataGenerator()->create_course();
304 $course2 = $this->getDataGenerator()->create_course();
305 $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
306 $moduleinstance1 = $generator->create_instance(['course' => $course1->id
]);
307 $moduleinstance2 = $generator->create_instance(['course' => $course2->id
]);
309 $this->getDataGenerator()->enrol_user($user->id
, $course1->id
);
310 $this->getDataGenerator()->enrol_user($user->id
, $course2->id
);
311 $this->resetAfterTest(true);
312 $this->setUser($user);
315 'type' => CALENDAR_EVENT_TYPE_ACTION
,
316 'modulename' => 'assign',
317 'instance' => $moduleinstance1->id
,
318 'userid' => $user->id
,
319 'courseid' => $course1->id
,
320 'eventtype' => 'user',
325 $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 1]));
326 $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 2]));
327 $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 3]));
328 $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 4]));
329 $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 5]));
330 $event6 = create_event(array_merge($params, ['name' => 'Event 6', 'timesort' => 6]));
331 $event7 = create_event(array_merge($params, ['name' => 'Event 7', 'timesort' => 7]));
332 $event8 = create_event(array_merge($params, ['name' => 'Event 8', 'timesort' => 8]));
334 $params['courseid'] = $course2->id
;
335 $params['instance'] = $moduleinstance2->id
;
336 $event9 = create_event(array_merge($params, ['name' => 'Event 9', 'timesort' => 1]));
337 $event10 = create_event(array_merge($params, ['name' => 'Event 10', 'timesort' => 2]));
338 $event11 = create_event(array_merge($params, ['name' => 'Event 11', 'timesort' => 3]));
339 $event12 = create_event(array_merge($params, ['name' => 'Event 12', 'timesort' => 4]));
340 $event13 = create_event(array_merge($params, ['name' => 'Event 13', 'timesort' => 5]));
341 $event14 = create_event(array_merge($params, ['name' => 'Event 14', 'timesort' => 6]));
342 $event15 = create_event(array_merge($params, ['name' => 'Event 15', 'timesort' => 7]));
343 $event16 = create_event(array_merge($params, ['name' => 'Event 16', 'timesort' => 8]));
345 $result = \core_calendar\local\api
::get_action_events_by_course($course1, 5);
347 $this->assertCount(4, $result);
348 $this->assertEquals('Event 5', $result[0]->get_name());
349 $this->assertEquals('Event 6', $result[1]->get_name());
350 $this->assertEquals('Event 7', $result[2]->get_name());
351 $this->assertEquals('Event 8', $result[3]->get_name());
353 $result = \core_calendar\local\api
::get_action_events_by_course($course1, 9);
355 $this->assertEmpty($result);
359 * Requesting calendar events for a course and before a given time should return
360 * all events with a sort time at or before the requested time (inclusive). All
361 * events after that time should not be returned.
363 * If there are no events before the given time then an empty result set should be
366 public function test_get_calendar_action_events_by_course_before_time() {
367 $user = $this->getDataGenerator()->create_user();
368 $course1 = $this->getDataGenerator()->create_course();
369 $course2 = $this->getDataGenerator()->create_course();
370 $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
371 $moduleinstance1 = $generator->create_instance(['course' => $course1->id
]);
372 $moduleinstance2 = $generator->create_instance(['course' => $course2->id
]);
374 $this->getDataGenerator()->enrol_user($user->id
, $course1->id
);
375 $this->getDataGenerator()->enrol_user($user->id
, $course2->id
);
376 $this->resetAfterTest(true);
377 $this->setUser($user);
380 'type' => CALENDAR_EVENT_TYPE_ACTION
,
381 'modulename' => 'assign',
382 'instance' => $moduleinstance1->id
,
383 'userid' => $user->id
,
384 'courseid' => $course1->id
,
385 'eventtype' => 'user',
390 $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 2]));
391 $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 3]));
392 $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 4]));
393 $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 5]));
394 $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 6]));
395 $event6 = create_event(array_merge($params, ['name' => 'Event 6', 'timesort' => 7]));
396 $event7 = create_event(array_merge($params, ['name' => 'Event 7', 'timesort' => 8]));
397 $event8 = create_event(array_merge($params, ['name' => 'Event 8', 'timesort' => 9]));
399 $params['courseid'] = $course2->id
;
400 $params['instance'] = $moduleinstance2->id
;
401 $event9 = create_event(array_merge($params, ['name' => 'Event 9', 'timesort' => 2]));
402 $event10 = create_event(array_merge($params, ['name' => 'Event 10', 'timesort' => 3]));
403 $event11 = create_event(array_merge($params, ['name' => 'Event 11', 'timesort' => 4]));
404 $event12 = create_event(array_merge($params, ['name' => 'Event 12', 'timesort' => 5]));
405 $event13 = create_event(array_merge($params, ['name' => 'Event 13', 'timesort' => 6]));
406 $event14 = create_event(array_merge($params, ['name' => 'Event 14', 'timesort' => 7]));
407 $event15 = create_event(array_merge($params, ['name' => 'Event 15', 'timesort' => 8]));
408 $event16 = create_event(array_merge($params, ['name' => 'Event 16', 'timesort' => 9]));
410 $result = \core_calendar\local\api
::get_action_events_by_course($course1, null, 5);
412 $this->assertCount(4, $result);
413 $this->assertEquals('Event 1', $result[0]->get_name());
414 $this->assertEquals('Event 2', $result[1]->get_name());
415 $this->assertEquals('Event 3', $result[2]->get_name());
416 $this->assertEquals('Event 4', $result[3]->get_name());
418 $result = \core_calendar\local\api
::get_action_events_by_course($course1, null, 1);
420 $this->assertEmpty($result);
424 * Requesting calendar events for a course and within a given time range should
425 * return all events with a sort time between the lower and upper time bound
428 * If there are no events in the given time range then an empty result set should be
431 public function test_get_calendar_action_events_by_course_time_range() {
432 $user = $this->getDataGenerator()->create_user();
433 $course1 = $this->getDataGenerator()->create_course();
434 $course2 = $this->getDataGenerator()->create_course();
435 $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
436 $moduleinstance1 = $generator->create_instance(['course' => $course1->id
]);
437 $moduleinstance2 = $generator->create_instance(['course' => $course2->id
]);
439 $this->getDataGenerator()->enrol_user($user->id
, $course1->id
);
440 $this->getDataGenerator()->enrol_user($user->id
, $course2->id
);
441 $this->resetAfterTest(true);
442 $this->setUser($user);
445 'type' => CALENDAR_EVENT_TYPE_ACTION
,
446 'modulename' => 'assign',
447 'instance' => $moduleinstance1->id
,
448 'userid' => $user->id
,
449 'courseid' => $course1->id
,
450 'eventtype' => 'user',
455 $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 1]));
456 $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 2]));
457 $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 3]));
458 $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 4]));
459 $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 5]));
460 $event6 = create_event(array_merge($params, ['name' => 'Event 6', 'timesort' => 6]));
461 $event7 = create_event(array_merge($params, ['name' => 'Event 7', 'timesort' => 7]));
462 $event8 = create_event(array_merge($params, ['name' => 'Event 8', 'timesort' => 8]));
464 $params['courseid'] = $course2->id
;
465 $params['instance'] = $moduleinstance2->id
;
466 $event9 = create_event(array_merge($params, ['name' => 'Event 9', 'timesort' => 1]));
467 $event10 = create_event(array_merge($params, ['name' => 'Event 10', 'timesort' => 2]));
468 $event11 = create_event(array_merge($params, ['name' => 'Event 11', 'timesort' => 3]));
469 $event12 = create_event(array_merge($params, ['name' => 'Event 12', 'timesort' => 4]));
470 $event13 = create_event(array_merge($params, ['name' => 'Event 13', 'timesort' => 5]));
471 $event14 = create_event(array_merge($params, ['name' => 'Event 14', 'timesort' => 6]));
472 $event15 = create_event(array_merge($params, ['name' => 'Event 15', 'timesort' => 7]));
473 $event16 = create_event(array_merge($params, ['name' => 'Event 16', 'timesort' => 8]));
475 $result = \core_calendar\local\api
::get_action_events_by_course($course1, 3, 6);
477 $this->assertCount(4, $result);
478 $this->assertEquals('Event 3', $result[0]->get_name());
479 $this->assertEquals('Event 4', $result[1]->get_name());
480 $this->assertEquals('Event 5', $result[2]->get_name());
481 $this->assertEquals('Event 6', $result[3]->get_name());
483 $result = \core_calendar\local\api
::get_action_events_by_course($course1, 10, 15);
485 $this->assertEmpty($result);
489 * Requesting calendar events for a course and within a given time range and a limit
490 * and offset should return the number of events up to the given limit value that have
491 * a sort time between the lower and uppper time bound (inclusive) where the result
492 * set is shifted by the offset value.
494 * If there are no events in the given time range then an empty result set should be
497 public function test_get_calendar_action_events_by_course_time_limit_offset() {
498 $user = $this->getDataGenerator()->create_user();
499 $course1 = $this->getDataGenerator()->create_course();
500 $course2 = $this->getDataGenerator()->create_course();
501 $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
502 $moduleinstance1 = $generator->create_instance(['course' => $course1->id
]);
503 $moduleinstance2 = $generator->create_instance(['course' => $course2->id
]);
505 $this->getDataGenerator()->enrol_user($user->id
, $course1->id
);
506 $this->getDataGenerator()->enrol_user($user->id
, $course2->id
);
507 $this->resetAfterTest(true);
508 $this->setUser($user);
511 'type' => CALENDAR_EVENT_TYPE_ACTION
,
512 'modulename' => 'assign',
513 'instance' => $moduleinstance1->id
,
514 'userid' => $user->id
,
515 'courseid' => $course1->id
,
516 'eventtype' => 'user',
521 $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 1]));
522 $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 2]));
523 $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 3]));
524 $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 4]));
525 $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 5]));
526 $event6 = create_event(array_merge($params, ['name' => 'Event 6', 'timesort' => 6]));
527 $event7 = create_event(array_merge($params, ['name' => 'Event 7', 'timesort' => 7]));
528 $event8 = create_event(array_merge($params, ['name' => 'Event 8', 'timesort' => 8]));
530 $params['courseid'] = $course2->id
;
531 $params['instance'] = $moduleinstance2->id
;
532 $event9 = create_event(array_merge($params, ['name' => 'Event 9', 'timesort' => 1]));
533 $event10 = create_event(array_merge($params, ['name' => 'Event 10', 'timesort' => 2]));
534 $event11 = create_event(array_merge($params, ['name' => 'Event 11', 'timesort' => 3]));
535 $event12 = create_event(array_merge($params, ['name' => 'Event 12', 'timesort' => 4]));
536 $event13 = create_event(array_merge($params, ['name' => 'Event 13', 'timesort' => 5]));
537 $event14 = create_event(array_merge($params, ['name' => 'Event 14', 'timesort' => 6]));
538 $event15 = create_event(array_merge($params, ['name' => 'Event 15', 'timesort' => 7]));
539 $event16 = create_event(array_merge($params, ['name' => 'Event 16', 'timesort' => 8]));
541 $result = \core_calendar\local\api
::get_action_events_by_course($course1, 2, 7, $event3->id
, 2);
543 $this->assertCount(2, $result);
544 $this->assertEquals('Event 4', $result[0]->get_name());
545 $this->assertEquals('Event 5', $result[1]->get_name());
547 $result = \core_calendar\local\api
::get_action_events_by_course($course1, 2, 7, $event5->id
, 2);
549 $this->assertCount(2, $result);
550 $this->assertEquals('Event 6', $result[0]->get_name());
551 $this->assertEquals('Event 7', $result[1]->get_name());
553 $result = \core_calendar\local\api
::get_action_events_by_course($course1, 2, 7, $event7->id
, 2);
555 $this->assertEmpty($result);
559 * Test that get_action_events_by_courses will return a list of events for each
560 * course you provided as long as the user is enrolled in the course.
562 public function test_get_action_events_by_courses() {
563 $user = $this->getDataGenerator()->create_user();
564 $course1 = $this->getDataGenerator()->create_course();
565 $course2 = $this->getDataGenerator()->create_course();
566 $course3 = $this->getDataGenerator()->create_course();
567 $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
568 $moduleinstance1 = $generator->create_instance(['course' => $course1->id
]);
569 $moduleinstance2 = $generator->create_instance(['course' => $course2->id
]);
570 $moduleinstance3 = $generator->create_instance(['course' => $course3->id
]);
572 $this->getDataGenerator()->enrol_user($user->id
, $course1->id
);
573 $this->getDataGenerator()->enrol_user($user->id
, $course2->id
);
574 $this->getDataGenerator()->enrol_user($user->id
, $course3->id
);
575 $this->resetAfterTest(true);
576 $this->setUser($user);
579 'type' => CALENDAR_EVENT_TYPE_ACTION
,
580 'modulename' => 'assign',
581 'instance' => $moduleinstance1->id
,
582 'userid' => $user->id
,
583 'courseid' => $course1->id
,
584 'eventtype' => 'user',
589 $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 1]));
590 $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 2]));
592 $params['courseid'] = $course2->id
;
593 $params['instance'] = $moduleinstance2->id
;
594 $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 3]));
595 $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 4]));
596 $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 5]));
598 $params['courseid'] = $course3->id
;
599 $params['instance'] = $moduleinstance3->id
;
600 $event6 = create_event(array_merge($params, ['name' => 'Event 6', 'timesort' => 6]));
601 $event7 = create_event(array_merge($params, ['name' => 'Event 7', 'timesort' => 7]));
602 $event8 = create_event(array_merge($params, ['name' => 'Event 8', 'timesort' => 8]));
603 $event9 = create_event(array_merge($params, ['name' => 'Event 9', 'timesort' => 9]));
605 $result = \core_calendar\local\api
::get_action_events_by_courses([], 1);
607 $this->assertEmpty($result);
609 $result = \core_calendar\local\api
::get_action_events_by_courses([$course1], 3);
611 $this->assertEmpty($result[$course1->id
]);
613 $result = \core_calendar\local\api
::get_action_events_by_courses([$course1], 1);
615 $this->assertCount(2, $result[$course1->id
]);
616 $this->assertEquals('Event 1', $result[$course1->id
][0]->get_name());
617 $this->assertEquals('Event 2', $result[$course1->id
][1]->get_name());
619 $result = \core_calendar\local\api
::get_action_events_by_courses([$course1, $course2], 1);
621 $this->assertCount(2, $result[$course1->id
]);
622 $this->assertEquals('Event 1', $result[$course1->id
][0]->get_name());
623 $this->assertEquals('Event 2', $result[$course1->id
][1]->get_name());
624 $this->assertCount(3, $result[$course2->id
]);
625 $this->assertEquals('Event 3', $result[$course2->id
][0]->get_name());
626 $this->assertEquals('Event 4', $result[$course2->id
][1]->get_name());
627 $this->assertEquals('Event 5', $result[$course2->id
][2]->get_name());
629 $result = \core_calendar\local\api
::get_action_events_by_courses([$course1, $course2], 2, 4);
631 $this->assertCount(1, $result[$course1->id
]);
632 $this->assertEquals('Event 2', $result[$course1->id
][0]->get_name());
633 $this->assertCount(2, $result[$course2->id
]);
634 $this->assertEquals('Event 3', $result[$course2->id
][0]->get_name());
635 $this->assertEquals('Event 4', $result[$course2->id
][1]->get_name());
637 $result = \core_calendar\local\api
::get_action_events_by_courses([$course1, $course2, $course3], 1, null, 1);
639 $this->assertCount(1, $result[$course1->id
]);
640 $this->assertEquals('Event 1', $result[$course1->id
][0]->get_name());
641 $this->assertCount(1, $result[$course2->id
]);
642 $this->assertEquals('Event 3', $result[$course2->id
][0]->get_name());
643 $this->assertCount(1, $result[$course3->id
]);
644 $this->assertEquals('Event 6', $result[$course3->id
][0]->get_name());
648 * Test that the get_legacy_events() function only returns activity events that are enabled.
650 public function test_get_legacy_events_with_disabled_module() {
653 $this->setAdminUser();
655 $course = $this->getDataGenerator()->create_course();
657 $assigngenerator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
658 $assigninstance = $assigngenerator->create_instance(['course' => $course->id
]);
660 $lessongenerator = $this->getDataGenerator()->get_plugin_generator('mod_lesson');
661 $lessoninstance = $lessongenerator->create_instance(['course' => $course->id
]);
662 $student = $this->getDataGenerator()->create_user();
663 $this->getDataGenerator()->enrol_user($student->id
, $course->id
, 'student');
664 $this->setUser($student);
667 'name' => 'Start of assignment',
669 'location' => 'Test',
671 'courseid' => $course->id
,
674 'modulename' => 'assign',
675 'instance' => $assigninstance->id
,
676 'eventtype' => 'due',
677 'timestart' => time(),
678 'timeduration' => 86400,
681 'name' => 'Start of lesson',
683 'location' => 'Test',
685 'courseid' => $course->id
,
688 'modulename' => 'lesson',
689 'instance' => $lessoninstance->id
,
690 'eventtype' => 'end',
691 'timestart' => time(),
692 'timeduration' => 86400,
696 foreach ($events as $event) {
697 calendar_event
::create($event, false);
699 $timestart = time() - 60;
700 $timeend = time() +
60;
703 $events = calendar_get_legacy_events($timestart, $timeend, true, 0, true);
704 $this->assertCount(2, $events);
706 // Disable the lesson module.
707 $modulerecord = $DB->get_record('modules', ['name' => 'lesson']);
708 $modulerecord->visible
= 0;
709 $DB->update_record('modules', $modulerecord);
711 // Check that we only return the assign event.
712 $events = calendar_get_legacy_events($timestart, $timeend, true, 0, true);
713 $this->assertCount(1, $events);
714 $event = reset($events);
715 $this->assertEquals('assign', $event->modulename
);
719 * Test for \core_calendar\local\api::get_legacy_events() when there are user and group overrides.
721 public function test_get_legacy_events_with_overrides() {
722 $generator = $this->getDataGenerator();
724 $course = $generator->create_course();
726 $plugingenerator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
727 if (!isset($params['course'])) {
728 $params['course'] = $course->id
;
731 $instance = $plugingenerator->create_instance($params);
734 $useroverridestudent = $generator->create_user();
735 $group1student = $generator->create_user();
736 $group2student = $generator->create_user();
737 $group12student = $generator->create_user();
738 $nogroupstudent = $generator->create_user();
741 $generator->enrol_user($useroverridestudent->id
, $course->id
, 'student');
742 $generator->enrol_user($group1student->id
, $course->id
, 'student');
743 $generator->enrol_user($group2student->id
, $course->id
, 'student');
744 $generator->enrol_user($group12student->id
, $course->id
, 'student');
745 $generator->enrol_user($nogroupstudent->id
, $course->id
, 'student');
748 $group1 = $generator->create_group(['courseid' => $course->id
]);
749 $group2 = $generator->create_group(['courseid' => $course->id
]);
751 // Add members to groups.
752 $generator->create_group_member(['groupid' => $group1->id
, 'userid' => $group1student->id
]);
753 $generator->create_group_member(['groupid' => $group2->id
, 'userid' => $group2student->id
]);
754 $generator->create_group_member(['groupid' => $group1->id
, 'userid' => $group12student->id
]);
755 $generator->create_group_member(['groupid' => $group2->id
, 'userid' => $group12student->id
]);
758 // Events with the same module name, instance and event type.
761 'name' => 'Assignment 1 due date',
763 'location' => 'Test',
765 'courseid' => $course->id
,
768 'modulename' => 'assign',
769 'instance' => $instance->id
,
770 'eventtype' => 'due',
775 'name' => 'Assignment 1 due date - User override',
777 'location' => 'Test',
781 'userid' => $useroverridestudent->id
,
782 'modulename' => 'assign',
783 'instance' => $instance->id
,
784 'eventtype' => 'due',
785 'timestart' => $now +
86400,
788 'priority' => CALENDAR_EVENT_USER_OVERRIDE_PRIORITY
790 'name' => 'Assignment 1 due date - Group A override',
792 'location' => 'Test',
794 'courseid' => $course->id
,
795 'groupid' => $group1->id
,
797 'modulename' => 'assign',
798 'instance' => $instance->id
,
799 'eventtype' => 'due',
800 'timestart' => $now +
(2 * 86400),
805 'name' => 'Assignment 1 due date - Group B override',
807 'location' => 'Test',
809 'courseid' => $course->id
,
810 'groupid' => $group2->id
,
812 'modulename' => 'assign',
813 'instance' => $instance->id
,
814 'eventtype' => 'due',
815 'timestart' => $now +
(3 * 86400),
822 foreach ($events as $event) {
823 calendar_event
::create($event, false);
826 $timestart = $now - 100;
827 $timeend = $now +
(3 * 86400);
828 $groups = [$group1->id
, $group2->id
];
830 // Get user override events.
831 $this->setUser($useroverridestudent);
832 $events = calendar_get_legacy_events($timestart, $timeend, $useroverridestudent->id
, $groups, $course->id
);
833 $this->assertCount(1, $events);
834 $event = reset($events);
835 $this->assertEquals('Assignment 1 due date - User override', $event->name
);
837 // Get event for user with override but with the timestart and timeend parameters only covering the original event.
838 $events = calendar_get_legacy_events($timestart, $now, $useroverridestudent->id
, $groups, $course->id
);
839 $this->assertCount(0, $events);
841 // Get events for user that does not belong to any group and has no user override events.
842 $this->setUser($nogroupstudent);
843 $events = calendar_get_legacy_events($timestart, $timeend, $nogroupstudent->id
, $groups, $course->id
);
844 $this->assertCount(1, $events);
845 $event = reset($events);
846 $this->assertEquals('Assignment 1 due date', $event->name
);
848 // Get events for user that belongs to groups A and B and has no user override events.
849 $this->setUser($group12student);
850 $events = calendar_get_legacy_events($timestart, $timeend, $group12student->id
, $groups, $course->id
);
851 $this->assertCount(1, $events);
852 $event = reset($events);
853 $this->assertEquals('Assignment 1 due date - Group A override', $event->name
);
855 // Get events for user that belongs to group A and has no user override events.
856 $this->setUser($group1student);
857 $events = calendar_get_legacy_events($timestart, $timeend, $group1student->id
, $groups, $course->id
);
858 $this->assertCount(1, $events);
859 $event = reset($events);
860 $this->assertEquals('Assignment 1 due date - Group A override', $event->name
);
862 // Add repeating events.
865 'name' => 'Repeating site event',
867 'location' => 'Test',
869 'courseid' => SITEID
,
872 'repeatid' => $event->id
,
875 'eventtype' => 'site',
876 'timestart' => $now +
86400,
881 'name' => 'Repeating site event',
883 'location' => 'Test',
885 'courseid' => SITEID
,
888 'repeatid' => $event->id
,
891 'eventtype' => 'site',
892 'timestart' => $now +
(2 * 86400),
898 foreach ($repeatingevents as $event) {
899 calendar_event
::create($event, false);
902 // Make sure repeating events are not filtered out.
903 $events = calendar_get_legacy_events($timestart, $timeend, true, true, true);
904 $this->assertCount(3, $events);
908 * Setting the start date on the calendar event should update the date
909 * of the event but should leave the time of day unchanged.
911 public function test_update_event_start_day_updates_date() {
912 $generator = $this->getDataGenerator();
913 $user = $generator->create_user();
914 $roleid = $generator->create_role();
915 $context = \context_system
::instance();
916 $originalstarttime = new DateTimeImmutable('2017-01-1T15:00:00+08:00');
917 $newstartdate = new DateTimeImmutable('2018-02-2T10:00:00+08:00');
918 $expected = new DateTimeImmutable('2018-02-2T15:00:00+08:00');
919 $mapper = container
::get_event_mapper();
921 $generator->role_assign($roleid, $user->id
, $context->id
);
922 assign_capability('moodle/calendar:manageownentries', CAP_ALLOW
, $roleid, $context, true);
924 $this->setUser($user);
925 $this->resetAfterTest(true);
927 $event = create_event([
928 'name' => 'Test event',
929 'userid' => $user->id
,
930 'eventtype' => 'user',
932 'timestart' => $originalstarttime->getTimestamp(),
934 $event = $mapper->from_legacy_event_to_event($event);
936 $newEvent = \core_calendar\local\api
::update_event_start_day($event, $newstartdate);
937 $actual = $newEvent->get_times()->get_start_time();
939 $this->assertEquals($expected->getTimestamp(), $actual->getTimestamp());
943 * A user should not be able to update the start date of the event
944 * that they don't have the capabilities to modify.
946 public function test_update_event_start_day_no_permission() {
947 $generator = $this->getDataGenerator();
948 $user = $generator->create_user();
949 $roleid = $generator->create_role();
950 $context = \context_system
::instance();
951 $originalstarttime = new DateTimeImmutable('2017-01-1T15:00:00+08:00');
952 $newstartdate = new DateTimeImmutable('2018-02-2T10:00:00+08:00');
953 $expected = new DateTimeImmutable('2018-02-2T15:00:00+08:00');
954 $mapper = container
::get_event_mapper();
956 $generator->role_assign($roleid, $user->id
, $context->id
);
958 $this->setUser($user);
959 $this->resetAfterTest(true);
961 $event = create_event([
962 'name' => 'Test event',
963 'userid' => $user->id
,
964 'eventtype' => 'user',
966 'timestart' => $originalstarttime->getTimestamp(),
968 $event = $mapper->from_legacy_event_to_event($event);
970 assign_capability('moodle/calendar:manageownentries', CAP_PROHIBIT
, $roleid, $context, true);
971 $this->expectException('moodle_exception');
972 $newEvent = \core_calendar\local\api
::update_event_start_day($event, $newstartdate);
976 * Updating the start day of an event with no maximum cutoff should
977 * update the corresponding activity property.
979 * Note: This test uses the feedback activity because it requires
980 * module callbacks to be in place to test.
982 public function test_update_event_start_day_activity_event_no_max() {
984 require_once($CFG->dirroot
. '/mod/feedback/lib.php');
986 $this->resetAfterTest(true);
987 $this->setAdminUser();
988 $timeopen = new DateTimeImmutable('2017-01-1T15:00:00+08:00');
989 $newstartdate = new DateTimeImmutable('2018-02-2T10:00:00+08:00');
990 $expected = new DateTimeImmutable('2018-02-2T15:00:00+08:00');
991 list($feedback, $event) = $this->create_feedback_activity_and_event(
993 'timeopen' => $timeopen->getTimestamp(),
997 'eventtype' => FEEDBACK_EVENT_TYPE_OPEN
,
998 'timestart' => $timeopen->getTimestamp()
1001 $newevent = \core_calendar\local\api
::update_event_start_day($event, $newstartdate);
1002 $actual = $newevent->get_times()->get_start_time();
1003 $feedback = $DB->get_record('feedback', ['id' => $feedback->id
]);
1005 $this->assertEquals($expected->getTimestamp(), $actual->getTimestamp());
1006 $this->assertEquals($expected->getTimestamp(), $feedback->timeopen
);
1010 * Updating the start day of an event belonging to an activity to a value
1011 * less than the maximum cutoff should update the corresponding activity
1014 * Note: This test uses the feedback activity because it requires
1015 * module callbacks to be in place to test.
1017 public function test_update_event_start_day_activity_event_less_than_max() {
1019 require_once($CFG->dirroot
. '/mod/feedback/lib.php');
1021 $this->resetAfterTest(true);
1022 $this->setAdminUser();
1023 $timeopen = new DateTimeImmutable('2017-01-1T15:00:00+08:00');
1024 $timeclose = new DateTimeImmutable('2019-01-1T15:00:00+08:00');
1025 $newstartdate = new DateTimeImmutable('2018-02-2T10:00:00+08:00');
1026 $expected = new DateTimeImmutable('2018-02-2T15:00:00+08:00');
1027 list($feedback, $event) = $this->create_feedback_activity_and_event(
1029 'timeopen' => $timeopen->getTimestamp(),
1030 'timeclose' => $timeclose->getTimestamp()
1033 'eventtype' => FEEDBACK_EVENT_TYPE_OPEN
,
1034 'timestart' => $timeopen->getTimestamp()
1038 $newevent = \core_calendar\local\api
::update_event_start_day($event, $newstartdate);
1039 $actual = $newevent->get_times()->get_start_time();
1040 $feedback = $DB->get_record('feedback', ['id' => $feedback->id
]);
1042 $this->assertEquals($expected->getTimestamp(), $actual->getTimestamp());
1043 $this->assertEquals($expected->getTimestamp(), $feedback->timeopen
);
1047 * Updating the start day of an event belonging to an activity to a value
1048 * equal to the maximum cutoff should update the corresponding activity
1051 * Note: This test uses the feedback activity because it requires
1052 * module callbacks to be in place to test.
1054 public function test_update_event_start_day_activity_event_equal_to_max() {
1056 require_once($CFG->dirroot
. '/mod/feedback/lib.php');
1058 $this->resetAfterTest(true);
1059 $this->setAdminUser();
1060 $timeopen = new DateTimeImmutable('2017-01-1T15:00:00+08:00');
1061 $timeclose = new DateTimeImmutable('2018-02-2T15:00:00+08:00');
1062 $newstartdate = new DateTimeImmutable('2018-02-2T10:00:00+08:00');
1063 list($feedback, $event) = $this->create_feedback_activity_and_event(
1065 'timeopen' => $timeopen->getTimestamp(),
1066 'timeclose' => $timeclose->getTimestamp(),
1069 'eventtype' => FEEDBACK_EVENT_TYPE_OPEN
,
1070 'timestart' => $timeopen->getTimestamp()
1074 $newevent = \core_calendar\local\api
::update_event_start_day($event, $newstartdate);
1075 $actual = $newevent->get_times()->get_start_time();
1076 $feedback = $DB->get_record('feedback', ['id' => $feedback->id
]);
1078 $this->assertEquals($timeclose->getTimestamp(), $actual->getTimestamp());
1079 $this->assertEquals($timeclose->getTimestamp(), $feedback->timeopen
);
1083 * Updating the start day of an event belonging to an activity to a value
1084 * after the maximum cutoff should not update the corresponding activity
1085 * property. Instead it should throw an exception.
1087 * Note: This test uses the feedback activity because it requires
1088 * module callbacks to be in place to test.
1090 public function test_update_event_start_day_activity_event_after_max() {
1092 require_once($CFG->dirroot
. '/mod/feedback/lib.php');
1094 $this->resetAfterTest(true);
1095 $this->setAdminUser();
1096 $timeopen = new DateTimeImmutable('2017-01-1T15:00:00+08:00');
1097 $timeclose = new DateTimeImmutable('2017-02-2T15:00:00+08:00');
1098 $newstartdate = new DateTimeImmutable('2018-02-2T10:00:00+08:00');
1099 list($feedback, $event) = $this->create_feedback_activity_and_event(
1101 'timeopen' => $timeopen->getTimestamp(),
1102 'timeclose' => $timeclose->getTimestamp(),
1105 'eventtype' => FEEDBACK_EVENT_TYPE_OPEN
,
1106 'timestart' => $timeopen->getTimestamp()
1110 $this->expectException('moodle_exception');
1111 $newevent = \core_calendar\local\api
::update_event_start_day($event, $newstartdate);
1115 * Updating the start day of an event with no minimum cutoff should
1116 * update the corresponding activity property.
1118 * Note: This test uses the feedback activity because it requires
1119 * module callbacks to be in place to test.
1121 public function test_update_event_start_day_activity_event_no_min() {
1123 require_once($CFG->dirroot
. '/mod/feedback/lib.php');
1125 $this->resetAfterTest(true);
1126 $this->setAdminUser();
1127 $timeclose = new DateTimeImmutable('2017-01-1T15:00:00+08:00');
1128 $newstartdate = new DateTimeImmutable('2016-02-2T10:00:00+08:00');
1129 $expected = new DateTimeImmutable('2016-02-2T15:00:00+08:00');
1130 list($feedback, $event) = $this->create_feedback_activity_and_event(
1133 'timeclose' => $timeclose->getTimestamp()
1136 'eventtype' => FEEDBACK_EVENT_TYPE_OPEN
,
1137 'timestart' => $timeclose->getTimestamp()
1141 $newevent = \core_calendar\local\api
::update_event_start_day($event, $newstartdate);
1142 $actual = $newevent->get_times()->get_start_time();
1143 $feedback = $DB->get_record('feedback', ['id' => $feedback->id
]);
1145 $this->assertEquals($expected->getTimestamp(), $actual->getTimestamp());
1146 $this->assertEquals($expected->getTimestamp(), $feedback->timeopen
);
1150 * Updating the start day of an event belonging to an activity to a value
1151 * greater than the minimum cutoff should update the corresponding activity
1154 * Note: This test uses the feedback activity because it requires
1155 * module callbacks to be in place to test.
1157 public function test_update_event_start_day_activity_event_greater_than_min() {
1159 require_once($CFG->dirroot
. '/mod/feedback/lib.php');
1161 $this->resetAfterTest(true);
1162 $this->setAdminUser();
1163 $timeopen = new DateTimeImmutable('2016-01-1T15:00:00+08:00');
1164 $timeclose = new DateTimeImmutable('2019-01-1T15:00:00+08:00');
1165 $newstartdate = new DateTimeImmutable('2018-02-2T10:00:00+08:00');
1166 $expected = new DateTimeImmutable('2018-02-2T15:00:00+08:00');
1167 list($feedback, $event) = $this->create_feedback_activity_and_event(
1169 'timeopen' => $timeopen->getTimestamp(),
1170 'timeclose' => $timeclose->getTimestamp()
1173 'eventtype' => FEEDBACK_EVENT_TYPE_CLOSE
,
1174 'timestart' => $timeclose->getTimestamp()
1178 $newevent = \core_calendar\local\api
::update_event_start_day($event, $newstartdate);
1179 $actual = $newevent->get_times()->get_start_time();
1180 $feedback = $DB->get_record('feedback', ['id' => $feedback->id
]);
1182 $this->assertEquals($expected->getTimestamp(), $actual->getTimestamp());
1183 $this->assertEquals($expected->getTimestamp(), $feedback->timeclose
);
1187 * Updating the start day of an event belonging to an activity to a value
1188 * equal to the minimum cutoff should update the corresponding activity
1191 * Note: This test uses the feedback activity because it requires
1192 * module callbacks to be in place to test.
1194 public function test_update_event_start_day_activity_event_equal_to_min() {
1196 require_once($CFG->dirroot
. '/mod/feedback/lib.php');
1198 $this->resetAfterTest(true);
1199 $this->setAdminUser();
1200 $timeopen = new DateTimeImmutable('2017-01-1T15:00:00+08:00');
1201 $timeclose = new DateTimeImmutable('2018-02-2T15:00:00+08:00');
1202 $newstartdate = new DateTimeImmutable('2017-01-1T10:00:00+08:00');
1203 $expected = new DateTimeImmutable('2017-01-1T15:00:00+08:00');
1204 list($feedback, $event) = $this->create_feedback_activity_and_event(
1206 'timeopen' => $timeopen->getTimestamp(),
1207 'timeclose' => $timeclose->getTimestamp(),
1210 'eventtype' => FEEDBACK_EVENT_TYPE_CLOSE
,
1211 'timestart' => $timeclose->getTimestamp()
1215 $newevent = \core_calendar\local\api
::update_event_start_day($event, $newstartdate);
1216 $actual = $newevent->get_times()->get_start_time();
1217 $feedback = $DB->get_record('feedback', ['id' => $feedback->id
]);
1219 $this->assertEquals($expected->getTimestamp(), $actual->getTimestamp());
1220 $this->assertEquals($expected->getTimestamp(), $feedback->timeclose
);
1224 * Updating the start day of an event belonging to an activity to a value
1225 * before the minimum cutoff should not update the corresponding activity
1226 * property. Instead it should throw an exception.
1228 * Note: This test uses the feedback activity because it requires
1229 * module callbacks to be in place to test.
1231 public function test_update_event_start_day_activity_event_before_min() {
1233 require_once($CFG->dirroot
. '/mod/feedback/lib.php');
1235 $this->resetAfterTest(true);
1236 $this->setAdminUser();
1237 $timeopen = new DateTimeImmutable('2017-01-1T15:00:00+08:00');
1238 $timeclose = new DateTimeImmutable('2017-02-2T15:00:00+08:00');
1239 $newstartdate = new DateTimeImmutable('2016-02-2T10:00:00+08:00');
1240 list($feedback, $event) = $this->create_feedback_activity_and_event(
1242 'timeopen' => $timeopen->getTimestamp(),
1243 'timeclose' => $timeclose->getTimestamp(),
1246 'eventtype' => FEEDBACK_EVENT_TYPE_CLOSE
,
1247 'timestart' => $timeclose->getTimestamp()
1251 $this->expectException('moodle_exception');
1252 $newevent = \core_calendar\local\api
::update_event_start_day($event, $newstartdate);
1256 * Updating the start day of an overridden event belonging to an activity
1257 * should result in an exception. This is to prevent the drag and drop
1258 * of override events.
1260 * Note: This test uses the quiz activity because it requires
1261 * module callbacks to be in place and override event support to test.
1263 public function test_update_event_start_day_activity_event_override() {
1265 require_once($CFG->dirroot
. '/calendar/lib.php');
1266 require_once($CFG->dirroot
. '/mod/quiz/lib.php');
1268 $this->resetAfterTest(true);
1269 $this->setAdminUser();
1270 $mapper = container
::get_event_mapper();
1271 $timeopen = new DateTimeImmutable('2017-01-1T15:00:00+08:00');
1272 $newstartdate = new DateTimeImmutable('2016-02-2T10:00:00+08:00');
1273 $generator = $this->getDataGenerator();
1274 $user = $generator->create_user();
1275 $course = $generator->create_course();
1276 $quizgenerator = $generator->get_plugin_generator('mod_quiz');
1277 $quiz = $quizgenerator->create_instance([
1278 'course' => $course->id
,
1279 'timeopen' => $timeopen->getTimestamp(),
1281 $event = create_event([
1282 'courseid' => $course->id
,
1283 'userid' => $user->id
,
1284 'modulename' => 'quiz',
1285 'instance' => $quiz->id
,
1286 'eventtype' => QUIZ_EVENT_TYPE_OPEN
,
1287 'timestart' => $timeopen->getTimestamp()
1289 $event = $mapper->from_legacy_event_to_event($event);
1290 $record = (object) [
1291 'quiz' => $quiz->id
,
1292 'userid' => $user->id
1295 $DB->insert_record('quiz_overrides', $record);
1297 $this->expectException('moodle_exception');
1298 $newevent = \core_calendar\local\api
::update_event_start_day($event, $newstartdate);