PageRenderTime 40ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/calendar/tests/raw_event_retrieval_strategy_test.php

https://gitlab.com/unofficial-mirrors/moodle
PHP | 345 lines | 251 code | 40 blank | 54 comment | 1 complexity | a080146daa12f16e6bb136ea139c7c09 MD5 | raw file
  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. * Raw event retrieval strategy tests.
  18. *
  19. * @package core_calendar
  20. * @copyright 2017 Cameron Ball <cameron@cameron1729.xyz>
  21. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  22. */
  23. defined('MOODLE_INTERNAL') || die();
  24. global $CFG;
  25. require_once($CFG->dirroot . '/calendar/tests/helpers.php');
  26. use core_calendar\local\event\strategies\raw_event_retrieval_strategy;
  27. /**
  28. * Raw event retrieval strategy testcase.
  29. *
  30. * @copyright 2017 Cameron Ball <cameron@cameron1729.xyz>
  31. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  32. */
  33. class core_calendar_raw_event_retrieval_strategy_testcase extends advanced_testcase {
  34. /**
  35. * Test retrieval strategy when module is disabled.
  36. */
  37. public function test_get_raw_events_with_disabled_module() {
  38. global $DB;
  39. $this->resetAfterTest();
  40. $retrievalstrategy = new raw_event_retrieval_strategy();
  41. $generator = $this->getDataGenerator();
  42. $course = $generator->create_course();
  43. $student = $generator->create_user();
  44. $generator->enrol_user($student->id, $course->id, 'student');
  45. $this->setUser($student);
  46. $events = [
  47. [
  48. 'name' => 'Start of assignment',
  49. 'description' => '',
  50. 'format' => 1,
  51. 'courseid' => $course->id,
  52. 'groupid' => 0,
  53. 'userid' => 2,
  54. 'modulename' => 'assign',
  55. 'instance' => 1,
  56. 'eventtype' => 'due',
  57. 'timestart' => time(),
  58. 'timeduration' => 86400,
  59. 'visible' => 1
  60. ], [
  61. 'name' => 'Start of lesson',
  62. 'description' => '',
  63. 'format' => 1,
  64. 'courseid' => $course->id,
  65. 'groupid' => 0,
  66. 'userid' => 2,
  67. 'modulename' => 'lesson',
  68. 'instance' => 1,
  69. 'eventtype' => 'end',
  70. 'timestart' => time(),
  71. 'timeduration' => 86400,
  72. 'visible' => 1
  73. ]
  74. ];
  75. foreach ($events as $event) {
  76. calendar_event::create($event, false);
  77. }
  78. // Get all events.
  79. $events = $retrievalstrategy->get_raw_events(null, [0], null);
  80. $this->assertCount(2, $events);
  81. // Disable the lesson module.
  82. $modulerecord = $DB->get_record('modules', ['name' => 'lesson']);
  83. $modulerecord->visible = 0;
  84. $DB->update_record('modules', $modulerecord);
  85. // Check that we only return the assign event.
  86. $events = $retrievalstrategy->get_raw_events(null, [0], null);
  87. $this->assertCount(1, $events);
  88. $event = reset($events);
  89. $this->assertEquals('assign', $event->modulename);
  90. }
  91. /**
  92. * Test retrieval strategy when there are overrides.
  93. */
  94. public function test_get_raw_event_strategy_with_overrides() {
  95. $this->resetAfterTest();
  96. $retrievalstrategy = new raw_event_retrieval_strategy();
  97. $generator = $this->getDataGenerator();
  98. $course = $generator->create_course();
  99. $plugingenerator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
  100. $instance = $plugingenerator->create_instance(['course' => $course->id]);
  101. // Create users.
  102. $useroverridestudent = $generator->create_user();
  103. $group1student = $generator->create_user();
  104. $group2student = $generator->create_user();
  105. $group12student = $generator->create_user();
  106. $nogroupstudent = $generator->create_user();
  107. // Enrol users.
  108. $generator->enrol_user($useroverridestudent->id, $course->id, 'student');
  109. $generator->enrol_user($group1student->id, $course->id, 'student');
  110. $generator->enrol_user($group2student->id, $course->id, 'student');
  111. $generator->enrol_user($group12student->id, $course->id, 'student');
  112. $generator->enrol_user($nogroupstudent->id, $course->id, 'student');
  113. // Create groups.
  114. $group1 = $generator->create_group(['courseid' => $course->id, 'name' => 'Group 1']);
  115. $group2 = $generator->create_group(['courseid' => $course->id, 'name' => 'Group 2']);
  116. // Add members to groups.
  117. $generator->create_group_member(['groupid' => $group1->id, 'userid' => $group1student->id]);
  118. $generator->create_group_member(['groupid' => $group2->id, 'userid' => $group2student->id]);
  119. $generator->create_group_member(['groupid' => $group1->id, 'userid' => $group12student->id]);
  120. $generator->create_group_member(['groupid' => $group2->id, 'userid' => $group12student->id]);
  121. $now = time();
  122. // Events with the same module name, instance and event type.
  123. $events = [
  124. [
  125. 'name' => 'Assignment 1 due date',
  126. 'description' => '',
  127. 'format' => 0,
  128. 'courseid' => $course->id,
  129. 'groupid' => 0,
  130. 'userid' => 2,
  131. 'modulename' => 'assign',
  132. 'instance' => $instance->id,
  133. 'eventtype' => 'due',
  134. 'timestart' => $now,
  135. 'timeduration' => 0,
  136. 'visible' => 1
  137. ], [
  138. 'name' => 'Assignment 1 due date - User override',
  139. 'description' => '',
  140. 'format' => 1,
  141. 'courseid' => 0,
  142. 'groupid' => 0,
  143. 'userid' => $useroverridestudent->id,
  144. 'modulename' => 'assign',
  145. 'instance' => $instance->id,
  146. 'eventtype' => 'due',
  147. 'timestart' => $now + 86400,
  148. 'timeduration' => 0,
  149. 'visible' => 1,
  150. 'priority' => CALENDAR_EVENT_USER_OVERRIDE_PRIORITY
  151. ], [
  152. 'name' => 'Assignment 1 due date - Group A override',
  153. 'description' => '',
  154. 'format' => 1,
  155. 'courseid' => $course->id,
  156. 'groupid' => $group1->id,
  157. 'userid' => 2,
  158. 'modulename' => 'assign',
  159. 'instance' => $instance->id,
  160. 'eventtype' => 'due',
  161. 'timestart' => $now + (2 * 86400),
  162. 'timeduration' => 0,
  163. 'visible' => 1,
  164. 'priority' => 1,
  165. ], [
  166. 'name' => 'Assignment 1 due date - Group B override',
  167. 'description' => '',
  168. 'format' => 1,
  169. 'courseid' => $course->id,
  170. 'groupid' => $group2->id,
  171. 'userid' => 2,
  172. 'modulename' => 'assign',
  173. 'instance' => $instance->id,
  174. 'eventtype' => 'due',
  175. 'timestart' => $now + (3 * 86400),
  176. 'timeduration' => 0,
  177. 'visible' => 1,
  178. 'priority' => 2,
  179. ],
  180. ];
  181. foreach ($events as $event) {
  182. calendar_event::create($event, false);
  183. }
  184. $timestart = $now - 100;
  185. $timeend = $now + (3 * 86400);
  186. $groups = [$group1->id, $group2->id];
  187. // Get user override events.
  188. $this->setUser($useroverridestudent);
  189. $events = $retrievalstrategy->get_raw_events([$useroverridestudent->id], $groups, [$course->id]);
  190. $this->assertCount(1, $events);
  191. $event = reset($events);
  192. $this->assertEquals('Assignment 1 due date - User override', $event->name);
  193. // Get events for user that does not belong to any group and has no user override events.
  194. $this->setUser($nogroupstudent);
  195. $events = $retrievalstrategy->get_raw_events([$nogroupstudent->id], $groups, [$course->id]);
  196. $this->assertCount(1, $events);
  197. $event = reset($events);
  198. $this->assertEquals('Assignment 1 due date', $event->name);
  199. // Get events for user that belongs to groups A and B and has no user override events.
  200. $this->setUser($group12student);
  201. $events = $retrievalstrategy->get_raw_events([$group12student->id], $groups, [$course->id]);
  202. $this->assertCount(1, $events);
  203. $event = reset($events);
  204. $this->assertEquals('Assignment 1 due date - Group A override', $event->name);
  205. // Get events for user that belongs to group A and has no user override events.
  206. $this->setUser($group1student);
  207. $events = $retrievalstrategy->get_raw_events([$group1student->id], $groups, [$course->id]);
  208. $this->assertCount(1, $events);
  209. $event = reset($events);
  210. $this->assertEquals('Assignment 1 due date - Group A override', $event->name);
  211. // Add repeating events.
  212. $repeatingevents = [
  213. [
  214. 'name' => 'Repeating site event',
  215. 'description' => '',
  216. 'format' => 1,
  217. 'courseid' => SITEID,
  218. 'groupid' => 0,
  219. 'userid' => 2,
  220. 'repeatid' => 1,
  221. 'modulename' => '0',
  222. 'instance' => 0,
  223. 'eventtype' => 'site',
  224. 'timestart' => $now + 86400,
  225. 'timeduration' => 0,
  226. 'visible' => 1,
  227. ],
  228. [
  229. 'name' => 'Repeating site event',
  230. 'description' => '',
  231. 'format' => 1,
  232. 'courseid' => SITEID,
  233. 'groupid' => 0,
  234. 'userid' => 2,
  235. 'repeatid' => 1,
  236. 'modulename' => '0',
  237. 'instance' => 0,
  238. 'eventtype' => 'site',
  239. 'timestart' => $now + (2 * 86400),
  240. 'timeduration' => 0,
  241. 'visible' => 1,
  242. ],
  243. ];
  244. foreach ($repeatingevents as $event) {
  245. calendar_event::create($event, false);
  246. }
  247. // Make sure repeating events are not filtered out.
  248. $events = $retrievalstrategy->get_raw_events();
  249. $this->assertCount(3, $events);
  250. }
  251. /**
  252. * Test retrieval strategy with category specifications.
  253. */
  254. public function test_get_raw_events_category() {
  255. global $DB;
  256. $this->resetAfterTest();
  257. $retrievalstrategy = new raw_event_retrieval_strategy();
  258. $generator = $this->getDataGenerator();
  259. $category1 = $generator->create_category();
  260. $category2 = $generator->create_category();
  261. $events = [
  262. [
  263. 'name' => 'E1',
  264. 'eventtype' => 'category',
  265. 'description' => '',
  266. 'format' => 1,
  267. 'categoryid' => $category1->id,
  268. 'userid' => 2,
  269. 'timestart' => time(),
  270. ],
  271. [
  272. 'name' => 'E2',
  273. 'eventtype' => 'category',
  274. 'description' => '',
  275. 'format' => 1,
  276. 'categoryid' => $category2->id,
  277. 'userid' => 2,
  278. 'timestart' => time() + 1,
  279. ],
  280. ];
  281. foreach ($events as $event) {
  282. calendar_event::create($event, false);
  283. }
  284. // Get all events.
  285. $events = $retrievalstrategy->get_raw_events(null, null, null, null);
  286. $this->assertCount(2, $events);
  287. $event = array_shift($events);
  288. $this->assertEquals('E1', $event->name);
  289. $event = array_shift($events);
  290. $this->assertEquals('E2', $event->name);
  291. // Get events for C1 events.
  292. $events = $retrievalstrategy->get_raw_events(null, null, null, [$category1->id]);
  293. $this->assertCount(1, $events);
  294. $event = array_shift($events);
  295. $this->assertEquals('E1', $event->name);
  296. // Get events for C2 events.
  297. $events = $retrievalstrategy->get_raw_events(null, null, null, [$category2->id]);
  298. $this->assertCount(1, $events);
  299. $event = array_shift($events);
  300. $this->assertEquals('E2', $event->name);
  301. // Get events for several categories.
  302. $events = $retrievalstrategy->get_raw_events(null, null, null, [$category1->id, $category2->id]);
  303. $this->assertCount(2, $events);
  304. }
  305. }