Proyectos de Subversion Moodle

Rev

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

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
// This file is part of Moodle - http://moodle.org/
3
//
4
// Moodle is free software: you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation, either version 3 of the License, or
7
// (at your option) any later version.
8
//
9
// Moodle is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
// GNU General Public License for more details.
13
//
14
// You should have received a copy of the GNU General Public License
15
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16
 
17
namespace core_calendar;
18
 
19
use core_calendar\local\event\container;
20
 
21
defined('MOODLE_INTERNAL') || die();
22
 
23
require_once(__DIR__ . '/helpers.php');
24
 
25
/**
26
 * Class contaning unit tests for the calendar local API.
27
 *
28
 * @package    core_calendar
29
 * @copyright  2017 Mark Nelson <markn@moodle.com>
30
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
31
 * @coversDefaultClass \core_calendar\local\api
32
 */
1441 ariadna 33
final class local_api_test extends \advanced_testcase {
1 efrain 34
 
35
    /**
36
     * Tests set up
37
     */
38
    protected function setUp(): void {
1441 ariadna 39
        parent::setUp();
1 efrain 40
        $this->resetAfterTest();
41
    }
42
 
43
    /**
44
     * Create a feedback activity instance and a calendar event for
45
     * that instance.
46
     *
47
     * @param array $feedbackproperties Properties to set on the feedback activity
48
     * @param array $eventproperties Properties to set on the calendar event
49
     * @return array The feedback activity and the calendar event
50
     */
51
    protected function create_feedback_activity_and_event(array $feedbackproperties = [], array $eventproperties = []) {
52
        $generator = $this->getDataGenerator();
53
        $course = $generator->create_course();
54
        $mapper = container::get_event_mapper();
55
        $feedbackgenerator = $generator->get_plugin_generator('mod_feedback');
56
        $feedback = $feedbackgenerator->create_instance(array_merge(
57
            ['course' => $course->id],
58
            $feedbackproperties
59
        ));
60
 
61
        $event = create_event(array_merge(
62
            [
63
                'courseid' => $course->id,
64
                'modulename' => 'feedback',
65
                'instance' => $feedback->id
66
            ],
67
             $eventproperties
68
        ));
69
        $event = $mapper->from_legacy_event_to_event($event);
70
 
71
        return [$feedback, $event];
72
    }
73
 
74
    /**
75
     * Requesting calendar events from a given time should return all events with a sort
76
     * time at or after the requested time. All events prior to that time should not
77
     * be return.
78
     *
79
     * If there are no events on or after the given time then an empty result set should
80
     * be returned.
81
     */
11 efrain 82
    public function test_get_calendar_action_events_by_timesort_after_time(): void {
1 efrain 83
        $user = $this->getDataGenerator()->create_user();
84
        $course = $this->getDataGenerator()->create_course();
85
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
86
        $moduleinstance = $generator->create_instance(['course' => $course->id]);
87
 
88
        $this->getDataGenerator()->enrol_user($user->id, $course->id);
89
        $this->resetAfterTest(true);
90
        $this->setAdminUser();
91
 
92
        $params = [
93
            'type' => CALENDAR_EVENT_TYPE_ACTION,
94
            'courseid' => $course->id,
95
            'modulename' => 'assign',
96
            'instance' => $moduleinstance->id,
97
            'userid' => $user->id,
98
            'eventtype' => 'user',
99
            'repeats' => 0,
100
            'timestart' => 1,
101
        ];
102
 
103
        $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 1]));
104
        $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 2]));
105
        $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 3]));
106
        $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 4]));
107
        $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 5]));
108
        $event6 = create_event(array_merge($params, ['name' => 'Event 6', 'timesort' => 6]));
109
        $event7 = create_event(array_merge($params, ['name' => 'Event 7', 'timesort' => 7]));
110
        $event8 = create_event(array_merge($params, ['name' => 'Event 8', 'timesort' => 8]));
111
 
112
        $this->setUser($user);
113
        $result = \core_calendar\local\api::get_action_events_by_timesort(5);
114
 
115
        $this->assertCount(4, $result);
116
        $this->assertEquals('Event 5', $result[0]->get_name());
117
        $this->assertEquals('Event 6', $result[1]->get_name());
118
        $this->assertEquals('Event 7', $result[2]->get_name());
119
        $this->assertEquals('Event 8', $result[3]->get_name());
120
 
121
        $result = \core_calendar\local\api::get_action_events_by_timesort(9);
122
 
123
        $this->assertEmpty($result);
124
 
125
        $this->setAdminUser();
126
        $result = \core_calendar\local\api::get_action_events_by_timesort(5, null, null, 20, false, $user);
127
        $this->assertCount(4, $result);
128
    }
129
 
130
    /**
131
     * Requesting calendar events before a given time should return all events with a sort
132
     * time at or before the requested time (inclusive). All events after that time
133
     * should not be returned.
134
     *
135
     * If there are no events before the given time then an empty result set should be
136
     * returned.
137
     */
11 efrain 138
    public function test_get_calendar_action_events_by_timesort_before_time(): void {
1 efrain 139
        $user = $this->getDataGenerator()->create_user();
140
        $course = $this->getDataGenerator()->create_course();
141
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
142
        $moduleinstance = $generator->create_instance(['course' => $course->id]);
143
 
144
        $this->getDataGenerator()->enrol_user($user->id, $course->id);
145
        $this->resetAfterTest(true);
146
        $this->setAdminUser();
147
 
148
        $params = [
149
            'type' => CALENDAR_EVENT_TYPE_ACTION,
150
            'courseid' => $course->id,
151
            'modulename' => 'assign',
152
            'instance' => $moduleinstance->id,
153
            'userid' => 1,
154
            'eventtype' => 'user',
155
            'repeats' => 0,
156
            'timestart' => 1,
157
        ];
158
 
159
        $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 2]));
160
        $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 3]));
161
        $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 4]));
162
        $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 5]));
163
        $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 6]));
164
        $event6 = create_event(array_merge($params, ['name' => 'Event 6', 'timesort' => 7]));
165
        $event7 = create_event(array_merge($params, ['name' => 'Event 7', 'timesort' => 8]));
166
        $event8 = create_event(array_merge($params, ['name' => 'Event 8', 'timesort' => 9]));
167
 
168
        $this->setUser($user);
169
        $result = \core_calendar\local\api::get_action_events_by_timesort(null, 5);
170
 
171
        $this->assertCount(4, $result);
172
        $this->assertEquals('Event 1', $result[0]->get_name());
173
        $this->assertEquals('Event 2', $result[1]->get_name());
174
        $this->assertEquals('Event 3', $result[2]->get_name());
175
        $this->assertEquals('Event 4', $result[3]->get_name());
176
 
177
        $result = \core_calendar\local\api::get_action_events_by_timesort(null, 1);
178
 
179
        $this->assertEmpty($result);
180
    }
181
 
182
    /**
183
     * Requesting calendar events within a given time range should return all events with
184
     * a sort time between the lower and upper time bound (inclusive).
185
     *
186
     * If there are no events in the given time range then an empty result set should be
187
     * returned.
188
     */
11 efrain 189
    public function test_get_calendar_action_events_by_timesort_time_range(): void {
1 efrain 190
        $user = $this->getDataGenerator()->create_user();
191
        $course = $this->getDataGenerator()->create_course();
192
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
193
        $moduleinstance = $generator->create_instance(['course' => $course->id]);
194
 
195
        $this->getDataGenerator()->enrol_user($user->id, $course->id);
196
        $this->resetAfterTest(true);
197
        $this->setAdminUser();
198
 
199
        $params = [
200
            'type' => CALENDAR_EVENT_TYPE_ACTION,
201
            'courseid' => $course->id,
202
            'modulename' => 'assign',
203
            'instance' => $moduleinstance->id,
204
            'userid' => 1,
205
            'eventtype' => 'user',
206
            'repeats' => 0,
207
            'timestart' => 1,
208
        ];
209
 
210
        $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 1]));
211
        $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 2]));
212
        $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 3]));
213
        $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 4]));
214
        $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 5]));
215
        $event6 = create_event(array_merge($params, ['name' => 'Event 6', 'timesort' => 6]));
216
        $event7 = create_event(array_merge($params, ['name' => 'Event 7', 'timesort' => 7]));
217
        $event8 = create_event(array_merge($params, ['name' => 'Event 8', 'timesort' => 8]));
