Proyectos de Subversion Moodle

Rev

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

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
// This file is part of Moodle - http://moodle.org/
3
//
4
// Moodle is free software: you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation, either version 3 of the License, or
7
// (at your option) any later version.
8
//
9
// Moodle is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
// GNU General Public License for more details.
13
//
14
// You should have received a copy of the GNU General Public License
15
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16
 
17
namespace core_calendar;
18
 
19
/**
20
 * Class contaning unit tests for the calendar lib.
21
 *
22
 * @package    core_calendar
23
 * @copyright  2017 Mark Nelson <markn@moodle.com>
24
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25
 */
26
class lib_test extends \advanced_testcase {
27
 
28
    /**
29
     * Load required test libraries
30
     */
31
    public static function setUpBeforeClass(): void {
32
        global $CFG;
33
 
34
        require_once("{$CFG->dirroot}/calendar/tests/helpers.php");
35
    }
36
 
37
    /**
38
     * Tests set up
39
     */
40
    protected function setUp(): void {
41
        $this->resetAfterTest();
42
    }
43
 
44
    /**
45
     * Test that the get_events() function only returns activity events that are enabled.
46
     */
11 efrain 47
    public function test_get_events_with_disabled_module(): void {
1 efrain 48
        global $DB;
49
        $this->setAdminUser();
50
        $generator = $this->getDataGenerator();
51
        $course = $generator->create_course();
52
        $assigngenerator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
53
        $assigninstance = $assigngenerator->create_instance(['course' => $course->id]);
54
        $lessongenerator = $this->getDataGenerator()->get_plugin_generator('mod_lesson');
55
        $lessoninstance = $lessongenerator->create_instance(['course' => $course->id]);
56
        $student = $generator->create_user();
57
        $generator->enrol_user($student->id, $course->id, 'student');
58
        $this->setUser($student);
59
        $events = [
60
            [
61
                'name' => 'Start of assignment',
62
                'description' => '',
63
                'location' => 'Test',
64
                'format' => 1,
65
                'courseid' => $course->id,
66
                'groupid' => 0,
67
                'userid' => 2,
68
                'modulename' => 'assign',
69
                'instance' => $assigninstance->id,
70
                'eventtype' => 'due',
71
                'timestart' => time(),
72
                'timeduration' => 86400,
73
                'visible' => 1
74
            ], [
75
                'name' => 'Start of lesson',
76
                'description' => '',
77
                'location' => 'Test',
78
                'format' => 1,
79
                'courseid' => $course->id,
80
                'groupid' => 0,
81
                'userid' => 2,
82
                'modulename' => 'lesson',
83
                'instance' => $lessoninstance->id,
84
                'eventtype' => 'end',
85
                'timestart' => time(),
86
                'timeduration' => 86400,
87
                'visible' => 1
88
            ]
89
        ];
90
        foreach ($events as $event) {
91
            \calendar_event::create($event, false);
92
        }
93
        $timestart = time() - 60;
94
        $timeend = time() + 60;
95
        // Get all events.
96
        $events = calendar_get_events($timestart, $timeend, true, 0, true);
97
        $this->assertCount(2, $events);
98
        // Disable the lesson module.
99
        $modulerecord = $DB->get_record('modules', ['name' => 'lesson']);
100
        $modulerecord->visible = 0;
101
        $DB->update_record('modules', $modulerecord);
102
        // Check that we only return the assign event.
103
        $events = calendar_get_events($timestart, $timeend, true, 0, true);
104
        $this->assertCount(1, $events);
105
        $event = reset($events);
106
        $this->assertEquals('assign', $event->modulename);
107
    }
108
 
11 efrain 109
    public function test_get_course_cached(): void {
1 efrain 110
        // Setup some test courses.
111
        $course1 = $this->getDataGenerator()->create_course();
112
        $course2 = $this->getDataGenerator()->create_course();
113
        $course3 = $this->getDataGenerator()->create_course();
114
 
115
        // Load courses into cache.
116
        $coursecache = null;
117
        calendar_get_course_cached($coursecache, $course1->id);
118
        calendar_get_course_cached($coursecache, $course2->id);
119
        calendar_get_course_cached($coursecache, $course3->id);
120
 
121
        // Verify the cache.
122
        $this->assertArrayHasKey($course1->id, $coursecache);
123
        $cachedcourse1 = $coursecache[$course1->id];
124
        $this->assertEquals($course1->id, $cachedcourse1->id);
125
        $this->assertEquals($course1->shortname, $cachedcourse1->shortname);
126
        $this->assertEquals($course1->fullname, $cachedcourse1->fullname);
127
 
128
        $this->assertArrayHasKey($course2->id, $coursecache);
129
        $cachedcourse2 = $coursecache[$course2->id];
130
        $this->assertEquals($course2->id, $cachedcourse2->id);
131
        $this->assertEquals($course2->shortname, $cachedcourse2->shortname);
132
        $this->assertEquals($course2->fullname, $cachedcourse2->fullname);
133
 
134
        $this->assertArrayHasKey($course3->id, $coursecache);
135
        $cachedcourse3 = $coursecache[$course3->id];
136
        $this->assertEquals($course3->id, $cachedcourse3->id);
137
        $this->assertEquals($course3->shortname, $cachedcourse3->shortname);
138
        $this->assertEquals($course3->fullname, $cachedcourse3->fullname);
139
    }
140
 
141
    /**
142
     * Test the update_subscription() function.
143
     */
11 efrain 144
    public function test_update_subscription(): void {
1 efrain 145
        $this->resetAfterTest(true);
146
 
147
        $subscription = new \stdClass();
148
        $subscription->eventtype = 'site';
149
        $subscription->name = 'test';
150
        $id = calendar_add_subscription($subscription);
151
 
152
        $subscription = calendar_get_subscription($id);
153
        $subscription->name = 'awesome';
154
        calendar_update_subscription($subscription);
155
        $sub = calendar_get_subscription($id);
156
        $this->assertEquals($subscription->name, $sub->name);
157
 
158
        $subscription = calendar_get_subscription($id);
159
        $subscription->name = 'awesome2';
160
        $subscription->pollinterval = 604800;
161
        calendar_update_subscription($subscription);
162
        $sub = calendar_get_subscription($id);
163
        $this->assertEquals($subscription->name, $sub->name);
164
        $this->assertEquals($subscription->pollinterval, $sub->pollinterval);
165
 
166
        $subscription = new \stdClass();
167
        $subscription->name = 'awesome4';
168
        $this->expectException('coding_exception');
169
        calendar_update_subscription($subscription);
170
    }
171
 
11 efrain 172
    public function test_add_subscription(): void {
1 efrain 173
        global $DB, $CFG;
174
 
175
        require_once($CFG->dirroot . '/lib/bennu/bennu.inc.php');
176
 
177
        $this->resetAfterTest(true);
178
 
179
        // Test for Microsoft Outlook 2010.
180
        $subscription = new \stdClass();
181
        $subscription->name = 'Microsoft Outlook 2010';
182
        $subscription->importfrom = CALENDAR_IMPORT_FROM_FILE;
183
        $subscription->eventtype = 'site';
184
        $id = calendar_add_subscription($subscription);
185
 
186
        $calendar = file_get_contents($CFG->dirroot . '/lib/tests/fixtures/ms_outlook_2010.ics');
187
        $ical = new \iCalendar();
188
        $ical->unserialize($calendar);
189
        $this->assertEquals($ical->parser_errors, array());
190
 
191
        $sub = calendar_get_subscription($id);
192
        calendar_import_events_from_ical($ical, $sub->id);
193
        $count = $DB->count_records('event', array('subscriptionid' => $sub->id));
194
        $this->assertEquals($count, 1);
195
 
196
        // Test for OSX Yosemite.
197
        $subscription = new \stdClass();
198
        $subscription->name = 'OSX Yosemite';
199
        $subscription->importfrom = CALENDAR_IMPORT_FROM_FILE;
200
        $subscription->eventtype = 'site';
201
        $id = calendar_add_subscription($subscription);
202
 
203
        $calendar = file_get_contents($CFG->dirroot . '/lib/tests/fixtures/osx_yosemite.ics');
204
        $ical = new \iCalendar();
205
        $ical->unserialize($calendar);
206
        $this->assertEquals($ical->parser_errors, array());
207
 
208
        $sub = calendar_get_subscription($id);
209
        calendar_import_events_from_ical($ical, $sub->id);
210
        $count = $DB->count_records('event', array('subscriptionid' => $sub->id));
211
        $this->assertEquals($count, 1);
212
 
213
        // Test for Google Gmail.
214
        $subscription = new \stdClass();
215
        $subscription->name = 'Google Gmail';
216
        $subscription->importfrom = CALENDAR_IMPORT_FROM_FILE;
217
        $subscription->eventtype = 'site';
218
        $id = calendar_add_subscription($subscription);
219
 
220
        $calendar = file_get_contents($CFG->dirroot . '/lib/tests/fixtures/google_gmail.ics');
221
        $ical = new \iCalendar();
222
        $ical->unserialize($calendar);
223
        $this->assertEquals($ical->parser_errors, array());
224
 
225
        $sub = calendar_get_subscription($id);
226
        calendar_import_events_from_ical($ical, $sub->id);
227
        $count = $DB->count_records('event', array('subscriptionid' => $sub->id));
228
        $this->assertEquals($count, 1);
229
 
230
        // Test for ICS file with repeated events.
231
        $subscription = new \stdClass();
232
        $subscription->name = 'Repeated events';
233
        $subscription->importfrom = CALENDAR_IMPORT_FROM_FILE;
234
        $subscription->eventtype = 'site';
235
        $id = calendar_add_subscription($subscription);
236
        $calendar = file_get_contents($CFG->dirroot . '/lib/tests/fixtures/repeated_events.ics');
237
        $ical = new \iCalendar();
238
        $ical->unserialize($calendar);
239
        $this->assertEquals($ical->parser_errors, []);
240
 
241
        $sub = calendar_get_subscription($id);
242
        $output = calendar_import_events_from_ical($ical, $sub->id);
243
        $this->assertArrayHasKey('eventsimported', $output);
244
        $this->assertArrayHasKey('eventsskipped', $output);
245
        $this->assertArrayHasKey('eventsupdated', $output);
246
        $this->assertArrayHasKey('eventsdeleted', $output);
247
        $this->assertEquals(1, $output['eventsimported']);
248
        $this->assertEquals(0, $output['eventsskipped']);
249
        $this->assertEquals(0, $output['eventsupdated']);
250
        $this->assertEquals(0, $output['eventsdeleted']);
251
    }
252
 
253
    /**
254
     * Test for calendar_get_legacy_events() when there are user and group overrides.
255
     */
11 efrain 256
    public function test_get_legacy_events_with_overrides(): void {
1 efrain 257
        $generator = $this->getDataGenerator();
258
 
259
        $course = $generator->create_course();
260
 
261
        $plugingenerator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
262
        if (!isset($params['course'])) {
263
            $params['course'] = $course->id;
264
        }
265
 
266
        $instance = $plugingenerator->create_instance($params);
267
 
268
        // Create users.
269
        $useroverridestudent = $generator->create_user();
270
        $group1student = $generator->create_user();
271
        $group2student = $generator->create_user();
272
        $group12student = $generator->create_user();
273
        $nogroupstudent = $generator->create_user();
274
 
275
        // Enrol users.
276
        $generator->enrol_user($useroverridestudent->id, $course->id, 'student');
277
        $generator->enrol_user($group1student->id, $course->id, 'student');
278
        $generator->enrol_user($group2student->id, $course->id, 'student');
279
        $generator->enrol_user($group12student->id, $course->id, 'student');
280
        $generator->enrol_user($nogroupstudent->id, $course->id, 'student');
281
 
282
        // Create groups.
283
        $group1 = $generator->create_group(['courseid' => $course->id]);
284
        $group2 = $generator->create_group(['courseid' => $course->id]);
285
 
286
        // Add members to groups.
287
        $generator->create_group_member(['groupid' => $group1->id, 'userid' => $group1student->id]);
288
        $generator->create_group_member(['groupid' => $group2->id, 'userid' => $group2student->id]);
289
        $generator->create_group_member(['groupid' => $group1->id, 'userid' => $group12student->id]);
290
        $generator->create_group_member(['groupid' => $group2->id, 'userid' => $group12student->id]);
291
        $now = time();
292
 
293
        // Events with the same module name, instance and event type.
294
        $events = [
295
            [
296
                'name' => 'Assignment 1 due date',
297
                'description' => '',
298
                'location' => 'Test',
299
                'format' => 0,
300
                'courseid' => $course->id,
301
                'groupid' => 0,
302
                'userid' => 2,
303
                'modulename' => 'assign',
304
                'instance' => $instance->id,
305
                'eventtype' => 'due',
306
                'timestart' => $now,
307
                'timeduration' => 0,
308
                'visible' => 1
309
            ], [
310
                'name' => 'Assignment 1 due date - User override',
311
                'description' => '',
312
                'location' => 'Test',
313
                'format' => 1,
314
                'courseid' => 0,
315
                'groupid' => 0,
316
                'userid' => $useroverridestudent->id,
317
                'modulename' => 'assign',
318
                'instance' => $instance->id,
319
                'eventtype' => 'due',
320
                'timestart' => $now + 86400,
321
                'timeduration' => 0,
322
                'visible' => 1,
323
                'priority' => CALENDAR_EVENT_USER_OVERRIDE_PRIORITY
324
            ], [
325
                'name' => 'Assignment 1 due date - Group A override',
326
                'description' => '',
327
                'location' => 'Test',
328
                'format' => 1,
329
                'courseid' => $course->id,
330
                'groupid' => $group1->id,
331
                'userid' => 2,
332
                'modulename' => 'assign',
333
                'instance' => $instance->id,
334
                'eventtype' => 'due',
335
                'timestart' => $now + (2 * 86400),
336
                'timeduration' => 0,
337
                'visible' => 1,
338
                'priority' => 1,
339
            ], [
340
                'name' => 'Assignment 1 due date - Group B override',
341
                'description' => '',
342
                'location' => 'Test',
343
                'format' => 1,
344
                'courseid' => $course->id,
345
                'groupid' => $group2->id,
346
                'userid' => 2,
347
                'modulename' => 'assign',
348
                'instance' => $instance->id,
349
                'eventtype' => 'due',
350
                'timestart' => $now + (3 * 86400),
351
                'timeduration' => 0,
352
                'visible' => 1,
353
                'priority' => 2,
354
            ],
355
        ];
356
 
357
        foreach ($events as $event) {
358
            \calendar_event::create($event, false);
359
        }
360
 
361
        $timestart = $now - 100;
362
        $timeend = $now + (3 * 86400);
363
        $groups = [$group1->id, $group2->id];
364
 
365
        // Get user override events.
366
        $this->setUser($useroverridestudent);
367
        $events = calendar_get_legacy_events($timestart, $timeend, $useroverridestudent->id, $groups, $course->id);
368
        $this->assertCount(1, $events);
369
        $event = reset($events);
370
        $this->assertEquals('Assignment 1 due date - User override', $event->name);
371
 
372
        // Get event for user with override but with the timestart and timeend parameters only covering the original event.
373
        $events = calendar_get_legacy_events($timestart, $now, $useroverridestudent->id, $groups, $course->id);
374
        $this->assertCount(0, $events);
375
 
376
        // Get events for user that does not belong to any group and has no user override events.
377
        $this->setUser($nogroupstudent);
378
        $events = calendar_get_legacy_events($timestart, $timeend, $nogroupstudent->id, $groups, $course->id);
379
        $this->assertCount(1, $events);
380
        $event = reset($events);
381
        $this->assertEquals('Assignment 1 due date', $event->name);
382
 
383
        // Get events for user that belongs to groups A and B and has no user override events.
384
        $this->setUser($group12student);
385
        $events = calendar_get_legacy_events($timestart, $timeend, $group12student->id, $groups, $course->id);
386
        $this->assertCount(1, $events);
387
        $event = reset($events);
388
        $this->assertEquals('Assignment 1 due date - Group A override', $event->name);
389
 
390
        // Get events for user that belongs to group A and has no user override events.
391
        $this->setUser($group1student);
392
        $events = calendar_get_legacy_events($timestart, $timeend, $group1student->id, $groups, $course->id);
393
        $this->assertCount(1, $events);
394
        $event = reset($events);
395
        $this->assertEquals('Assignment 1 due date - Group A override', $event->name);
396
 
397
        // Add repeating events.
398
        $repeatingevents = [
399
            [
400
                'name' => 'Repeating site event',
401
                'description' => '',
402
                'location' => 'Test',
403
                'format' => 1,
404
                'courseid' => SITEID,
405
                'groupid' => 0,
406
                'userid' => 2,
407
                'repeatid' => $event->id,
408
                'modulename' => '0',
409
                'instance' => 0,
410
                'eventtype' => 'site',
411
                'timestart' => $now + 86400,
412
                'timeduration' => 0,
413
                'visible' => 1,
414
            ],
415
            [
416
                'name' => 'Repeating site event',
417
                'description' => '',
418
                'location' => 'Test',
419
                'format' => 1,
420
                'courseid' => SITEID,
421
                'groupid' => 0,
422
                'userid' => 2,
423
                'repeatid' => $event->id,
424
                'modulename' => '0',
425
                'instance' => 0,
426
                'eventtype' => 'site',
427
                'timestart' => $now + (2 * 86400),
428
                'timeduration' => 0,
429
                'visible' => 1,
430
            ],
431
        ];
432
 
433
        foreach ($repeatingevents as $event) {
434
            \calendar_event::create($event, false);
435
        }
436
 
437
        // Make sure repeating events are not filtered out.
438
        $events = calendar_get_legacy_events($timestart, $timeend, true, true, true);
439
        $this->assertCount(3, $events);
440
    }
441
 
11 efrain 442
    public function test_calendar_get_default_courses(): void {
1 efrain 443
        global $USER, $CFG;
444
 
445
        $this->resetAfterTest(true);
446
 
447
        $generator = $this->getDataGenerator();
448
        $user = $generator->create_user();
449
        $course1 = $generator->create_course();
450
        $course2 = $generator->create_course();
451
        $course3 = $generator->create_course();
452
        $context = \context_course::instance($course1->id);
453
 
454
        $this->setAdminUser();
455
        $admin = clone $USER;
456
 
457
        $teacher = $generator->create_user();
458
        $generator->enrol_user($teacher->id, $course1->id, 'teacher');
459
        $generator->enrol_user($admin->id, $course1->id, 'teacher');
460
 
461
        $CFG->calendar_adminseesall = false;
462
 
463
        $courses = calendar_get_default_courses();
464
        // Only enrolled in one course.
465
        $this->assertCount(1, $courses);
466
        $courses = calendar_get_default_courses($course2->id);
467
        // Enrolled course + current course.
468
        $this->assertCount(2, $courses);
469
        $CFG->calendar_adminseesall = true;
470
        $courses = calendar_get_default_courses();
471
        // All courses + SITE.
472
        $this->assertCount(4, $courses);
473
        $courses = calendar_get_default_courses($course2->id);
474
        // All courses + SITE.
475
        $this->assertCount(4, $courses);
476
 
477
        $this->setUser($teacher);
478
 
479
        $CFG->calendar_adminseesall = false;
480
 
481
        $courses = calendar_get_default_courses();
482
        // Only enrolled in one course.
483
        $this->assertCount(1, $courses);
484
        $courses = calendar_get_default_courses($course2->id);
485
        // Enrolled course only (ignore current).
486
        $this->assertCount(1, $courses);
487
        // This setting should not affect teachers.
488
        $CFG->calendar_adminseesall = true;
489
        $courses = calendar_get_default_courses();
490
        // Only enrolled in one course.
491
        $this->assertCount(1, $courses);
492
        $courses = calendar_get_default_courses($course2->id);
493
        // Enrolled course only (ignore current).
494
        $this->assertCount(1, $courses);
495
 
496
        // Now, log out and test again.
497
        $this->setUser();
498
 
499
        $CFG->calendar_adminseesall = false;
500
 
501
        $courses = calendar_get_default_courses(null, '*', false, $teacher->id);
502
        // Only enrolled in one course.
503
        $this->assertCount(1, $courses);
504
        $courses = calendar_get_default_courses($course2->id, '*', false, $teacher->id);
505
        // Enrolled course only (ignore current).
506
        $this->assertCount(1, $courses);
507
        // This setting should not affect teachers.
508
        $CFG->calendar_adminseesall = true;
509
        $courses = calendar_get_default_courses(null, '*', false, $teacher->id);
510
        // Only enrolled in one course.
511
        $this->assertCount(1, $courses);
512
        $courses = calendar_get_default_courses($course2->id, '*', false, $teacher->id);
513
        // Enrolled course only (ignore current).
514
        $this->assertCount(1, $courses);
515
 
516
    }
517
 
518
    /**
519
     * Confirm that the skip events flag causes the calendar_get_view function
520
     * to avoid querying for the calendar events.
521
     */
11 efrain 522
    public function test_calendar_get_view_skip_events(): void {
1 efrain 523
        $this->resetAfterTest(true);
524
        $this->setAdminUser();
525
 
526
        $generator = $this->getDataGenerator();
527
        $user = $generator->create_user();
528
        $skipnavigation = true;
529
        $skipevents = true;
530
        $event = create_event([
531
            'eventtype' => 'user',
532
            'userid' => $user->id
533
        ]);
534
 
535
        $this->setUser($user);
536
        $calendar = \calendar_information::create(time() - 10, SITEID, null);
537
 
538
        list($data, $template) = calendar_get_view($calendar, 'day', $skipnavigation, $skipevents);
539
        $this->assertEmpty($data->events);
540
 
541
        $skipevents = false;
542
        list($data, $template) = calendar_get_view($calendar, 'day', $skipnavigation, $skipevents);
543
 
544
        $this->assertEquals($event->id, $data->events[0]->id);
545
    }
546
 
11 efrain 547
    public function test_calendar_get_allowed_event_types_course(): void {
1 efrain 548
        $generator = $this->getDataGenerator();
549
        $user = $generator->create_user();
550
        $course1 = $generator->create_course(); // Has capability.
551
        $course2 = $generator->create_course(); // Doesn't have capability.
552
        $course3 = $generator->create_course(); // Not enrolled.
553
        $context1 = \context_course::instance($course1->id);
554
        $context2 = \context_course::instance($course2->id);
555
        $context3 = \context_course::instance($course3->id);
556
        $roleid = $generator->create_role();
557
        $contexts = [$context1, $context2, $context3];
558
        $enrolledcourses = [$course1, $course2];
559
 
560
        foreach ($enrolledcourses as $course) {
561
            $generator->enrol_user($user->id, $course->id, 'student');
562
        }
563
 
564
        foreach ($contexts as $context) {
565
            $generator->role_assign($roleid, $user->id, $context->id);
566
        }
567
 
568
        $this->setUser($user);
569
 
570
        // In general for all courses, they don't have the ability to add course events yet.
571
        $types = calendar_get_allowed_event_types();
572
        $this->assertFalse($types['course']);
573
 
574
        assign_capability('moodle/calendar:manageentries', CAP_ALLOW, $roleid, $context1, true);
575
        assign_capability('moodle/calendar:manageentries', CAP_PROHIBIT, $roleid, $context2, true);
576
 
577
        // The user only has the correct capability in course 1 so that is the only
578
        // one that should be in the results.
579
        $types = calendar_get_allowed_event_types($course1->id);
580
        $this->assertTrue($types['course']);
581
 
582
        // If calling function without specified course,  there is still a course where they have it.
583
        $types = calendar_get_allowed_event_types();
584
        $this->assertTrue($types['course']);
585
 
586
        assign_capability('moodle/calendar:manageentries', CAP_PROHIBIT, $roleid, $context1, true);
587
 
588
        // The user only now has the correct capability in both course 1 and 2 so we
589
        // expect both to be in the results.
590
        $types = calendar_get_allowed_event_types($course3->id);
591
        $this->assertFalse($types['course']);
592
 
593
        // They now do not have permission in any course.
594
        $types = calendar_get_allowed_event_types();
595
        $this->assertFalse($types['course']);
596
    }
597
 
11 efrain 598
    public function test_calendar_get_allowed_event_types_group_no_acces_to_diff_groups(): void {
1 efrain 599
        $generator = $this->getDataGenerator();
600
        $user = $generator->create_user();
601
        $course = $generator->create_course();
602
        $context = \context_course::instance($course->id);
603
        $roleid = $generator->create_role();
604
 
605
        $generator->enrol_user($user->id, $course->id, 'student');
606
        $generator->role_assign($roleid, $user->id, $context->id);
607
 
608
        $this->setUser($user);
609
 
610
        assign_capability('moodle/calendar:manageentries', CAP_ALLOW, $roleid, $context, true);
611
        assign_capability('moodle/site:accessallgroups', CAP_PROHIBIT, $roleid, $context, true);
612
 
613
        // The user has the correct capability in the course but they aren't a member
614
        // of any of the groups and don't have the accessallgroups capability.
615
        $types = calendar_get_allowed_event_types($course->id);
616
        $this->assertTrue($types['course']);
617
        $this->assertFalse($types['group']);
618
 
619
        // Same result applies when not providing a specific course as they are only on one course.
620
        $types = calendar_get_allowed_event_types();
621
        $this->assertTrue($types['course']);
622
        $this->assertFalse($types['group']);
623
    }
624
 
11 efrain 625
    public function test_calendar_get_allowed_event_types_group_no_groups(): void {
1 efrain 626
        $generator = $this->getDataGenerator();
627
        $user = $generator->create_user();
628
        $course = $generator->create_course();
629
        $context = \context_course::instance($course->id);
630
        $roleid = $generator->create_role();
631
        $generator->enrol_user($user->id, $course->id, 'student');
632
        $generator->role_assign($roleid, $user->id, $context->id);
633
        $this->setUser($user);
634
        assign_capability('moodle/calendar:manageentries', CAP_ALLOW, $roleid, $context, true);
635
        // The user has the correct capability in the course but there are
636
        // no groups so we shouldn't see a group type.
637
        $types = calendar_get_allowed_event_types($course->id);
638
        $this->assertTrue($types['course']);
639
        $this->assertFalse($types['group']);
640
 
641
        // Same result applies when not providing a specific course as they are only on one course.
642
        $types = calendar_get_allowed_event_types();
643
        $this->assertTrue($types['course']);
644
        $this->assertFalse($types['group']);
645
    }
646
 
11 efrain 647
    public function test_calendar_get_allowed_event_types_group_access_all_groups(): void {
1 efrain 648
        $generator = $this->getDataGenerator();
649
        $user = $generator->create_user();
650
        $course1 = $generator->create_course();
651
        $course2 = $generator->create_course();
652
        $generator->create_group(array('courseid' => $course1->id));
653
        $generator->create_group(array('courseid' => $course2->id));
654
        $context1 = \context_course::instance($course1->id);
655
        $context2 = \context_course::instance($course2->id);
656
        $roleid = $generator->create_role();
657
        $generator->enrol_user($user->id, $course1->id, 'student');
658
        $generator->enrol_user($user->id, $course2->id, 'student');
659
        $generator->role_assign($roleid, $user->id, $context1->id);
660
        $generator->role_assign($roleid, $user->id, $context2->id);
661
        $this->setUser($user);
662
        assign_capability('moodle/calendar:manageentries', CAP_ALLOW, $roleid, $context1, true);
663
        assign_capability('moodle/calendar:manageentries', CAP_ALLOW, $roleid, $context2, true);
664
        assign_capability('moodle/site:accessallgroups', CAP_ALLOW, $roleid, $context1, true);
665
        assign_capability('moodle/site:accessallgroups', CAP_ALLOW, $roleid, $context2, true);
666
        // The user has the correct capability in the course and has
667
        // the accessallgroups capability.
668
        $types = calendar_get_allowed_event_types($course1->id);
669
        $this->assertTrue($types['group']);
670
 
671
        // Same result applies when not providing a specific course as they are only on one course.
672
        $types = calendar_get_allowed_event_types();
673
        $this->assertTrue($types['group']);
674
    }
675
 
11 efrain 676
    public function test_calendar_get_allowed_event_types_group_no_access_all_groups(): void {
1 efrain 677
        $generator = $this->getDataGenerator();
678
        $user = $generator->create_user();
679
        $course = $generator->create_course();
680
        $context = \context_course::instance($course->id);
681
        $group1 = $generator->create_group(array('courseid' => $course->id));
682
        $group2 = $generator->create_group(array('courseid' => $course->id));
683
        $roleid = $generator->create_role();
684
        $generator->enrol_user($user->id, $course->id, 'student');
685
        $generator->role_assign($roleid, $user->id, $context->id);
686
        $generator->create_group_member(array('groupid' => $group1->id, 'userid' => $user->id));
687
        $generator->create_group_member(array('groupid' => $group2->id, 'userid' => $user->id));
688
        $this->setUser($user);
689
        assign_capability('moodle/site:accessallgroups', CAP_PROHIBIT, $roleid, $context, true);
690
        // The user has the correct capability in the course but can't access
691
        // groups that they are not a member of.
692
        $types = calendar_get_allowed_event_types($course->id);
693
        $this->assertFalse($types['group']);
694
 
695
        // Same result applies when not providing a specific course as they are only on one course.
696
        $types = calendar_get_allowed_event_types();
697
        $this->assertFalse($types['group']);
698
 
699
        assign_capability('moodle/calendar:manageentries', CAP_ALLOW, $roleid, $context, true);
700
        assign_capability('moodle/site:accessallgroups', CAP_ALLOW, $roleid, $context, true);
701
        $types = calendar_get_allowed_event_types($course->id);
702
        $this->assertTrue($types['group']);
703
 
704
        // Same result applies when not providing a specific course as they are only on one course.
705
        $types = calendar_get_allowed_event_types();
706
        $this->assertTrue($types['group']);
707
    }
708
 
11 efrain 709
    public function test_calendar_get_allowed_event_types_group_cap_no_groups(): void {
1 efrain 710
        $generator = $this->getDataGenerator();
711
        $user = $generator->create_user();
712
        $course = $generator->create_course();
713
        $context = \context_course::instance($course->id);
714
        $roleid = $generator->create_role();
715
        $group = $generator->create_group(['courseid' => $course->id]);
716
        $generator->enrol_user($user->id, $course->id, 'student');
717
        $generator->role_assign($roleid, $user->id, $context->id);
718
        assign_capability('moodle/calendar:managegroupentries', CAP_ALLOW, $roleid, $context, true);
719
 
720
        $this->setUser($user);
721
        $types = calendar_get_allowed_event_types($course->id);
722
        $this->assertFalse($types['course']);
723
        $this->assertFalse($types['group']);
724
 
725
        // Check without specifying a course (same result as user only has one course).
726
        $types = calendar_get_allowed_event_types();
727
        $this->assertFalse($types['course']);
728
        $this->assertFalse($types['group']);
729
    }
730
 
11 efrain 731
    public function test_calendar_get_allowed_event_types_group_cap_has_group(): void {
1 efrain 732
        $generator = $this->getDataGenerator();
733
        $user = $generator->create_user();
734
        $course = $generator->create_course();
735
        $context = \context_course::instance($course->id);
736
        $roleid = $generator->create_role();
737
        $group = $generator->create_group(['courseid' => $course->id]);
738
        $generator->enrol_user($user->id, $course->id, 'student');
739
        $generator->role_assign($roleid, $user->id, $context->id);
740
        groups_add_member($group, $user);
741
        assign_capability('moodle/calendar:managegroupentries', CAP_ALLOW, $roleid, $context, true);
742
 
743
        $this->setUser($user);
744
        $types = calendar_get_allowed_event_types($course->id);
745
        $this->assertFalse($types['course']);
746
        $this->assertTrue($types['group']);
747
 
748
        // Check without specifying a course (same result as user only has one course).
749
        $types = calendar_get_allowed_event_types();
750
        $this->assertFalse($types['course']);
751
        $this->assertTrue($types['group']);
752
    }
753
 
11 efrain 754
    public function test_calendar_get_allowed_event_types_group_cap_access_all_groups(): void {
1 efrain 755
        $generator = $this->getDataGenerator();
756
        $user = $generator->create_user();
757
        $course = $generator->create_course();
758
        $context = \context_course::instance($course->id);
759
        $roleid = $generator->create_role();
760
        $group = $generator->create_group(['courseid' => $course->id]);
761
        $generator->enrol_user($user->id, $course->id, 'student');
762
        $generator->role_assign($roleid, $user->id, $context->id);
763
        assign_capability('moodle/calendar:managegroupentries', CAP_ALLOW, $roleid, $context, true);
764
        assign_capability('moodle/site:accessallgroups', CAP_ALLOW, $roleid, $context, true);
765
 
766
        $this->setUser($user);
767
        $types = calendar_get_allowed_event_types($course->id);
768
        $this->assertFalse($types['course']);
769
        $this->assertTrue($types['group']);
770
 
771
        // Check without specifying a course (same result as user only has one course).
772
        $types = calendar_get_allowed_event_types();
773
        $this->assertFalse($types['course']);
774
        $this->assertTrue($types['group']);
775
    }
776
 
777
    /**
778
     * This is a setup helper function that create some users, courses, groups and group memberships.
779
     * This is useful to prepare the environment for testing the calendar_set_filters function.
780
     *
781
     * @return array An array of ($users, $courses, $coursegroups)
782
     */
783
    protected function setup_test_calendar_set_filters() {
784
        $generator = $this->getDataGenerator();
785
 
786
        // Create some users.
787
        $users = [];
788
        $users[] = $generator->create_user();
789
        $users[] = $generator->create_user();
790
        $users[] = $generator->create_user();
791
 
792
        // Create some courses.
793
        $courses = [];
794
        $courses[] = $generator->create_course();
795
        $courses[] = $generator->create_course();
796
        $courses[] = $generator->create_course();
797
        $courses[] = $generator->create_course();
798
 
799
        // Create some groups.
800
        $coursegroups = [];
801
        $coursegroups[$courses[0]->id] = [];
802
        $coursegroups[$courses[0]->id][] = $generator->create_group(['courseid' => $courses[0]->id]);
803
        $coursegroups[$courses[0]->id][] = $generator->create_group(['courseid' => $courses[0]->id]);
804
        $coursegroups[$courses[2]->id] = [];
805
        $coursegroups[$courses[2]->id][] = $generator->create_group(['courseid' => $courses[2]->id]);
806
        $coursegroups[$courses[2]->id][] = $generator->create_group(['courseid' => $courses[2]->id]);
807
        $coursegroups[$courses[3]->id] = [];
808
        $coursegroups[$courses[3]->id][] = $generator->create_group(['courseid' => $courses[3]->id]);
809
        $coursegroups[$courses[3]->id][] = $generator->create_group(['courseid' => $courses[3]->id]);
810
 
811
        // Create some enrolments and group memberships.
812
        $generator->enrol_user($users[0]->id, $courses[0]->id, 'student');
813
        $generator->create_group_member(['groupid' => $coursegroups[$courses[0]->id][0]->id, 'userid' => $users[0]->id]);
814
        $generator->enrol_user($users[1]->id, $courses[0]->id, 'student');
815
        $generator->create_group_member(['groupid' => $coursegroups[$courses[0]->id][1]->id, 'userid' => $users[1]->id]);
816
        $generator->enrol_user($users[0]->id, $courses[1]->id, 'student');
817
        $generator->enrol_user($users[0]->id, $courses[2]->id, 'student');
818
 
819
        return array($users, $courses, $coursegroups);
820
    }
821
 
822
    /**
823
     * This function tests calendar_set_filters for the case when user is not logged in.
824
     */
11 efrain 825
    public function test_calendar_set_filters_not_logged_in(): void {
1 efrain 826
        $this->resetAfterTest();
827
 
828
        list($users, $courses, $coursegroups) = $this->setup_test_calendar_set_filters();
829
 
830
        $defaultcourses = calendar_get_default_courses(null, '*', false, $users[0]->id);
831
        list($courseids, $groupids, $userid) = calendar_set_filters($defaultcourses);
832
 
833
        $this->assertEqualsCanonicalizing(
834
                [$courses[0]->id, $courses[1]->id, $courses[2]->id, SITEID],
835
                array_values($courseids));
836
        $this->assertFalse($groupids);
837
        $this->assertFalse($userid);
838
    }
839
 
840
    /**
841
     * This function tests calendar_set_filters for the case when no one is logged in, but a user id is provided.
842
     */
11 efrain 843
    public function test_calendar_set_filters_not_logged_in_with_user(): void {
1 efrain 844
        $this->resetAfterTest();
845
 
846
        list($users, $courses, $coursegroups) = $this->setup_test_calendar_set_filters();
847
 
848
        $defaultcourses = calendar_get_default_courses(null, '*', false, $users[1]->id);
849
        list($courseids, $groupids, $userid) = calendar_set_filters($defaultcourses, false, $users[1]);
850
 
851
        $this->assertEquals(array($courses[0]->id, SITEID), array_values($courseids));
852
        $this->assertEquals(array($coursegroups[$courses[0]->id][1]->id), $groupids);
853
        $this->assertEquals($users[1]->id, $userid);
854
 
855
        $defaultcourses = calendar_get_default_courses(null, '*', false, $users[0]->id);
856
        list($courseids, $groupids, $userid) = calendar_set_filters($defaultcourses, false, $users[0]);
857
 
858
        $this->assertEqualsCanonicalizing(
859
                [$courses[0]->id, $courses[1]->id, $courses[2]->id, SITEID],
860
                array_values($courseids));
861
        $this->assertEquals(array($coursegroups[$courses[0]->id][0]->id), $groupids);
862
        $this->assertEquals($users[0]->id, $userid);
863
 
864
    }
865
 
866
    /**
867
     * This function tests calendar_set_filters for the case when user is logged in, but no user id is provided.
868
     */
11 efrain 869
    public function test_calendar_set_filters_logged_in_no_user(): void {
1 efrain 870
        $this->resetAfterTest();
871
 
872
        list($users, $courses, $coursegroups) = $this->setup_test_calendar_set_filters();
873
 
874
        $this->setUser($users[0]);
875
        $defaultcourses = calendar_get_default_courses(null, '*', false, $users[0]->id);
876
        list($courseids, $groupids, $userid) = calendar_set_filters($defaultcourses, false);
877
        $this->assertEqualsCanonicalizing([$courses[0]->id, $courses[1]->id, $courses[2]->id, SITEID], array_values($courseids));
878
        $this->assertEquals(array($coursegroups[$courses[0]->id][0]->id), $groupids);
879
        $this->assertEquals($users[0]->id, $userid);
880
    }
881
 
882
    /**
883
     * This function tests calendar_set_filters for the case when a user is logged in, but another user id is provided.
884
     */
11 efrain 885
    public function test_calendar_set_filters_logged_in_another_user(): void {
1 efrain 886
        $this->resetAfterTest();
887
 
888
        list($users, $courses, $coursegroups) = $this->setup_test_calendar_set_filters();
889
 
890
        $this->setUser($users[0]);
891
        $defaultcourses = calendar_get_default_courses(null, '*', false, $users[1]->id);
892
        list($courseids, $groupids, $userid) = calendar_set_filters($defaultcourses, false, $users[1]);
893
 
894
        $this->assertEquals(array($courses[0]->id, SITEID), array_values($courseids));
895
        $this->assertEquals(array($coursegroups[$courses[0]->id][1]->id), $groupids);
896
        $this->assertEquals($users[1]->id, $userid);
897
    }
898
 
899
    /**
11 efrain 900
     * This function tests calendar_set_filters for courses with separate group mode.
901
     */
902
    public function test_calendar_set_filters_with_separate_group_mode(): void {
903
        global $DB;
904
        $this->resetAfterTest();
905
        $generator = $this->getDataGenerator();
906
 
907
        // Create users.
908
        $student1 = $generator->create_user();
909
        $student2 = $generator->create_user();
910
        $teacher1 = $generator->create_user();
911
        $teacher2 = $generator->create_user();
912
 
913
        // Create courses.
914
        $course1 = $generator->create_course([
915
            'shortname' => 'C1',
916
            'groupmode' => 1,
917
            'groupmodeforce' => 1,
918
        ]);
919
        $course2 = $generator->create_course([
920
            'shortname' => 'C2',
921
            'groupmode' => 1,
922
            'groupmodeforce' => 1,
923
        ]);
924
        $course1context = \context_course::instance($course1->id);
925
        $course2context = \context_course::instance($course2->id);
926
 
927
        // Create groups.
928
        $group1 = $generator->create_group([
929
            'name' => 'G1-C1',
930
            'courseid' => $course1->id,
931
        ]);
932
        $group2 = $generator->create_group([
933
            'name' => 'G1-C2',
934
            'courseid' => $course2->id,
935
        ]);
936
        $group3 = $generator->create_group([
937
            'name' => 'G2-C2',
938
            'courseid' => $course2->id,
939
        ]);
940
 
941
        // Modify the capabilities.
942
        $editingteacherroleid = $DB->get_field('role', 'id', ['shortname' => 'editingteacher']);
943
        assign_capability(
944
            'moodle/site:accessallgroups',
945
            CAP_PREVENT,
946
            $editingteacherroleid,
947
            $course1context->id,
948
            true
949
        );
950
        assign_capability(
951
            'moodle/site:accessallgroups',
952
            CAP_PREVENT,
953
            $editingteacherroleid,
954
            $course2context->id,
955
            true
956
        );
957
 
958
        // Enrol users.
959
        $generator->enrol_user($student1->id, $course1->id, 'student');
960
        $generator->enrol_user($teacher1->id, $course1->id, 'editingteacher');
961
        $generator->enrol_user($student1->id, $course2->id, 'student');
962
        $generator->enrol_user($student2->id, $course2->id, 'student');
963
        $generator->enrol_user($teacher1->id, $course2->id, 'editingteacher');
964
        $generator->enrol_user($teacher2->id, $course2->id, 'editingteacher');
965
 
966
        // Group memberships.
967
        $generator->create_group_member([
968
            'groupid' => $group1->id,
969
            'userid' => $student1->id,
970
        ]);
971
        $generator->create_group_member([
972
            'groupid' => $group1->id,
973
            'userid' => $teacher1->id,
974
        ]);
975
        $generator->create_group_member([
976
            'groupid' => $group2->id,
977
            'userid' => $student1->id,
978
        ]);
979
        $generator->create_group_member([
980
            'groupid' => $group2->id,
981
            'userid' => $teacher1->id,
982
        ]);
983
        $generator->create_group_member([
984
            'groupid' => $group3->id,
985
            'userid' => $student2->id,
986
        ]);
987
        $generator->create_group_member([
988
            'groupid' => $group3->id,
989
            'userid' => $teacher2->id,
990
        ]);
991
 
992
        // Test teacher1.
993
        $this->setUser($teacher1);
994
        $defaultcourses = calendar_get_default_courses(
995
            null,
996
            '*',
997
            false,
998
            $teacher1->id
999
        );
1000
        [$courseids, $groupids] = calendar_set_filters(
1001
            $defaultcourses,
1002
            false,
1003
            $teacher1
1004
        );
1005
        // Teacher1 can see SITE, C1, G1-C1, C2, G1-C2.
1006
        $this->assertCount(3, $courseids); // SITE, C1, C2.
1007
        $this->assertCount(2, $groupids); // G1-C1, G1-C2.
1008
 
1009
        $courseidskey = array_fill_keys($courseids, null);
1010
        $this->assertArrayHasKey(SITEID, $courseidskey);
1011
        $this->assertArrayHasKey($course1->id, $courseidskey);
1012
        $this->assertArrayHasKey($course2->id, $courseidskey);
1013
 
1014
        $groupidskey = array_fill_keys($groupids, null);
1015
        $this->assertArrayHasKey($group1->id, $groupidskey);
1016
        $this->assertArrayHasKey($group2->id, $groupidskey);
1017
        $this->assertArrayNotHasKey($group3->id, $groupidskey);
1018
 
1019
        // Test teacher2.
1020
        $this->setUser($teacher2);
1021
        $defaultcourses = calendar_get_default_courses(
1022
            null,
1023
            '*',
1024
            false,
1025
            $teacher2->id
1026
        );
1027
        [$courseids, $groupids] = calendar_set_filters(
1028
            $defaultcourses,
1029
            false,
1030
            $teacher2
1031
        );
1032
        // Teacher2 can see SITE, C2, G2-C2.
1033
        $this->assertCount(2, $courseids); // SITE, C2.
1034
        $this->assertCount(1, $groupids); // G2-C2.
1035
 
1036
        $courseidskey = array_fill_keys($courseids, null);
1037
        $this->assertArrayHasKey(SITEID, $courseidskey);
1038
        $this->assertArrayHasKey($course2->id, $courseidskey);
1039
 
1040
        $groupidskey = array_fill_keys($groupids, null);
1041
        $this->assertArrayHasKey($group3->id, $groupidskey);
1042
        $this->assertArrayNotHasKey($group1->id, $groupidskey);
1043
        $this->assertArrayNotHasKey($group2->id, $groupidskey);
1044
 
1045
        // Modify the capabilities.
1046
        assign_capability(
1047
            'moodle/site:accessallgroups',
1048
            CAP_ALLOW,
1049
            $editingteacherroleid,
1050
            $course2context->id,
1051
            true
1052
        );
1053
 
1054
        $defaultcourses = calendar_get_default_courses(
1055
            null,
1056
            '*',
1057
            false,
1058
            $teacher2->id
1059
        );
1060
        [$courseids, $groupids] = calendar_set_filters(
1061
            $defaultcourses,
1062
            false,
1063
            $teacher2
1064
        );
1065
        // Teacher2 can see SITE, C2, G1-C2, G2-C2.
1066
        $this->assertCount(2, $courseids); // SITE, C2.
1067
        $this->assertCount(2, $groupids); // G1-C2, G2-C2.
1068
 
1069
        $groupidskey = array_fill_keys($groupids, null);
1070
        $this->assertArrayHasKey($group2->id, $groupidskey);
1071
        $this->assertArrayHasKey($group3->id, $groupidskey);
1072
        $this->assertArrayNotHasKey($group1->id, $groupidskey);
1073
    }
1074
 
1075
    /**
1 efrain 1076
     *  Test for calendar_view_event_allowed for course event types.
1077
     */
11 efrain 1078
    public function test_calendar_view_event_allowed_course_event(): void {
1 efrain 1079
        global $USER;
1080
 
1081
        $this->setAdminUser();
1082
 
1083
        $generator = $this->getDataGenerator();
1084
 
1085
        // A student in a course.
1086
        $student = $generator->create_user();
1087
        // Some user not enrolled in any course.
1088
        $someuser = $generator->create_user();
1089
 
1090
        // A course with manual enrolments.
1091
        $manualcourse = $generator->create_course();
1092
 
1093
        // Enrol the student to the manual enrolment course.
1094
        $generator->enrol_user($student->id, $manualcourse->id);
1095
 
1096
        // A course that allows guest access.
1097
        $guestcourse = $generator->create_course(
1098
            (object)[
1099
                'shortname' => 'guestcourse',
1100
                'enrol_guest_status_0' => ENROL_INSTANCE_ENABLED,
1101
                'enrol_guest_password_0' => ''
1102
            ]);
1103
 
1104
        $manualevent = (object)[
1105
            'name' => 'Manual course event',
1106
            'description' => '',
1107
            'format' => 1,
1108
            'categoryid' => 0,
1109
            'courseid' => $manualcourse->id,
1110
            'groupid' => 0,
1111
            'userid' => $USER->id,
1112
            'modulename' => 0,
1113
            'instance' => 0,
1114
            'eventtype' => 'course',
1115
            'timestart' => time(),
1116
            'timeduration' => 86400,
1117
            'visible' => 1
1118
        ];
1119
        $caleventmanual = \calendar_event::create($manualevent, false);
1120
 
1121
        // Create a course event for the course with guest access.
1122
        $guestevent = clone $manualevent;
1123
        $guestevent->name = 'Guest course event';
1124
        $guestevent->courseid = $guestcourse->id;
1125
        $caleventguest = \calendar_event::create($guestevent, false);
1126
 
1127
        // Viewing as admin.
1128
        $this->assertTrue(calendar_view_event_allowed($caleventmanual));
1129
        $this->assertTrue(calendar_view_event_allowed($caleventguest));
1130
 
1131
        // Viewing as someone enrolled in a course.
1132
        $this->setUser($student);
1133
        $this->assertTrue(calendar_view_event_allowed($caleventmanual));
1134
 
1135
        // Viewing as someone not enrolled in any course.
1136
        $this->setUser($someuser);
1137
        // Viewing as someone not enrolled in a course without guest access on.
1138
        $this->assertFalse(calendar_view_event_allowed($caleventmanual));
1139
        // Viewing as someone not enrolled in a course with guest access on.
1140
        $this->assertTrue(calendar_view_event_allowed($caleventguest));
1141
    }
1142
 
1143
    /**
1144
     *  Test for calendar_get_export_token for current user.
1145
     */
11 efrain 1146
    public function test_calendar_get_export_token_for_current_user(): void {
1 efrain 1147
        global $USER, $DB, $CFG;
1148
 
1149
        $this->setAdminUser();
1150
 
1151
        // Get my token.
1152
        $authtoken = calendar_get_export_token($USER);
1153
        $expected = sha1($USER->id . $DB->get_field('user', 'password', ['id' => $USER->id]) . $CFG->calendar_exportsalt);
1154
 
1155
        $this->assertEquals($expected, $authtoken);
1156
    }
1157
 
1158
    /**
1159
     *  Test for calendar_get_export_token for another user.
1160
     */
11 efrain 1161
    public function test_calendar_get_export_token_for_another_user(): void {
1 efrain 1162
        global $CFG;
1163
 
1164
        // Get any user token.
1165
        $generator = $this->getDataGenerator();
1166
        $user = $generator->create_user();
1167
 
1168
        // Get other user token.
1169
        $authtoken = calendar_get_export_token($user);
1170
        $expected = sha1($user->id . $user->password . $CFG->calendar_exportsalt);
1171
 
1172
        $this->assertEquals($expected, $authtoken);
1173
    }
1174
 
1175
    /**
1176
     *  Test calendar_can_manage_user_event for different users.
1177
     *
1178
     * @covers ::calendar_can_manage_user_event
1179
     */
11 efrain 1180
    public function test_calendar_can_manage_user_event(): void {
1 efrain 1181
        global $DB, $USER;
1182
        $generator = $this->getDataGenerator();
1183
        $sitecontext = \context_system::instance();
1184
        $this->resetAfterTest();
1185
        $this->setAdminUser();
1186
        $user1 = $generator->create_user();
1187
        $user2 = $generator->create_user();
1188
        $adminevent = create_event([
1189
            'eventtype' => 'user',
1190
            'userid' => $USER->id,
1191
        ]);
1192
 
1193
        $this->setUser($user1);
1194
        $user1event = create_event([
1195
            'name' => 'user1 event',
1196
            'eventtype' => 'user',
1197
            'userid' => $user1->id,
1198
        ]);
1199
        $this->setUser($user2);
1200
        $user2event = create_event([
1201
            'name' => 'user2 event',
1202
            'eventtype' => 'user',
1203
            'userid' => $user2->id,
1204
        ]);
1205
        $this->setUser($user1);
1206
        $result = calendar_can_manage_user_event($user1event);
1207
        $this->assertEquals(true, $result);
1208
        $result = calendar_can_manage_user_event($user2event);
1209
        $this->assertEquals(false, $result);
1210
 
1211
        $sitemanager = $generator->create_user();
1212
 
1213
        $managerroleid = $DB->get_field('role', 'id', ['shortname' => 'manager']);
1214
        role_assign($managerroleid, $sitemanager->id, $sitecontext->id);
1215
 
1216
        $this->setUser($sitemanager);
1217
 
1218
        $result = calendar_can_manage_user_event($user1event);
1219
        $this->assertEquals(true, $result);
1220
        $result = calendar_can_manage_user_event($adminevent);
1221
        $this->assertEquals(false, $result);
1222
    }
1223
 
1224
    /**
1225
     * Data provider for {@see test_calendar_format_event_location}
1226
     *
1227
     * @return array[]
1228
     */
1229
    public function calendar_format_event_location_provider(): array {
1230
        return [
1231
            'Empty' => ['', ''],
1232
            'Text' => ['Barcelona', 'Barcelona'],
1233
            'Link (http)' => ['http://example.com', '<a title=".*" href="http://example.com">http://example.com</a>'],
1234
            'Link (https)' => ['https://example.com', '<a title=".*" href="https://example.com">https://example.com</a>'],
1235
        ];
1236
    }
1237
 
1238
    /**
1239
     * Test formatting event location
1240
     *
1241
     * @param string $location
1242
     * @param string $expectedpattern
1243
     *
1244
     * @covers ::calendar_format_event_location
1245
     * @dataProvider calendar_format_event_location_provider
1246
     */
1247
    public function test_calendar_format_event_location(string $location, string $expectedpattern): void {
1248
        $this->resetAfterTest();
1249
        $this->setAdminUser();
1250
 
1251
        $event = create_event(['location' => $location]);
1252
        $this->assertMatchesRegularExpression("|^({$expectedpattern})$|", calendar_format_event_location($event));
1253
    }
1254
}