MDL-78962 core/loadingicon: remove jQuery requirement in the API
[moodle.git] / calendar / tests / event_factory_test.php
blob52ef17fa40c4f08141c0e113a8646d371450024d
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.
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/>.
17 namespace core_calendar;
19 use core_calendar\local\event\factories\event_factory;
20 use core_calendar\local\event\entities\event_interface;
22 defined('MOODLE_INTERNAL') || die();
24 global $CFG;
25 require_once($CFG->dirroot . '/calendar/lib.php');
27 /**
28 * Event factory test.
30 * @package core_calendar
31 * @copyright 2017 Cameron Ball <cameron@cameron1729.xyz>
32 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
34 class event_factory_test extends \advanced_testcase {
35 /**
36 * Test event class getters.
38 * @dataProvider create_instance_testcases()
39 * @param \stdClass $dbrow Row from the event table.
40 * @param callable $actioncallbackapplier Action callback applier.
41 * @param callable $visibilitycallbackapplier Visibility callback applier.
42 * @param callable $bailoutcheck Early bail out check function.
43 * @param string $expectedclass Class the factory is expected to produce.
44 * @param mixed $expectedattributevalue Expected value of the modified attribute.
46 public function test_create_instance(
47 $dbrow,
48 callable $actioncallbackapplier,
49 callable $visibilitycallbackapplier,
50 callable $bailoutcheck,
51 $expectedclass,
52 $expectedattributevalue
53 ) {
54 $this->resetAfterTest(true);
55 $this->setAdminUser();
56 $event = $this->create_event();
57 $coursecache = [];
58 $modulecache = [];
59 $factory = new event_factory(
60 $actioncallbackapplier,
61 $visibilitycallbackapplier,
62 $bailoutcheck,
63 $coursecache,
64 $modulecache
66 $dbrow->id = $event->id;
67 $instance = $factory->create_instance($dbrow);
69 if ($expectedclass) {
70 $this->assertInstanceOf($expectedclass, $instance);
73 if (is_null($expectedclass)) {
74 $this->assertNull($instance);
77 if ($expectedattributevalue) {
78 $this->assertEquals(
79 $instance->get_description()->get_value(),
80 $expectedattributevalue
85 /**
86 * Test invalid callback exception.
88 public function test_invalid_action_callback() {
89 $this->resetAfterTest(true);
90 $this->setAdminUser();
91 $event = $this->create_event();
92 $coursecache = [];
93 $modulecache = [];
94 $factory = new event_factory(
95 function () {
96 return 'hello';
98 function () {
99 return true;
101 function () {
102 return false;
104 $coursecache,
105 $modulecache
108 $this->expectException('\core_calendar\local\event\exceptions\invalid_callback_exception');
109 $factory->create_instance(
110 (object)[
111 'id' => $event->id,
112 'name' => 'test',
113 'description' => 'Test description',
114 'format' => 2,
115 'categoryid' => 0,
116 'courseid' => 1,
117 'groupid' => 1,
118 'userid' => 1,
119 'repeatid' => 0,
120 'modulename' => 'assign',
121 'instance' => 1,
122 'eventtype' => 'due',
123 'type' => CALENDAR_EVENT_TYPE_ACTION,
124 'timestart' => 123456789,
125 'timeduration' => 12,
126 'timemodified' => 123456789,
127 'timesort' => 123456789,
128 'visible' => 1,
129 'subscriptionid' => 1,
130 'location' => 'Test location',
136 * Test invalid callback exception.
138 public function test_invalid_visibility_callback() {
139 $this->resetAfterTest(true);
140 $this->setAdminUser();
141 $event = $this->create_event();
142 $coursecache = [];
143 $modulecache = [];
144 $factory = new event_factory(
145 function ($event) {
146 return $event;
148 function () {
149 return 'asdf';
151 function () {
152 return false;
154 $coursecache,
155 $modulecache
158 $this->expectException('\core_calendar\local\event\exceptions\invalid_callback_exception');
159 $factory->create_instance(
160 (object)[
161 'id' => $event->id,
162 'name' => 'test',
163 'description' => 'Test description',
164 'format' => 2,
165 'categoryid' => 0,
166 'courseid' => 1,
167 'groupid' => 1,
168 'userid' => 1,
169 'repeatid' => 0,
170 'modulename' => 'assign',
171 'instance' => 1,
172 'eventtype' => 'due',
173 'type' => CALENDAR_EVENT_TYPE_ACTION,
174 'timestart' => 123456789,
175 'timeduration' => 12,
176 'timemodified' => 123456789,
177 'timesort' => 123456789,
178 'visible' => 1,
179 'subscriptionid' => 1,
180 'location' => 'Test location',
186 * Test invalid callback exception.
188 public function test_invalid_bail_callback() {
189 $this->resetAfterTest(true);
190 $this->setAdminUser();
191 $event = $this->create_event();
192 $coursecache = [];
193 $modulecache = [];
194 $factory = new event_factory(
195 function ($event) {
196 return $event;
198 function () {
199 return true;
201 function () {
202 return 'asdf';
204 $coursecache,
205 $modulecache
208 $this->expectException('\core_calendar\local\event\exceptions\invalid_callback_exception');
209 $factory->create_instance(
210 (object)[
211 'id' => $event->id,
212 'name' => 'test',
213 'description' => 'Test description',
214 'format' => 2,
215 'categoryid' => 0,
216 'courseid' => 1,
217 'groupid' => 1,
218 'userid' => 1,
219 'repeatid' => 0,
220 'modulename' => 'assign',
221 'instance' => 1,
222 'eventtype' => 'due',
223 'type' => CALENDAR_EVENT_TYPE_ACTION,
224 'timestart' => 123456789,
225 'timeduration' => 12,
226 'timemodified' => 123456789,
227 'timesort' => 123456789,
228 'visible' => 1,
229 'subscriptionid' => 1,
230 'location' => 'Test location',
236 * Test the factory's course cache.
238 public function test_course_cache() {
239 $this->resetAfterTest(true);
240 $this->setAdminUser();
241 $course = self::getDataGenerator()->create_course();
242 $event = $this->create_event(['courseid' => $course->id]);
243 $coursecache = [];
244 $modulecache = [];
245 $factory = new event_factory(
246 function ($event) {
247 return $event;
249 function () {
250 return true;
252 function () {
253 return false;
255 $coursecache,
256 $modulecache
259 $instance = $factory->create_instance(
260 (object)[
261 'id' => $event->id,
262 'name' => 'test',
263 'description' => 'Test description',
264 'format' => 2,
265 'categoryid' => 0,
266 'courseid' => $course->id,
267 'groupid' => 1,
268 'userid' => 1,
269 'repeatid' => 0,
270 'modulename' => 'assign',
271 'instance' => 1,
272 'eventtype' => 'due',
273 'type' => CALENDAR_EVENT_TYPE_ACTION,
274 'timestart' => 123456789,
275 'timeduration' => 12,
276 'timemodified' => 123456789,
277 'timesort' => 123456789,
278 'visible' => 1,
279 'subscriptionid' => 1,
280 'location' => 'Test location',
284 $instance->get_course()->get('fullname');
285 $this->assertArrayHasKey($course->id, $coursecache);
289 * Test the factory's module cache.
291 public function test_module_cache() {
292 $this->resetAfterTest(true);
293 $this->setAdminUser();
294 $course = self::getDataGenerator()->create_course();
295 $event = $this->create_event(['courseid' => $course->id]);
296 $plugingenerator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
297 $assigninstance = $plugingenerator->create_instance(['course' => $course->id]);
299 $coursecache = [];
300 $modulecache = [];
301 $factory = new event_factory(
302 function ($event) {
303 return $event;
305 function () {
306 return true;
308 function () {
309 return false;
311 $coursecache,
312 $modulecache
315 $instance = $factory->create_instance(
316 (object)[
317 'id' => $event->id,
318 'name' => 'test',
319 'description' => 'Test description',
320 'format' => 2,
321 'categoryid' => 0,
322 'courseid' => 0,
323 'groupid' => 1,
324 'userid' => 1,
325 'repeatid' => 0,
326 'modulename' => 'assign',
327 'instance' => $assigninstance->id,
328 'eventtype' => 'due',
329 'type' => CALENDAR_EVENT_TYPE_ACTION,
330 'timestart' => 123456789,
331 'timeduration' => 12,
332 'timemodified' => 123456789,
333 'timesort' => 123456789,
334 'visible' => 1,
335 'subscriptionid' => 1,
336 'location' => 'Test location',
340 $instance->get_course_module()->get('course');
341 $this->assertArrayHasKey('assign' . '_' . $assigninstance->id, $modulecache);
345 * Testcases for the create instance test.
347 * @return array Array of testcases.
349 public function create_instance_testcases() {
350 return [
351 'Sample event record with event exposed' => [
352 'dbrow' => (object)[
353 'name' => 'Test event',
354 'description' => 'Hello',
355 'format' => 1,
356 'categoryid' => 0,
357 'courseid' => 1,
358 'groupid' => 1,
359 'userid' => 1,
360 'repeatid' => 0,
361 'modulename' => 'Test module',
362 'instance' => 1,
363 'eventtype' => 'Due',
364 'type' => CALENDAR_EVENT_TYPE_ACTION,
365 'timestart' => 123456789,
366 'timeduration' => 123456789,
367 'timemodified' => 123456789,
368 'timesort' => 123456789,
369 'visible' => true,
370 'subscriptionid' => 1,
371 'location' => 'Test location',
373 'actioncallbackapplier' => function(event_interface $event) {
374 return $event;
376 'visibilitycallbackapplier' => function(event_interface $event) {
377 return true;
379 'bailoutcheck' => function() {
380 return false;
382 event_interface::class,
383 'Hello'
385 'Sample event record with event hidden' => [
386 'dbrow' => (object)[
387 'name' => 'Test event',
388 'description' => 'Hello',
389 'format' => 1,
390 'categoryid' => 0,
391 'courseid' => 1,
392 'groupid' => 1,
393 'userid' => 1,
394 'repeatid' => 0,
395 'modulename' => 'Test module',
396 'instance' => 1,
397 'eventtype' => 'Due',
398 'type' => CALENDAR_EVENT_TYPE_ACTION,
399 'timestart' => 123456789,
400 'timeduration' => 123456789,
401 'timemodified' => 123456789,
402 'timesort' => 123456789,
403 'visible' => true,
404 'subscriptionid' => 1,
405 'location' => 'Test location',
407 'actioncallbackapplier' => function(event_interface $event) {
408 return $event;
410 'visibilitycallbackapplier' => function(event_interface $event) {
411 return false;
413 'bailoutcheck' => function() {
414 return false;
416 null,
417 null
419 'Sample event record with early bail' => [
420 'dbrow' => (object)[
421 'name' => 'Test event',
422 'description' => 'Hello',
423 'format' => 1,
424 'categoryid' => 0,
425 'courseid' => 1,
426 'groupid' => 1,
427 'userid' => 1,
428 'repeatid' => 0,
429 'modulename' => 'Test module',
430 'instance' => 1,
431 'eventtype' => 'Due',
432 'type' => CALENDAR_EVENT_TYPE_ACTION,
433 'timestart' => 123456789,
434 'timeduration' => 123456789,
435 'timemodified' => 123456789,
436 'timesort' => 123456789,
437 'visible' => true,
438 'subscriptionid' => 1,
439 'location' => 'Test location',
441 'actioncallbackapplier' => function(event_interface $event) {
442 return $event;
444 'visibilitycallbackapplier' => function(event_interface $event) {
445 return true;
447 'bailoutcheck' => function() {
448 return true;
450 null,
451 null
457 * Helper function to create calendar events using the old code.
459 * @param array $properties A list of calendar event properties to set
460 * @return calendar_event
462 protected function create_event($properties = []) {
463 $record = new \stdClass();
464 $record->name = 'event name';
465 $record->eventtype = 'site';
466 $record->timestart = time();
467 $record->timeduration = 0;
468 $record->timesort = 0;
469 $record->type = 1;
470 $record->courseid = 0;
471 $record->categoryid = 0;
473 foreach ($properties as $name => $value) {
474 $record->$name = $value;
477 $event = new \calendar_event($record);
478 return $event->create($record, false);