218
 
219
        $this->setUser($user);
220
        $result = \core_calendar\local\api::get_action_events_by_timesort(3, 6);
221
 
222
        $this->assertCount(4, $result);
223
        $this->assertEquals('Event 3', $result[0]->get_name());
224
        $this->assertEquals('Event 4', $result[1]->get_name());
225
        $this->assertEquals('Event 5', $result[2]->get_name());
226
        $this->assertEquals('Event 6', $result[3]->get_name());
227
 
228
        $result = \core_calendar\local\api::get_action_events_by_timesort(10, 15);
229
 
230
        $this->assertEmpty($result);
231
    }
232
 
233
    /**
234
     * Requesting calendar events within a given time range and a limit and offset should return
235
     * the number of events up to the given limit value that have a sort time between the lower
236
     * and uppper time bound (inclusive) where the result set is shifted by the offset value.
237
     *
238
     * If there are no events in the given time range then an empty result set should be
239
     * returned.
240
     */
11 efrain 241
    public function test_get_calendar_action_events_by_timesort_time_limit_offset(): void {
1 efrain 242
        $user = $this->getDataGenerator()->create_user();
243
        $course = $this->getDataGenerator()->create_course();
244
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
245
        $moduleinstance = $generator->create_instance(['course' => $course->id]);
246
 
247
        $this->getDataGenerator()->enrol_user($user->id, $course->id);
248
        $this->resetAfterTest(true);
249
        $this->setAdminUser();
250
 
251
        $params = [
252
            'type' => CALENDAR_EVENT_TYPE_ACTION,
253
            'courseid' => $course->id,
254
            'modulename' => 'assign',
255
            'instance' => $moduleinstance->id,
256
            'userid' => 1,
257
            'eventtype' => 'user',
258
            'repeats' => 0,
259
            'timestart' => 1,
260
        ];
261
 
262
        $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 1]));
263
        $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 2]));
264
        $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 3]));
265
        $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 4]));
266
        $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 5]));
267
        $event6 = create_event(array_merge($params, ['name' => 'Event 6', 'timesort' => 6]));
268
        $event7 = create_event(array_merge($params, ['name' => 'Event 7', 'timesort' => 7]));
269
        $event8 = create_event(array_merge($params, ['name' => 'Event 8', 'timesort' => 8]));
270
 
271
        $this->setUser($user);
272
        $result = \core_calendar\local\api::get_action_events_by_timesort(2, 7, $event3->id, 2);
273
 
274
        $this->assertCount(2, $result);
275
        $this->assertEquals('Event 4', $result[0]->get_name());
276
        $this->assertEquals('Event 5', $result[1]->get_name());
277
 
278
        $result = \core_calendar\local\api::get_action_events_by_timesort(2, 7, $event5->id, 2);
279
 
280
        $this->assertCount(2, $result);
281
        $this->assertEquals('Event 6', $result[0]->get_name());
282
        $this->assertEquals('Event 7', $result[1]->get_name());
283
 
284
        $result = \core_calendar\local\api::get_action_events_by_timesort(2, 7, $event7->id, 2);
285
 
286
        $this->assertEmpty($result);
287
    }
288
 
289
    /**
290
     * Test get_calendar_action_events_by_timesort with search feature.
291
     * @covers ::get_action_events_by_timesort
292
     */
11 efrain 293
    public function test_get_calendar_action_events_by_timesort_with_search(): void {
1 efrain 294
        // Generate data.
295
        $user = $this->getDataGenerator()->create_user();
296
        $course = $this->getDataGenerator()->create_course();
297
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
298
        $moduleinstance = $generator->create_instance(['course' => $course->id]);
299
 
300
        $this->getDataGenerator()->enrol_user($user->id, $course->id);
301
        $this->resetAfterTest(true);
302
        $this->setAdminUser();
303
 
304
        $params = [
305
            'type' => CALENDAR_EVENT_TYPE_ACTION,
306
            'courseid' => $course->id,
307
            'modulename' => 'assign',
308
            'instance' => $moduleinstance->id,
309
            'userid' => 1,
310
            'eventtype' => 'user',
311
            'repeats' => 0,
312
            'timestart' => 1,
313
        ];
314
 
315
        $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 1]));
316
        $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 2]));
317
        $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 3]));
318
        $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 4]));
319
        $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 5]));
320
        $event6 = create_event(array_merge($params, ['name' => 'Event 6', 'timesort' => 6]));
321
        $event7 = create_event(array_merge($params, ['name' => 'Event 7', 'timesort' => 7]));
322
        $event8 = create_event(array_merge($params, ['name' => 'Event 8', 'timesort' => 8]));
323
        $event9 = create_event(array_merge($params, ['name' => 'Assign with advanced name', 'timesort' => 9]));
324
 
325
        $this->setUser($user);
326
 
327
        // No result found for fake search.
328
        $result = \core_calendar\local\api::get_action_events_by_timesort(0, null, null, 6, false, null, 'Fake search');
329
        $this->assertEmpty($result);
330
 
331
        // Search for event name called 'Event 1'.
332
        $result = \core_calendar\local\api::get_action_events_by_timesort(0, 10, null, 20, false, null, 'Event 1');
333
        $this->assertCount(1, $result);
334
        $this->assertEquals('Event 1', $result[0]->get_name());
335
 
336
        // Search for event name called 'Assign with advanced name'.
337
        $result = \core_calendar\local\api::get_action_events_by_timesort(
338
            0, 10, null, 20, false, null, 'Assign with advanced name');
339
        $this->assertCount(1, $result);
340
        $this->assertEquals('Assign with advanced name', $result[0]->get_name());
341
 
342
        // Search for event name contains 'Assign advanced'.
343
        $result = \core_calendar\local\api::get_action_events_by_timesort(
344
            0, 10, null, 20, false, null, 'Assign advanced');
345
        $this->assertCount(1, $result);
346
        $this->assertEquals('Assign with advanced name', $result[0]->get_name());
347
 
348
        // Search for activity type called 'assign'.
349
        $result = \core_calendar\local\api::get_action_events_by_timesort(0, 10, null, 20, false, null, 'assign');
350
        $this->assertCount(9, $result);
351
        $this->assertEquals('Event 1', $result[0]->get_name());
352
        $this->assertEquals('Event 2', $result[1]->get_name());
353
        $this->assertEquals('Event 3', $result[2]->get_name());
354
        $this->assertEquals('Event 4', $result[3]->get_name());
355
        $this->assertEquals('Event 5', $result[4]->get_name());
356
        $this->assertEquals('Event 6', $result[5]->get_name());
357
        $this->assertEquals('Event 7', $result[6]->get_name());
358
        $this->assertEquals('Event 8', $result[7]->get_name());
359
        $this->assertEquals('Assign with advanced name', $result[8]->get_name());
360
    }
361
 
362
    /**
363
     * Requesting calendar events from a given course and time should return all
364
     * events with a sort time at or after the requested time. All events prior
365
     * to that time should not be return.
366
     *
367
     * If there are no events on or after the given time then an empty result set should
368
     * be returned.
369
     */
11 efrain 370
    public function test_get_calendar_action_events_by_course_after_time(): void {
1 efrain 371
        $user = $this->getDataGenerator()->create_user();
372
        $course1 = $this->getDataGenerator()->create_course();
373
        $course2 = $this->getDataGenerator()->create_course();
374
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
375
        $moduleinstance1 = $generator->create_instance(['course' => $course1->id]);
376
        $moduleinstance2 = $generator->create_instance(['course' => $course2->id]);
377
 
378
        $this->getDataGenerator()->enrol_user($user->id, $course1->id);
379
        $this->getDataGenerator()->enrol_user($user->id, $course2->id);
380
        $this->resetAfterTest(true);
381
        $this->setUser($user);
382
 
383
        $params = [
384
            'type' => CALENDAR_EVENT_TYPE_ACTION,
385
            'modulename' => 'assign',
386
            'instance' => $moduleinstance1->id,
387
            'userid' => $user->id,
388
            'courseid' => $course1->id,
389
            'eventtype' => 'user',
390
            'repeats' => 0,
391
            'timestart' => 1,
392
        ];
393
 
394
        $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 1]));
395
        $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 2]));
396
        $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 3]));
397
        $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 4]));
398
        $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 5]));
