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 * Raw event retrieval strategy tests.
20 * @package core_calendar
21 * @copyright 2017 Cameron Ball <cameron@cameron1729.xyz>
22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25 defined('MOODLE_INTERNAL') ||
die();
28 require_once($CFG->dirroot
. '/calendar/tests/helpers.php');
30 use core_calendar\local\event\strategies\raw_event_retrieval_strategy
;
33 * Raw event retrieval strategy testcase.
35 * @copyright 2017 Cameron Ball <cameron@cameron1729.xyz>
36 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
38 class core_calendar_raw_event_retrieval_strategy_testcase
extends advanced_testcase
{
40 * Test retrieval strategy when module is disabled.
42 public function test_get_raw_events_with_disabled_module() {
45 $this->resetAfterTest();
46 $retrievalstrategy = new raw_event_retrieval_strategy();
47 $generator = $this->getDataGenerator();
48 $course = $generator->create_course();
49 $student = $generator->create_user();
50 $generator->enrol_user($student->id
, $course->id
, 'student');
51 $this->setUser($student);
54 'name' => 'Start of assignment',
58 'courseid' => $course->id
,
61 'modulename' => 'assign',
64 'timestart' => time(),
65 'timeduration' => 86400,
68 'name' => 'Start of lesson',
72 'courseid' => $course->id
,
75 'modulename' => 'lesson',
78 'timestart' => time(),
79 'timeduration' => 86400,
84 foreach ($events as $event) {
85 calendar_event
::create($event, false);
89 $events = $retrievalstrategy->get_raw_events(null, [0], null);
90 $this->assertCount(2, $events);
92 // Disable the lesson module.
93 $DB->set_field('modules', 'visible', 0, ['name' => 'lesson']);
95 // Check that we only return the assign event.
96 $events = $retrievalstrategy->get_raw_events(null, [0], null);
97 $this->assertCount(1, $events);
98 $event = reset($events);
99 $this->assertEquals('assign', $event->modulename
);
101 // Now, log out and repeat the above test in the reverse order.
104 // Check that we only return the assign event (given that the lesson module is still disabled).
105 $events = $retrievalstrategy->get_raw_events([$student->id
], [0], null);
106 $this->assertCount(1, $events);
107 $event = reset($events);
108 $this->assertEquals('assign', $event->modulename
);
110 // Enable the lesson module.
111 $DB->set_field('modules', 'visible', 1, ['name' => 'lesson']);
114 $events = $retrievalstrategy->get_raw_events(null, [0], null);
115 $this->assertCount(2, $events);
119 * Test retrieval strategy when there are overrides.
121 public function test_get_raw_event_strategy_with_overrides() {
122 $this->resetAfterTest();
124 $retrievalstrategy = new raw_event_retrieval_strategy();
125 $generator = $this->getDataGenerator();
126 $course = $generator->create_course();
127 $plugingenerator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
129 $instance = $plugingenerator->create_instance(['course' => $course->id
]);
132 $useroverridestudent = $generator->create_user();
133 $group1student = $generator->create_user();
134 $group2student = $generator->create_user();
135 $group12student = $generator->create_user();
136 $nogroupstudent = $generator->create_user();
139 $generator->enrol_user($useroverridestudent->id
, $course->id
, 'student');
140 $generator->enrol_user($group1student->id
, $course->id
, 'student');
141 $generator->enrol_user($group2student->id
, $course->id
, 'student');
142 $generator->enrol_user($group12student->id
, $course->id
, 'student');
144 $generator->enrol_user($nogroupstudent->id
, $course->id
, 'student');
147 $group1 = $generator->create_group(['courseid' => $course->id
, 'name' => 'Group 1']);
148 $group2 = $generator->create_group(['courseid' => $course->id
, 'name' => 'Group 2']);
150 // Add members to groups.
151 $generator->create_group_member(['groupid' => $group1->id
, 'userid' => $group1student->id
]);
152 $generator->create_group_member(['groupid' => $group2->id
, 'userid' => $group2student->id
]);
153 $generator->create_group_member(['groupid' => $group1->id
, 'userid' => $group12student->id
]);
154 $generator->create_group_member(['groupid' => $group2->id
, 'userid' => $group12student->id
]);
158 // Events with the same module name, instance and event type.
161 'name' => 'Assignment 1 due date',
163 'location' => 'Test',
165 'courseid' => $course->id
,
168 'modulename' => 'assign',
169 'instance' => $instance->id
,
170 'eventtype' => 'due',
175 'name' => 'Assignment 1 due date - User override',
177 'location' => 'Test',
181 'userid' => $useroverridestudent->id
,
182 'modulename' => 'assign',
183 'instance' => $instance->id
,
184 'eventtype' => 'due',
185 'timestart' => $now +
86400,
188 'priority' => CALENDAR_EVENT_USER_OVERRIDE_PRIORITY
190 'name' => 'Assignment 1 due date - Group A override',
192 'location' => 'Test',
194 'courseid' => $course->id
,
195 'groupid' => $group1->id
,
197 'modulename' => 'assign',
198 'instance' => $instance->id
,
199 'eventtype' => 'due',
200 'timestart' => $now +
(2 * 86400),
205 'name' => 'Assignment 1 due date - Group B override',
207 'location' => 'Test',
209 'courseid' => $course->id
,
210 'groupid' => $group2->id
,
212 'modulename' => 'assign',
213 'instance' => $instance->id
,
214 'eventtype' => 'due',
215 'timestart' => $now +
(3 * 86400),
222 foreach ($events as $event) {
223 calendar_event
::create($event, false);
226 $groups = [$group1->id
, $group2->id
];
228 // Do the following tests multiple times when logged in with different users. Also run the whole set when logged out.
229 // In any cases, the tests should not depend on the logged-in user.
230 foreach ([$useroverridestudent, $nogroupstudent, $group12student, $group1student, null] as $login) {
231 $this->setUser($login);
233 // Get user override events.
234 $events = $retrievalstrategy->get_raw_events([$useroverridestudent->id
], $groups, [$course->id
]);
235 $this->assertCount(1, $events);
236 $event = reset($events);
237 $this->assertEquals('Assignment 1 due date - User override', $event->name
);
239 // Get events for user that does not belong to any group and has no user override events.
240 $events = $retrievalstrategy->get_raw_events([$nogroupstudent->id
], $groups, [$course->id
]);
241 $this->assertCount(1, $events);
242 $event = reset($events);
243 $this->assertEquals('Assignment 1 due date', $event->name
);
245 // Get events for user that belongs to groups A and B and has no user override events.
246 $events = $retrievalstrategy->get_raw_events([$group12student->id
], $groups, [$course->id
]);
247 $this->assertCount(1, $events);
248 $event = reset($events);
249 $this->assertEquals('Assignment 1 due date - Group A override', $event->name
);
251 // Get events for user that belongs to group A and has no user override events.
252 $events = $retrievalstrategy->get_raw_events([$group1student->id
], $groups, [$course->id
]);
253 $this->assertCount(1, $events);
254 $event = reset($events);
255 $this->assertEquals('Assignment 1 due date - Group A override', $event->name
);
258 // Add repeating events.
261 'name' => 'Repeating site event',
263 'location' => 'Test',
265 'courseid' => SITEID
,
271 'eventtype' => 'site',
272 'timestart' => $now +
86400,
277 'name' => 'Repeating site event',
279 'location' => 'Test',
281 'courseid' => SITEID
,
287 'eventtype' => 'site',
288 'timestart' => $now +
(2 * 86400),
294 foreach ($repeatingevents as $event) {
295 calendar_event
::create($event, false);
298 // Make sure repeating events are not filtered out.
299 $events = $retrievalstrategy->get_raw_events();
300 $this->assertCount(3, $events);
304 * Test retrieval strategy with category specifications.
306 public function test_get_raw_events_category() {
307 $this->resetAfterTest();
308 $retrievalstrategy = new raw_event_retrieval_strategy();
309 $generator = $this->getDataGenerator();
310 $category1 = $generator->create_category();
311 $category2 = $generator->create_category();
315 'eventtype' => 'category',
317 'location' => 'Test',
319 'categoryid' => $category1->id
,
321 'timestart' => time(),
325 'eventtype' => 'category',
327 'location' => 'Test',
329 'categoryid' => $category2->id
,
331 'timestart' => time() +
1,
335 foreach ($events as $event) {
336 calendar_event
::create($event, false);
340 $events = $retrievalstrategy->get_raw_events(null, null, null, null);
341 $this->assertCount(2, $events);
343 $event = array_shift($events);
344 $this->assertEquals('E1', $event->name
);
345 $event = array_shift($events);
346 $this->assertEquals('E2', $event->name
);
348 // Get events for C1 events.
349 $events = $retrievalstrategy->get_raw_events(null, null, null, [$category1->id
]);
350 $this->assertCount(1, $events);
352 $event = array_shift($events);
353 $this->assertEquals('E1', $event->name
);
355 // Get events for C2 events.
356 $events = $retrievalstrategy->get_raw_events(null, null, null, [$category2->id
]);
357 $this->assertCount(1, $events);
359 $event = array_shift($events);
360 $this->assertEquals('E2', $event->name
);
362 // Get events for several categories.
363 $events = $retrievalstrategy->get_raw_events(null, null, null, [$category1->id
, $category2->id
]);
364 $this->assertCount(2, $events);
367 public function test_get_raw_events_for_multiple_users() {
368 $this->resetAfterTest();
370 $generator = $this->getDataGenerator();
373 $user1 = $generator->create_user();
374 $user2 = $generator->create_user();
375 $user3 = $generator->create_user();
377 // Create user events.
380 'name' => 'User1 Event',
381 'eventtype' => 'user',
382 'userid' => $user1->id
,
383 'timestart' => time(),
385 'name' => 'User2 Event',
386 'eventtype' => 'user',
387 'userid' => $user2->id
,
388 'timestart' => time(),
390 'name' => 'User3 Event',
391 'eventtype' => 'user',
392 'userid' => $user3->id
,
393 'timestart' => time(),
396 foreach ($events as $event) {
397 calendar_event
::create($event, false);
400 $retrievalstrategy = new raw_event_retrieval_strategy();
403 $events = $retrievalstrategy->get_raw_events([$user1->id
, $user2->id
]);
404 $this->assertCount(2, $events);
406 ['User1 Event', 'User2 Event'],
407 array_column($events, 'name'),
411 public function test_get_raw_events_for_groups_with_no_members() {
412 $this->resetAfterTest();
414 $generator = $this->getDataGenerator();
416 $course = $generator->create_course();
419 $group1 = $generator->create_group(['courseid' => $course->id
, 'name' => 'Group 1']);
420 $group2 = $generator->create_group(['courseid' => $course->id
, 'name' => 'Group 2']);
422 // Create group events.
425 'name' => 'Group 1 Event',
426 'eventtype' => 'group',
427 'groupid' => $group1->id
,
428 'timestart' => time(),
430 'name' => 'Group 2 Event',
431 'eventtype' => 'group',
432 'groupid' => $group2->id
,
433 'timestart' => time(),
436 foreach ($events as $event) {
437 calendar_event
::create($event, false);
440 $retrievalstrategy = new raw_event_retrieval_strategy
;
442 // Get group eventsl.
443 $events = $retrievalstrategy->get_raw_events(null, [$group1->id
, $group2->id
]);
444 $this->assertCount(2, $events);
446 ['Group 1 Event', 'Group 2 Event'],
447 array_column($events, 'name'),