399
        $event6 = create_event(array_merge($params, ['name' => 'Event 6', 'timesort' => 6]));
400
        $event7 = create_event(array_merge($params, ['name' => 'Event 7', 'timesort' => 7]));
401
        $event8 = create_event(array_merge($params, ['name' => 'Event 8', 'timesort' => 8]));
402
 
403
        $params['courseid'] = $course2->id;
404
        $params['instance'] = $moduleinstance2->id;
405
        $event9 = create_event(array_merge($params, ['name' => 'Event 9', 'timesort' => 1]));
406
        $event10 = create_event(array_merge($params, ['name' => 'Event 10', 'timesort' => 2]));
407
        $event11 = create_event(array_merge($params, ['name' => 'Event 11', 'timesort' => 3]));
408
        $event12 = create_event(array_merge($params, ['name' => 'Event 12', 'timesort' => 4]));
409
        $event13 = create_event(array_merge($params, ['name' => 'Event 13', 'timesort' => 5]));
410
        $event14 = create_event(array_merge($params, ['name' => 'Event 14', 'timesort' => 6]));
411
        $event15 = create_event(array_merge($params, ['name' => 'Event 15', 'timesort' => 7]));
412
        $event16 = create_event(array_merge($params, ['name' => 'Event 16', 'timesort' => 8]));
413
 
414
        $result = \core_calendar\local\api::get_action_events_by_course($course1, 5);
415
 
416
        $this->assertCount(4, $result);
417
        $this->assertEquals('Event 5', $result[0]->get_name());
418
        $this->assertEquals('Event 6', $result[1]->get_name());
419
        $this->assertEquals('Event 7', $result[2]->get_name());
420
        $this->assertEquals('Event 8', $result[3]->get_name());
421
 
422
        $result = \core_calendar\local\api::get_action_events_by_course($course1, 9);
423
 
424
        $this->assertEmpty($result);
425
    }
426
 
427
    /**
428
     * Requesting calendar events for a course and before a given time should return
429
     * all events with a sort time at or before the requested time (inclusive). All
430
     * events after that time should not be returned.
431
     *
432
     * If there are no events before the given time then an empty result set should be
433
     * returned.
434
     */
11 efrain 435
    public function test_get_calendar_action_events_by_course_before_time(): void {
1 efrain 436
        $user = $this->getDataGenerator()->create_user();
437
        $course1 = $this->getDataGenerator()->create_course();
438
        $course2 = $this->getDataGenerator()->create_course();
439
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
440
        $moduleinstance1 = $generator->create_instance(['course' => $course1->id]);
441
        $moduleinstance2 = $generator->create_instance(['course' => $course2->id]);
442
 
443
        $this->getDataGenerator()->enrol_user($user->id, $course1->id);
444
        $this->getDataGenerator()->enrol_user($user->id, $course2->id);
445
        $this->resetAfterTest(true);
446
        $this->setUser($user);
447
 
448
        $params = [
449
            'type' => CALENDAR_EVENT_TYPE_ACTION,
450
            'modulename' => 'assign',
451
            'instance' => $moduleinstance1->id,
452
            'userid' => $user->id,
453
            'courseid' => $course1->id,
454
            'eventtype' => 'user',
455
            'repeats' => 0,
456
            'timestart' => 1,
457
        ];
458
 
459
        $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 2]));
460
        $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 3]));
461
        $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 4]));
462
        $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 5]));
463
        $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 6]));
464
        $event6 = create_event(array_merge($params, ['name' => 'Event 6', 'timesort' => 7]));
465
        $event7 = create_event(array_merge($params, ['name' => 'Event 7', 'timesort' => 8]));
466
        $event8 = create_event(array_merge($params, ['name' => 'Event 8', 'timesort' => 9]));
467
 
468
        $params['courseid'] = $course2->id;
469
        $params['instance'] = $moduleinstance2->id;
470
        $event9 = create_event(array_merge($params, ['name' => 'Event 9', 'timesort' => 2]));
471
        $event10 = create_event(array_merge($params, ['name' => 'Event 10', 'timesort' => 3]));
472
        $event11 = create_event(array_merge($params, ['name' => 'Event 11', 'timesort' => 4]));
473
        $event12 = create_event(array_merge($params, ['name' => 'Event 12', 'timesort' => 5]));
474
        $event13 = create_event(array_merge($params, ['name' => 'Event 13', 'timesort' => 6]));
475
        $event14 = create_event(array_merge($params, ['name' => 'Event 14', 'timesort' => 7]));
476
        $event15 = create_event(array_merge($params, ['name' => 'Event 15', 'timesort' => 8]));
477
        $event16 = create_event(array_merge($params, ['name' => 'Event 16', 'timesort' => 9]));
478
 
479
        $result = \core_calendar\local\api::get_action_events_by_course($course1, null, 5);
480
 
481
        $this->assertCount(4, $result);
482
        $this->assertEquals('Event 1', $result[0]->get_name());
483
        $this->assertEquals('Event 2', $result[1]->get_name());
484
        $this->assertEquals('Event 3', $result[2]->get_name());
485
        $this->assertEquals('Event 4', $result[3]->get_name());
486
 
487
        $result = \core_calendar\local\api::get_action_events_by_course($course1, null, 1);
488
 
489
        $this->assertEmpty($result);
490
    }
491
 
492
    /**
493
     * Requesting calendar events for a course and within a given time range should
494
     * return all events with a sort time between the lower and upper time bound
495
     * (inclusive).
496
     *
497
     * If there are no events in the given time range then an empty result set should be
498
     * returned.
499
     */
11 efrain 500
    public function test_get_calendar_action_events_by_course_time_range(): void {
1 efrain 501
        $user = $this->getDataGenerator()->create_user();
502
        $course1 = $this->getDataGenerator()->create_course();
503
        $course2 = $this->getDataGenerator()->create_course();
504
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
505
        $moduleinstance1 = $generator->create_instance(['course' => $course1->id]);
506
        $moduleinstance2 = $generator->create_instance(['course' => $course2->id]);
507
 
508
        $this->getDataGenerator()->enrol_user($user->id, $course1->id);
509
        $this->getDataGenerator()->enrol_user($user->id, $course2->id);
510
        $this->resetAfterTest(true);
511
        $this->setUser($user);
512
 
513
        $params = [
514
            'type' => CALENDAR_EVENT_TYPE_ACTION,
515
            'modulename' => 'assign',
516
            'instance' => $moduleinstance1->id,
517
            'userid' => $user->id,
518
            'courseid' => $course1->id,
519
            'eventtype' => 'user',
520
            'repeats' => 0,
521
            'timestart' => 1,
522
        ];
523
 
524
        $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 1]));
525
        $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 2]));
526
        $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 3]));
527
        $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 4]));
528
        $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 5]));
529
        $event6 = create_event(array_merge($params, ['name' => 'Event 6', 'timesort' => 6]));
530
        $event7 = create_event(array_merge($params, ['name' => 'Event 7', 'timesort' => 7]));
531
        $event8 = create_event(array_merge($params, ['name' => 'Event 8', 'timesort' => 8]));
532
 
533
        $params['courseid'] = $course2->id;
534
        $params['instance'] = $moduleinstance2->id;
535
        $event9 = create_event(array_merge($params, ['name' => 'Event 9', 'timesort' => 1]));
536
        $event10 = create_event(array_merge($params, ['name' => 'Event 10', 'timesort' => 2]));
537
        $event11 = create_event(array_merge($params, ['name' => 'Event 11', 'timesort' => 3]));
538
        $event12 = create_event(array_merge($params, ['name' => 'Event 12', 'timesort' => 4]));
539
        $event13 = create_event(array_merge($params, ['name' => 'Event 13', 'timesort' => 5]));
540
        $event14 = create_event(array_merge($params, ['name' => 'Event 14', 'timesort' => 6]));
541
        $event15 = create_event(array_merge($params, ['name' => 'Event 15', 'timesort' => 7]));
542
        $event16 = create_event(array_merge($params, ['name' => 'Event 16', 'timesort' => 8]));
543
 
544
        $result = \core_calendar\local\api::get_action_events_by_course($course1, 3, 6);
545
 
546
        $this->assertCount(4, $result);
547
        $this->assertEquals('Event 3', $result[0]->get_name());
548
        $this->assertEquals('Event 4', $result[1]->get_name());
549
        $this->assertEquals('Event 5', $result[2]->get_name());
550
        $this->assertEquals('Event 6', $result[3]->get_name());
551
 
552
        $result = \core_calendar\local\api::get_action_events_by_course($course1, 10, 15);
553
 
554
        $this->assertEmpty($result);
555
    }
556
 
557
    /**
558
     * Requesting calendar events for a course and within a given time range and a limit
559
     * and offset should return the number of events up to the given limit value that have
560
     * a sort time between the lower and uppper time bound (inclusive) where the result
561
     * set is shifted by the offset value.
562
     *
563
     * If there are no events in the given time range then an empty result set should be
564
     * returned.
565
     */
11 efrain 566
    public function test_get_calendar_action_events_by_course_time_limit_offset(): void {
1 efrain 567
        $user = $this->getDataGenerator()->create_user();
568
        $course1 = $this->getDataGenerator()->create_course();
569
        $course2 = $this->getDataGenerator()->create_course();
570
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
571
        $moduleinstance1 = $generator->create_instance(['course' => $course1->id]);
572
        $moduleinstance2 = $generator->create_instance(['course' => $course2->id]);
573
 
574
        $this->getDataGenerator()->enrol_user($user->id, $course1->id);
575
        $this->getDataGenerator()->enrol_user($user->id, $course2->id);
576
        $this->resetAfterTest(true);
577
        $this->setUser($user);
578
 
579
        $params = [
580
            'type' => CALENDAR_EVENT_TYPE_ACTION,
581
            'modulename' => 'assign',
582
            'instance' => $moduleinstance1->id,
583
            'userid' => $user->id,
584
            'courseid' => $course1->id,
585
            'eventtype' => 'user',
586
            'repeats' => 0,
587
            'timestart' => 1,
588
        ];
589
 
590
        $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 1]));
591
        $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 2]));
592
        $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 3]));
593
        $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 4]));
594
        $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 5]));
595
        $event6 = create_event(array_merge($params, ['name' => 'Event 6', 'timesort' => 6]));
596
        $event7 = create_event(array_merge($params, ['name' => 'Event 7', 'timesort' => 7]));
597
        $event8 = create_event(array_merge($params, ['name' => 'Event 8', 'timesort' => 8]));
598
 
599
        $params['courseid'] = $course2->id;
600
        $params['instance'] = $moduleinstance2->id;
601
        $event9 = create_event(array_merge($params, ['name' => 'Event 9', 'timesort' => 1]));
602
        $event10 = create_event(array_merge($params, ['name' => 'Event 10', 'timesort' => 2]));
603
        $event11 = create_event(array_merge($params, ['name' => 'Event 11', 'timesort' => 3]));
604
        $event12 = create_event(array_merge($params, ['name' => 'Event 12', 'timesort' => 4]));
605
        $event13 = create_event(array_merge($params, ['name' => 'Event 13', 'timesort' => 5]));
606
        $event14 = create_event(array_merge($params, ['name' => 'Event 14', 'timesort' => 6]));
607
        $event15 = create_event(array_merge($params, ['name' => 'Event 15', 'timesort' => 7]));
608
        $event16 = create_event(array_merge($params, ['name' => 'Event 16', 'timesort' => 8]));
609
 
610
        $result = \core_calendar\local\api::get_action_events_by_course($course1, 2, 7, $event3->id, 2);
611
 
612
        $this->assertCount(2, $result);
613
        $this->assertEquals('Event 4', $result[0]->get_name());
614
        $this->assertEquals('Event 5', $result[1]->get_name());
615
 
616
        $result = \core_calendar\local\api::get_action_events_by_course($course1, 2, 7, $event5->id, 2);
617
 
618
        $this->assertCount(2, $result);
619
        $this->assertEquals('Event 6', $result[0]->get_name());
620
        $this->assertEquals('Event 7', $result[1]->get_name());
621
 
622
        $result = \core_calendar\local\api::get_action_events_by_course($course1, 2, 7, $event7->id, 2);
623
 
624
        $this->assertEmpty($result);
625
    }
626
 
627
    /**
628
     * Test that get_action_events_by_courses will return a list of events for each
629
     * course you provided as long as the user is enrolled in the course.
630
     */
11 efrain 631
    public function test_get_action_events_by_courses(): void {
1 efrain 632
        $user = $this->getDataGenerator()->create_user();
633
        $course1 = $this->getDataGenerator()->create_course();
634
        $course2 = $this->getDataGenerator()->create_course();
635
        $course3 = $this->getDataGenerator()->create_course();
636
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
637
        $moduleinstance1 = $generator->create_instance(['course' => $course1->id]);
638
        $moduleinstance2 = $generator->create_instance(['course' => $course2->id]);
639
        $moduleinstance3 = $generator->create_instance(['course' => $course3->id]);
640
 
641
        $this->getDataGenerator()->enrol_user($user->id, $course1->id);
642
        $this->getDataGenerator()->enrol_user($user->id, $course2->id);
643
        $this->getDataGenerator()->enrol_user($user->id, $course3->id);
644
        $this->resetAfterTest(true);
645
        $this->setUser($user);
646
 
647
        $params = [
648
            'type' => CALENDAR_EVENT_TYPE_ACTION,
649
            'modulename' => 'assign',
650
            'instance' => $moduleinstance1->id,
651
            'userid' => $user->id,
652
            'courseid' => $course1->id,
653
            'eventtype' => 'user',
654
            'repeats' => 0,
655
            'timestart' => 1,
656
        ];
657
 
658
        $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 1]));
659
        $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 2]));
660
 
661
        $params['courseid'] = $course2->id;
662
        $params['instance'] = $moduleinstance2->id;
663
        $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 3]));
664
        $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 4]));
665
        $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 5]));
666
 
667
        $params['courseid'] = $course3->id;
668
        $params['instance'] = $moduleinstance3->id;
669
        $event6 = create_event(array_merge($params, ['name' => 'Event 6', 'timesort' => 6]));
670
        $event7 = create_event(array_merge($params, ['name' => 'Event 7', 'timesort' => 7]));
671
        $event8 = create_event(array_merge($params, ['name' => 'Event 8', 'timesort' => 8]));
672
        $event9 = create_event(array_merge($params, ['name' => 'Event 9', 'timesort' => 9]));
673
 
674
        $result = \core_calendar\local\api::get_action_events_by_courses([], 1);
675
 
676
        $this->assertEmpty($result);
677
 
678
        $result = \core_calendar\local\api::get_action_events_by_courses([$course1], 3);
679
 
680
        $this->assertEmpty($result[$course1->id]);
681
 
682
        $result = \core_calendar\local\api::get_action_events_by_courses([$course1], 1);
683
 
684
        $this->assertCount(2, $result[$course1->id]);
685
        $this->assertEquals('Event 1', $result[$course1->id][0]->get_name());
686
        $this->assertEquals('Event 2', $result[$course1->id][1]->get_name());
687
 
688
        $result = \core_calendar\local\api::get_action_events_by_courses([$course1, $course2], 1);
689
 
690
        $this->assertCount(2, $result[$course1->id]);
691
        $this->assertEquals('Event 1', $result[$course1->id][0]->get_name());
692
        $this->assertEquals('Event 2', $result[$course1->id][1]->get_name());
693
        $this->assertCount(3, $result[$course2->id]);
694
        $this->assertEquals('Event 3', $result[$course2->id][0]->get_name());
695
        $this->assertEquals('Event 4', $result[$course2->id][1]->get_name());
696
        $this->assertEquals('Event 5', $result[$course2->id][2]->get_name());
697
 
698
        $result = \core_calendar\local\api::get_action_events_by_courses([$course1, $course2], 2, 4);
699
 
700
        $this->assertCount(1, $result[$course1->id]);
701
        $this->assertEquals('Event 2', $result[$course1->id][0]->get_name());
702
        $this->assertCount(2, $result[$course2->id]);
703
        $this->assertEquals('Event 3', $result[$course2->id][0]->get_name());
704
        $this->assertEquals('Event 4', $result[$course2->id][1]->get_name());
705
 
706
        $result = \core_calendar\local\api::get_action_events_by_courses([$course1, $course2, $course3], 1, null, 1);
707
 
708
        $this->assertCount(1, $result[$course1->id]);
709
        $this->assertEquals('Event 1', $result[$course1->id][0]->get_name());
710
        $this->assertCount(1, $result[$course2->id]);
711
        $this->assertEquals('Event 3', $result[$course2->id][0]->get_name());
712
        $this->assertCount(1, $result[$course3->id]);
713
        $this->assertEquals('Event 6', $result[$course3->id][0]->get_name());
714
    }
715
 
716
    /**
717
     * Test get_action_events_by_courses with search feature.
718
     * @covers ::get_action_events_by_courses
719
     */
11 efrain 720
    public function test_get_action_events_by_courses_with_search(): void {
1 efrain 721
        // Generate data.
722
        $user = $this->getDataGenerator()->create_user();
723
        $course1 = $this->getDataGenerator()->create_course(['fullname' => 'Course with advanced name']);
724
        $course2 = $this->getDataGenerator()->create_course(['fullname' => 'Another name']);
725
        $generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
726
        $moduleinstance1 = $generator->create_instance(['course' => $course1->id]);
727
        $moduleinstance2 = $generator->create_instance(['course' => $course2->id]);
728
 
729
        $this->getDataGenerator()->enrol_user($user->id, $course1->id);
730
        $this->getDataGenerator()->enrol_user($user->id, $course2->id);
731
        $this->resetAfterTest(true);
732
        $this->setUser($user);
733
 
734
        $params = [
735
            'type' => CALENDAR_EVENT_TYPE_ACTION,
736
            'modulename' => 'assign',
737
            'instance' => $moduleinstance1->id,
738
            'userid' => $user->id,
739
            'courseid' => $course1->id,
740
            'eventtype' => 'user',
741
            'repeats' => 0,
742
            'timestart' => 1,
743
        ];
744
 
745
        $event1 = create_event(array_merge($params, ['name' => 'Event 1', 'timesort' => 1]));
746
        $event2 = create_event(array_merge($params, ['name' => 'Event 2', 'timesort' => 2]));
747
 
748
        $params['courseid'] = $course2->id;
749
        $params['instance'] = $moduleinstance2->id;
750
        $event3 = create_event(array_merge($params, ['name' => 'Event 3', 'timesort' => 3]));
751
        $event4 = create_event(array_merge($params, ['name' => 'Event 4', 'timesort' => 4]));
752
        $event5 = create_event(array_merge($params, ['name' => 'Event 5', 'timesort' => 5]));
753
 
754
        // No result found for fake search.
755
        $result = \core_calendar\local\api::get_action_events_by_courses(
756
            [$course1, $course2], 1, null, '6', 'Fake search');
757
        $this->assertEmpty($result[$course1->id]);
758
        $this->assertEmpty($result[$course2->id]);
759
 
760
        // Search for course name called 'Course with advanced name'.
761
        $result = \core_calendar\local\api::get_action_events_by_courses(
762
            [$course1, $course2], 1, null, '6', 'Course with advanced name');
763
        $this->assertNotEmpty($result[$course1->id]);
764
        $this->assertEmpty($result[$course2->id]);
765
        $this->assertEquals('Event 1', $result[$course1->id][0]->get_name());
766
        $this->assertEquals('Event 2', $result[$course1->id][1]->get_name());
767
 
768
        // Search for course name contains 'Course advanced'.
769
        $result = \core_calendar\local\api::get_action_events_by_courses(
770
            [$course1, $course2], 1, null, '6', 'Course advanced');
771
        $this->assertNotEmpty($result[$course1->id]);
772
        $this->assertEmpty($result[$course2->id]);
773
        $this->assertEquals('Event 1', $result[$course1->id][0]->get_name());
774
        $this->assertEquals('Event 2', $result[$course1->id][1]->get_name());
775
 
776
        // Search for course name contains 'name'.
777
        $result = \core_calendar\local\api::get_action_events_by_courses(
778
            [$course1, $course2], 1, null, '6', 'name');
779
        $this->assertNotEmpty($result[$course1->id]);
780
        $this->assertNotEmpty($result[$course2->id]);
781
        $this->assertEquals('Event 1', $result[$course1->id][0]->get_name());
782
        $this->assertEquals('Event 2', $result[$course1->id][1]->get_name());
783
        $this->assertEquals('Event 3', $result[$course2->id][0]->get_name());
784
        $this->assertEquals('Event 4', $result[$course2->id][1]->get_name());
785
        $this->assertEquals('Event 5', $result[$course2->id][2]->get_name());
786
    }
787
 
788
    /**
789
     * Test that the get_legacy_events() function only returns activity events that are enabled.
790
     */
11 efrain 791
    public function test_get_legacy_events_with_disabled_module(): void {
1 efrain 792
        global $DB;
793
 
794
        $this->setAdminUser();
795
 
796
        $course = $this->getDataGenerator()->create_course();
797
 
798
        $assigngenerator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
799
        $assigninstance = $assigngenerator->create_instance(['course' => $course->id]);
800
 
801
        $lessongenerator = $this->getDataGenerator()->get_plugin_generator('mod_lesson');
802
        $lessoninstance = $lessongenerator->create_instance(['course' => $course->id]);
803
        $student = $this->getDataGenerator()->create_user();
804
        $this->getDataGenerator()->enrol_user($student->id, $course->id, 'student');
805
        $this->setUser($student);
806
        $events = [
807
            [
808
                'name' => 'Start of assignment',
809
                'description' => '',
810
                'location' => 'Test',
811
                'format' => 1,
812
                'courseid' => $course->id,
813
                'groupid' => 0,
814
                'userid' => 2,
815
                'modulename' => 'assign',
816
                'instance' => $assigninstance->id,
817
                'eventtype' => 'due',
818
                'timestart' => time(),
819
                'timeduration' => 86400,
820
                'visible' => 1
821
            ], [
822
                'name' => 'Start of lesson',
823
                'description' => '',
824
                'location' => 'Test',
825
                'format' => 1,
826
                'courseid' => $course->id,
827
                'groupid' => 0,
828
                'userid' => 2,
829
                'modulename' => 'lesson',
830
                'instance' => $lessoninstance->id,
831
                'eventtype' => 'end',
832
                'timestart' => time(),
833
                'timeduration' => 86400,
834
                'visible' => 1
835
            ]
836
        ];
837
        foreach ($events as $event) {
838
            \calendar_event::create($event, false);
839
        }
840
        $timestart = time() - 60;
841
        $timeend = time() + 60;
842
 
843
        // Get all events.
844
        $events = calendar_get_legacy_events($timestart, $timeend, true, 0, true);
845
        $this->assertCount(2, $events);
846
 
847
        // Disable the lesson module.
848
        $modulerecord = $DB->get_record('modules', ['name' => 'lesson']);
849
        $modulerecord->visible = 0;
850
        $DB->update_record('modules', $modulerecord);
851
 
852
        // Check that we only return the assign event.
853
        $events = calendar_get_legacy_events($timestart, $timeend, true, 0, true);
854
        $this->assertCount(1, $events);
855
        $event = reset($events);
856
        $this->assertEquals('assign', $event->modulename);
857
    }
858
 
859
    /**
860
     * Test for \core_calendar\local\api::get_legacy_events() when there are user and group overrides.
861
     */
11 efrain 862
    public function test_get_legacy_events_with_overrides(): void {
1 efrain 863
        $generator = $this->getDataGenerator();
864
 
865
        $course = $generator->create_course();
866
 
867
        $plugingenerator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
868
        if (!isset($params['course'])) {
869
            $params['course'] = $course->id;
870
        }
871
 
872
        $instance = $plugingenerator->create_instance($params);
873
 
874
        // Create users.
875
        $useroverridestudent = $generator->create_user();
876
        $group1student = $generator->create_user();
877
        $group2student = $generator->create_user();
878
        $group12student = $generator->create_user();
879
        $nogroupstudent = $generator->create_user();
880
 
881
        // Enrol users.
882
        $generator->enrol_user($useroverridestudent->id, $course->id, 'student');
883
        $generator->enrol_user($group1student->id, $course->id, 'student');
884
        $generator->enrol_user($group2student->id, $course->id, 'student');
885
        $generator->enrol_user($group12student->id, $course->id, 'student');
886
        $generator->enrol_user($nogroupstudent->id, $course->id, 'student');
887
 
888
        // Create groups.
889
        $group1 = $generator->create_group(['courseid' => $course->id]);
890
        $group2 = $generator->create_group(['courseid' => $course->id]);
891
 
892
        // Add members to groups.
893
        $generator->create_group_member(['groupid' => $group1->id, 'userid' => $group1student->id]);
894
        $generator->create_group_member(['groupid' => $group2->id, 'userid' => $group2student->id]);
895
        $generator->create_group_member(['groupid' => $group1->id, 'userid' => $group12student->id]);
896
        $generator->create_group_member(['groupid' => $group2->id, 'userid' => $group12student->id]);
897
        $now = time();
898
 
899
        // Events with the same module name, instance and event type.
900
        $events = [
901
            [
902
                'name' => 'Assignment 1 due date',
903
                'description' => '',
904
                'location' => 'Test',
905
                'format' => 0,
906
                'courseid' => $course->id,
907
                'groupid' => 0,
908
                'userid' => 2,
909
                'modulename' => 'assign',
910
                'instance' => $instance->id,
911
                'eventtype' => 'due',
912
                'timestart' => $now,
913
                'timeduration' => 0,
914
                'visible' => 1
915
            ], [
916
                'name' => 'Assignment 1 due date - User override',
917
                'description' => '',
918
                'location' => 'Test',
919
                'format' => 1,
920
                'courseid' => 0,
921
                'groupid' => 0,
922
                'userid' => $useroverridestudent->id,
923
                'modulename' => 'assign',
924
                'instance' => $instance->id,
925
                'eventtype' => 'due',
926
                'timestart' => $now + 86400,
927
                'timeduration' => 0,
928
                'visible' => 1,
929
                'priority' => CALENDAR_EVENT_USER_OVERRIDE_PRIORITY
930
            ], [
931
                'name' => 'Assignment 1 due date - Group A override',
932
                'description' => '',
933
                'location' => 'Test',
934
                'format' => 1,
935
                'courseid' => $course->id,
936
                'groupid' => $group1->id,
937
                'userid' => 2,
938
                'modulename' => 'assign',
939
                'instance' => $instance->id,
940
                'eventtype' => 'due',
941
                'timestart' => $now + (2 * 86400),
942
                'timeduration' => 0,
943
                'visible' => 1,
944
                'priority' => 1,
945
            ], [
946
                'name' => 'Assignment 1 due date - Group B override',
947
                'description' => '',
948
                'location' => 'Test',
949
                'format' => 1,
950
                'courseid' => $course->id,
951
                'groupid' => $group2->id,
952
                'userid' => 2,
953
                'modulename' => 'assign',
954
                'instance' => $instance->id,
955
                'eventtype' => 'due',
956
                'timestart' => $now + (3 * 86400),
957
                'timeduration' => 0,
958
                'visible' => 1,
959
                'priority' => 2,
960
            ],
961
        ];
962
 
963
        foreach ($events as $event) {
964
            \calendar_event::create($event, false);
965
        }
966
 
967
        $timestart = $now - 100;
968
        $timeend = $now + (3 * 86400);
969
        $groups = [$group1->id, $group2->id];
970
 
971
        // Get user override events.
972
        $this->setUser($useroverridestudent);
973
        $events = calendar_get_legacy_events($timestart, $timeend, $useroverridestudent->id, $groups, $course->id);
974
        $this->assertCount(1, $events);
975
        $event = reset($events);
976
        $this->assertEquals('Assignment 1 due date - User override', $event->name);
977
 
978
        // Get event for user with override but with the timestart and timeend parameters only covering the original event.
979
        $events = calendar_get_legacy_events($timestart, $now, $useroverridestudent->id, $groups, $course->id);
980
        $this->assertCount(0, $events);
981
 
982
        // Get events for user that does not belong to any group and has no user override events.
983
        $this->setUser($nogroupstudent);
984
        $events = calendar_get_legacy_events($timestart, $timeend, $nogroupstudent->id, $groups, $course->id);
985
        $this->assertCount(1, $events);
986
        $event = reset($events);
987
        $this->assertEquals('Assignment 1 due date', $event->name);
988
 
989
        // Get events for user that belongs to groups A and B and has no user override events.
990
        $this->setUser($group12student);
991
        $events = calendar_get_legacy_events($timestart, $timeend, $group12student->id, $groups, $course->id);
992
        $this->assertCount(1, $events);
993
        $event = reset($events);
994
        $this->assertEquals('Assignment 1 due date - Group A override', $event->name);
995
 
996
        // Get events for user that belongs to group A and has no user override events.
997
        $this->setUser($group1student);
998
        $events = calendar_get_legacy_events($timestart, $timeend, $group1student->id, $groups, $course->id);
999
        $this->assertCount(1, $events);
1000
        $event = reset($events);
1001
        $this->assertEquals('Assignment 1 due date - Group A override', $event->name);
1002
 
1003
        // Add repeating events.
1004
        $repeatingevents = [
1005
            [
1006
                'name' => 'Repeating site event',
1007
                'description' => '',
1008
                'location' => 'Test',
1009
                'format' => 1,
1010
                'courseid' => SITEID,
1011
                'groupid' => 0,
1012
                'userid' => 2,
1013
                'repeatid' => $event->id,
1014
                'modulename' => '0',
1015
                'instance' => 0,
1016
                'eventtype' => 'site',
1017
                'timestart' => $now + 86400,
1018
                'timeduration' => 0,
1019
                'visible' => 1,
1020
            ],
1021
            [
1022
                'name' => 'Repeating site event',
1023
                'description' => '',
1024
                'location' => 'Test',
1025
                'format' => 1,
1026
                'courseid' => SITEID,
1027
                'groupid' => 0,
1028
                'userid' => 2,
1029
                'repeatid' => $event->id,
1030
                'modulename' => '0',
1031
                'instance' => 0,
1032
                'eventtype' => 'site',
1033
                'timestart' => $now + (2 * 86400),
1034
                'timeduration' => 0,
1035
                'visible' => 1,
1036
            ],
1037
        ];
1038
 
1039
        foreach ($repeatingevents as $event) {
1040
            \calendar_event::create($event, false);
1041
        }
1042
 
1043
        // Make sure repeating events are not filtered out.
1044
        $events = calendar_get_legacy_events($timestart, $timeend, true, true, true);
1045
        $this->assertCount(3, $events);
1046
    }
1047
 
1048
    /**
1049
     * Setting the start date on the calendar event should update the date
1050
     * of the event but should leave the time of day unchanged.
1051
     */
11 efrain 1052
    public function test_update_event_start_day_updates_date(): void {
1 efrain 1053
        $generator = $this->getDataGenerator();
1054
        $user = $generator->create_user();
1055
        $roleid = $generator->create_role();
1056
        $context = \context_system::instance();
1057
        $originalstarttime = new \DateTimeImmutable('2017-01-1T15:00:00+08:00');
1058
        $newstartdate = new \DateTimeImmutable('2018-02-2T10:00:00+08:00');
1059
        $expected = new \DateTimeImmutable('2018-02-2T15:00:00+08:00');
1060
        $mapper = container::get_event_mapper();
1061
 
1062
        $generator->role_assign($roleid, $user->id, $context->id);
1063
        assign_capability('moodle/calendar:manageownentries', CAP_ALLOW, $roleid, $context, true);
1064
 
1065
        $this->setUser($user);
1066
        $this->resetAfterTest(true);
1067
 
1068
        $event = create_event([
1069
            'name' => 'Test event',
1070
            'userid' => $user->id,
1071
            'eventtype' => 'user',
1072
            'repeats' => 0,
1073
            'timestart' => $originalstarttime->getTimestamp(),
1074
        ]);
1075
        $event = $mapper->from_legacy_event_to_event($event);
1076
 
1077
        $newEvent = \core_calendar\local\api::update_event_start_day($event, $newstartdate);
1078
        $actual = $newEvent->get_times()->get_start_time();
1079
 
1080
        $this->assertEquals($expected->getTimestamp(), $actual->getTimestamp());
1081
    }
1082
 
1083
    /**
1084
     * A user should not be able to update the start date of the event
1085
     * that they don't have the capabilities to modify.
1086
     */
11 efrain 1087
    public function test_update_event_start_day_no_permission(): void {
1 efrain 1088
        $generator = $this->getDataGenerator();
1089
        $user = $generator->create_user();
1090
        $roleid = $generator->create_role();
1091
        $context = \context_system::instance();
1092
        $originalstarttime = new \DateTimeImmutable('2017-01-1T15:00:00+08:00');
1093
        $newstartdate = new \DateTimeImmutable('2018-02-2T10:00:00+08:00');
1094
        $expected = new \DateTimeImmutable('2018-02-2T15:00:00+08:00');
1095
        $mapper = container::get_event_mapper();
1096
 
1097
        $generator->role_assign($roleid, $user->id, $context->id);
1098
 
1099
        $this->setUser($user);
1100
        $this->resetAfterTest(true);
1101
 
1102
        $event = create_event([
1103
            'name' => 'Test event',
1104
            'userid' => $user->id,
1105
            'eventtype' => 'user',
1106
            'repeats' => 0,
1107
            'timestart' => $originalstarttime->getTimestamp(),
1108
        ]);
1109
        $event = $mapper->from_legacy_event_to_event($event);
1110
 
1111
        assign_capability('moodle/calendar:manageownentries', CAP_PROHIBIT, $roleid, $context, true);
1112
        $this->expectException('moodle_exception');
1113
        $newEvent = \core_calendar\local\api::update_event_start_day($event, $newstartdate);
1114
    }
1115
 
1116
    /**
1117
     * Updating the start day of an event with no maximum cutoff should
1118
     * update the corresponding activity property.
1119
     *
1120
     * Note: This test uses the feedback activity because it requires
1121
     * module callbacks to be in place to test.
1122
     */
11 efrain 1123
    public function test_update_event_start_day_activity_event_no_max(): void {
1 efrain 1124
        global $CFG, $DB;
1125
        require_once($CFG->dirroot . '/mod/feedback/lib.php');
1126
 
1127
        $this->resetAfterTest(true);
1128
        $this->setAdminUser();
1129
        $timeopen = new \DateTimeImmutable('2017-01-1T15:00:00+08:00');
1130
        $newstartdate = new \DateTimeImmutable('2018-02-2T10:00:00+08:00');
1131
        $expected = new \DateTimeImmutable('2018-02-2T15:00:00+08:00');
1132
        list($feedback, $event) = $this->create_feedback_activity_and_event(
1133
            [
1134
                'timeopen' => $timeopen->getTimestamp(),
1135
                'timeclose' => 0
1136
            ],
1137
            [
1138
                'eventtype' => FEEDBACK_EVENT_TYPE_OPEN,
1139
                'timestart' => $timeopen->getTimestamp()
1140
            ]
1141
        );
1142
        $newevent = \core_calendar\local\api::update_event_start_day($event, $newstartdate);
1143
        $actual = $newevent->get_times()->get_start_time();
1144
        $feedback = $DB->get_record('feedback', ['id' => $feedback->id]);
1145
 
1146
        $this->assertEquals($expected->getTimestamp(), $actual->getTimestamp());
1147
        $this->assertEquals($expected->getTimestamp(), $feedback->timeopen);
1148
    }
1149
 
1150
    /**
1151
     * Updating the start day of an event belonging to an activity to a value
1152
     * less than the maximum cutoff should update the corresponding activity
1153
     * property.
1154
     *
1155
     * Note: This test uses the feedback activity because it requires
1156
     * module callbacks to be in place to test.
1157
     */
11 efrain 1158
    public function test_update_event_start_day_activity_event_less_than_max(): void {
1 efrain 1159
        global $CFG, $DB;
1160
        require_once($CFG->dirroot . '/mod/feedback/lib.php');
1161
 
1162
        $this->resetAfterTest(true);
1163
        $this->setAdminUser();
1164
        $timeopen = new \DateTimeImmutable('2017-01-1T15:00:00+08:00');
1165
        $timeclose = new \DateTimeImmutable('2019-01-1T15:00:00+08:00');
1166
        $newstartdate = new \DateTimeImmutable('2018-02-2T10:00:00+08:00');
1167
        $expected = new \DateTimeImmutable('2018-02-2T15:00:00+08:00');
1168
        list($feedback, $event) = $this->create_feedback_activity_and_event(
1169
            [
1170
                'timeopen' => $timeopen->getTimestamp(),
1171
                'timeclose' => $timeclose->getTimestamp()
1172
            ],
1173
            [
1174
                'eventtype' => FEEDBACK_EVENT_TYPE_OPEN,
1175
                'timestart' => $timeopen->getTimestamp()
1176
            ]
1177
        );
1178
 
1179
        $newevent = \core_calendar\local\api::update_event_start_day($event, $newstartdate);
1180
        $actual = $newevent->get_times()->get_start_time();
1181
        $feedback = $DB->get_record('feedback', ['id' => $feedback->id]);
1182
 
1183
        $this->assertEquals($expected->getTimestamp(), $actual->getTimestamp());
1184
        $this->assertEquals($expected->getTimestamp(), $feedback->timeopen);
1185
    }
1186
 
1187
    /**
1188
     * Updating the start day of an event belonging to an activity to a value
1189
     * equal to the maximum cutoff should update the corresponding activity
1190
     * property.
1191
     *
1192
     * Note: This test uses the feedback activity because it requires
1193
     * module callbacks to be in place to test.
1194
     */
11 efrain 1195
    public function test_update_event_start_day_activity_event_equal_to_max(): void {
1 efrain 1196
        global $CFG, $DB;
1197
        require_once($CFG->dirroot . '/mod/feedback/lib.php');
1198
 
1199
        $this->resetAfterTest(true);
1200
        $this->setAdminUser();
1201
        $timeopen = new \DateTimeImmutable('2017-01-1T15:00:00+08:00');
1202
        $timeclose = new \DateTimeImmutable('2018-02-2T15:00:00+08:00');
1203
        $newstartdate = new \DateTimeImmutable('2018-02-2T10:00:00+08:00');
1204
        list($feedback, $event) = $this->create_feedback_activity_and_event(
1205
            [
1206
                'timeopen' => $timeopen->getTimestamp(),
1207
                'timeclose' => $timeclose->getTimestamp(),
1208
            ],
1209
            [
1210
                'eventtype' => FEEDBACK_EVENT_TYPE_OPEN,
1211
                'timestart' => $timeopen->getTimestamp()
1212
            ]
1213
        );
1214
 
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]);
1218
 
1219
        $this->assertEquals($timeclose->getTimestamp(), $actual->getTimestamp());
1220
        $this->assertEquals($timeclose->getTimestamp(), $feedback->timeopen);
1221
    }
1222
 
1223
    /**
1224
     * Updating the start day of an event belonging to an activity to a value
1225
     * after the maximum cutoff should not update the corresponding activity
1226
     * property. Instead it should throw an exception.
1227
     *
1228
     * Note: This test uses the feedback activity because it requires
1229
     * module callbacks to be in place to test.
1230
     */
11 efrain 1231
    public function test_update_event_start_day_activity_event_after_max(): void {
1 efrain 1232
        global $CFG, $DB;
1233
        require_once($CFG->dirroot . '/mod/feedback/lib.php');
1234
 
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('2018-02-2T10:00:00+08:00');
1240
        list($feedback, $event) = $this->create_feedback_activity_and_event(
1241
            [
1242
                'timeopen' => $timeopen->getTimestamp(),
1243
                'timeclose' => $timeclose->getTimestamp(),
1244
            ],
1245
            [
1246
                'eventtype' => FEEDBACK_EVENT_TYPE_OPEN,
1247
                'timestart' => $timeopen->getTimestamp()
1248
            ]
1249
        );
1250
 
1251
        $this->expectException('moodle_exception');
1252
        $newevent = \core_calendar\local\api::update_event_start_day($event, $newstartdate);
1253
    }
1254
 
1255
    /**
1256
     * Updating the start day of an event with no minimum cutoff should
1257
     * update the corresponding activity property.
1258
     *
1259
     * Note: This test uses the feedback activity because it requires
1260
     * module callbacks to be in place to test.
1261
     */
11 efrain 1262
    public function test_update_event_start_day_activity_event_no_min(): void {
1 efrain 1263
        global $CFG, $DB;
1264
        require_once($CFG->dirroot . '/mod/feedback/lib.php');
1265
 
1266
        $this->resetAfterTest(true);
1267
        $this->setAdminUser();
1268
        $timeclose = new \DateTimeImmutable('2017-01-1T15:00:00+08:00');
1269
        $newstartdate = new \DateTimeImmutable('2016-02-2T10:00:00+08:00');
1270
        $expected = new \DateTimeImmutable('2016-02-2T15:00:00+08:00');
1271
        list($feedback, $event) = $this->create_feedback_activity_and_event(
1272
            [
1273
                'timeopen' => 0,
1274
                'timeclose' => $timeclose->getTimestamp()
1275
            ],
1276
            [
1277
                'eventtype' => FEEDBACK_EVENT_TYPE_OPEN,
1278
                'timestart' => $timeclose->getTimestamp()
1279
            ]
1280
        );
1281
 
1282
        $newevent = \core_calendar\local\api::update_event_start_day($event, $newstartdate);
1283
        $actual = $newevent->get_times()->get_start_time();
1284
        $feedback = $DB->get_record('feedback', ['id' => $feedback->id]);
1285
 
1286
        $this->assertEquals($expected->getTimestamp(), $actual->getTimestamp());
1287
        $this->assertEquals($expected->getTimestamp(), $feedback->timeopen);
1288
    }
1289
 
1290
    /**
1291
     * Updating the start day of an event belonging to an activity to a value
1292
     * greater than the minimum cutoff should update the corresponding activity
1293
     * property.
1294
     *
1295
     * Note: This test uses the feedback activity because it requires
1296
     * module callbacks to be in place to test.
1297
     */
11 efrain 1298
    public function test_update_event_start_day_activity_event_greater_than_min(): void {
1 efrain 1299
        global $CFG, $DB;
1300
        require_once($CFG->dirroot . '/mod/feedback/lib.php');
1301
 
1302
        $this->resetAfterTest(true);
1303
        $this->setAdminUser();
1304
        $timeopen = new \DateTimeImmutable('2016-01-1T15:00:00+08:00');
1305
        $timeclose = new \DateTimeImmutable('2019-01-1T15:00:00+08:00');
1306
        $newstartdate = new \DateTimeImmutable('2018-02-2T10:00:00+08:00');
1307
        $expected = new \DateTimeImmutable('2018-02-2T15:00:00+08:00');
1308
        list($feedback, $event) = $this->create_feedback_activity_and_event(
1309
            [
1310
                'timeopen' => $timeopen->getTimestamp(),
1311
                'timeclose' => $timeclose->getTimestamp()
1312
            ],
1313
            [
1314
                'eventtype' => FEEDBACK_EVENT_TYPE_CLOSE,
1315
                'timestart' => $timeclose->getTimestamp()
1316
            ]
1317
        );
1318
 
1319
        $newevent = \core_calendar\local\api::update_event_start_day($event, $newstartdate);
1320
        $actual = $newevent->get_times()->get_start_time();
1321
        $feedback = $DB->get_record('feedback', ['id' => $feedback->id]);
1322
 
1323
        $this->assertEquals($expected->getTimestamp(), $actual->getTimestamp());
1324
        $this->assertEquals($expected->getTimestamp(), $feedback->timeclose);
1325
    }
1326
 
1327
    /**
1328
     * Updating the start day of an event belonging to an activity to a value
1329
     * equal to the minimum cutoff should update the corresponding activity
1330
     * property.
1331
     *
1332
     * Note: This test uses the feedback activity because it requires
1333
     * module callbacks to be in place to test.
1334
     */
11 efrain 1335
    public function test_update_event_start_day_activity_event_equal_to_min(): void {
1 efrain 1336
        global $CFG, $DB;
1337
        require_once($CFG->dirroot . '/mod/feedback/lib.php');
1338
 
1339
        $this->resetAfterTest(true);
1340
        $this->setAdminUser();
1341
        $timeopen = new \DateTimeImmutable('2017-01-1T15:00:00+08:00');
1342
        $timeclose = new \DateTimeImmutable('2018-02-2T15:00:00+08:00');
1343
        $newstartdate = new \DateTimeImmutable('2017-01-1T10:00:00+08:00');
1344
        $expected = new \DateTimeImmutable('2017-01-1T15:00:00+08:00');
1345
        list($feedback, $event) = $this->create_feedback_activity_and_event(
1346
            [
1347
                'timeopen' => $timeopen->getTimestamp(),
1348
                'timeclose' => $timeclose->getTimestamp(),
1349
            ],
1350
            [
1351
                'eventtype' => FEEDBACK_EVENT_TYPE_CLOSE,
1352
                'timestart' => $timeclose->getTimestamp()
1353
            ]
1354
        );
1355
 
1356
        $newevent = \core_calendar\local\api::update_event_start_day($event, $newstartdate);
1357
        $actual = $newevent->get_times()->get_start_time();
1358
        $feedback = $DB->get_record('feedback', ['id' => $feedback->id]);
1359
 
1360
        $this->assertEquals($expected->getTimestamp(), $actual->getTimestamp());
1361
        $this->assertEquals($expected->getTimestamp(), $feedback->timeclose);
1362
    }
1363
 
1364
    /**
1365
     * Updating the start day of an event belonging to an activity to a value
1366
     * before the minimum cutoff should not update the corresponding activity
1367
     * property. Instead it should throw an exception.
1368
     *
1369
     * Note: This test uses the feedback activity because it requires
1370
     * module callbacks to be in place to test.
1371
     */
11 efrain 1372
    public function test_update_event_start_day_activity_event_before_min(): void {
1 efrain 1373
        global $CFG, $DB;
1374
        require_once($CFG->dirroot . '/mod/feedback/lib.php');
1375
 
1376
        $this->resetAfterTest(true);
1377
        $this->setAdminUser();
1378
        $timeopen = new \DateTimeImmutable('2017-01-1T15:00:00+08:00');
1379
        $timeclose = new \DateTimeImmutable('2017-02-2T15:00:00+08:00');
1380
        $newstartdate = new \DateTimeImmutable('2016-02-2T10:00:00+08:00');
1381
        list($feedback, $event) = $this->create_feedback_activity_and_event(
1382
            [
1383
                'timeopen' => $timeopen->getTimestamp(),
1384
                'timeclose' => $timeclose->getTimestamp(),
1385
            ],
1386
            [
1387
                'eventtype' => FEEDBACK_EVENT_TYPE_CLOSE,
1388
                'timestart' => $timeclose->getTimestamp()
1389
            ]
1390
        );
1391
 
1392
        $this->expectException('moodle_exception');
1393
        $newevent = \core_calendar\local\api::update_event_start_day($event, $newstartdate);
1394
    }
1395
 
1396
    /**
1397
     * Updating the start day of an overridden event belonging to an activity
1398
     * should result in an exception. This is to prevent the drag and drop
1399
     * of override events.
1400
     *
1401
     * Note: This test uses the quiz activity because it requires
1402
     * module callbacks to be in place and override event support to test.
1403
     */
11 efrain 1404
    public function test_update_event_start_day_activity_event_override(): void {
1 efrain 1405
        global $CFG, $DB;
1406
        require_once($CFG->dirroot . '/calendar/lib.php');
1407
        require_once($CFG->dirroot . '/mod/quiz/lib.php');
1408
 
1409
        $this->resetAfterTest(true);
1410
        $this->setAdminUser();
1411
        $mapper = container::get_event_mapper();
1412
        $timeopen = new \DateTimeImmutable('2017-01-1T15:00:00+08:00');
1413
        $newstartdate = new \DateTimeImmutable('2016-02-2T10:00:00+08:00');
1414
        $generator = $this->getDataGenerator();
1415
        $user = $generator->create_user();
1416
        $course = $generator->create_course();
1417
        $quizgenerator = $generator->get_plugin_generator('mod_quiz');
1418
        $quiz = $quizgenerator->create_instance([
1419
            'course' => $course->id,
1420
            'timeopen' => $timeopen->getTimestamp(),
1421
        ]);
1422
        $event = create_event([
1423
            'courseid' => $course->id,
1424
            'userid' => $user->id,
1425
            'modulename' => 'quiz',
1426
            'instance' => $quiz->id,
1427
            'eventtype' => QUIZ_EVENT_TYPE_OPEN,
1428
            'timestart' => $timeopen->getTimestamp()
1429
        ]);
1430
        $event = $mapper->from_legacy_event_to_event($event);
1431
        $record = (object) [
1432
            'quiz' => $quiz->id,
1433
            'userid' => $user->id
1434
        ];
1435
 
1436
        $DB->insert_record('quiz_overrides', $record);
1437
 
1438
        $this->expectException('moodle_exception');
1439
        $newevent = \core_calendar\local\api::update_event_start_day($event, $newstartdate);
1440
    }
1441
}