PageRenderTime 44ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/tests/event_profile_field_test.php

https://gitlab.com/unofficial-mirrors/moodle
PHP | 393 lines | 238 code | 58 blank | 97 comment | 1 complexity | 6a812a14471d3a323abdf34003e2eb6a 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. * Tests the events related to the user profile fields and categories.
  18. *
  19. * @package core
  20. * @category test
  21. * @copyright 2017 Mark Nelson <markn@moodle.com>
  22. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23. */
  24. defined('MOODLE_INTERNAL') || die();
  25. global $CFG;
  26. require_once($CFG->dirroot . '/user/profile/definelib.php');
  27. /**
  28. * Tests the events related to the user profile fields and categories.
  29. *
  30. * @package core
  31. * @category test
  32. * @copyright 2017 Mark Nelson <markn@moodle.com>
  33. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  34. */
  35. class core_event_profile_field_testcase extends advanced_testcase {
  36. /**
  37. * Test set up.
  38. */
  39. public function setUp() {
  40. $this->resetAfterTest();
  41. }
  42. /**
  43. * Test that triggering the user_info_category_created event works as expected.
  44. */
  45. public function test_user_info_category_created_event() {
  46. global $DB;
  47. // Create a new profile category.
  48. $cat1 = new stdClass();
  49. $cat1->name = 'Example category';
  50. $cat1->sortorder = 1;
  51. $cat1->id = $DB->insert_record('user_info_category', $cat1);
  52. // Trigger the event.
  53. $sink = $this->redirectEvents();
  54. \core\event\user_info_category_created::create_from_category($cat1)->trigger();
  55. $events = $sink->get_events();
  56. $sink->close();
  57. // Confirm we got the right number of events.
  58. $this->assertCount(1, $events);
  59. // Validate that the event was correctly triggered.
  60. $event = reset($events);
  61. $this->assertInstanceOf('\core\event\user_info_category_created', $event);
  62. $this->assertEquals($event->objectid, $cat1->id);
  63. $this->assertEquals($event->other['name'], $cat1->name);
  64. }
  65. /**
  66. * Test that moving a user info category triggers an updated event.
  67. */
  68. public function test_user_info_category_updated_event() {
  69. global $DB;
  70. // Create new profile categories.
  71. $cat1 = new stdClass();
  72. $cat1->name = 'Example category';
  73. $cat1->sortorder = 1;
  74. $cat1->id = $DB->insert_record('user_info_category', $cat1);
  75. $cat2 = new stdClass();
  76. $cat2->name = 'Example category 2';
  77. $cat2->sortorder = 2;
  78. $cat2->id = $DB->insert_record('user_info_category', $cat2);
  79. // Trigger the events.
  80. $sink = $this->redirectEvents();
  81. profile_move_category($cat1->id, 'down');
  82. $events = $sink->get_events();
  83. $sink->close();
  84. // Should now have two events.
  85. $this->assertCount(2, $events);
  86. $event1 = array_shift($events);
  87. $event2 = array_shift($events);
  88. // Validate that the events were correctly triggered.
  89. $this->assertInstanceOf('\core\event\user_info_category_updated', $event1);
  90. $this->assertEquals($event1->objectid, $cat1->id);
  91. $this->assertEquals($event1->other['name'], $cat1->name);
  92. $this->assertInstanceOf('\core\event\user_info_category_updated', $event2);
  93. $this->assertEquals($event2->objectid, $cat2->id);
  94. $this->assertEquals($event2->other['name'], $cat2->name);
  95. }
  96. /**
  97. * Test that deleting a user info category triggers a delete event.
  98. */
  99. public function test_user_info_category_deleted_event() {
  100. global $DB;
  101. // Create new profile categories.
  102. $cat1 = new stdClass();
  103. $cat1->name = 'Example category';
  104. $cat1->sortorder = 1;
  105. $cat1->id = $DB->insert_record('user_info_category', $cat1);
  106. $cat2 = new stdClass();
  107. $cat2->name = 'Example category 2';
  108. $cat2->sortorder = 2;
  109. $cat2->id = $DB->insert_record('user_info_category', $cat2);
  110. // Trigger the event.
  111. $sink = $this->redirectEvents();
  112. profile_delete_category($cat2->id);
  113. $events = $sink->get_events();
  114. $sink->close();
  115. // Confirm we got the right number of events.
  116. $this->assertCount(1, $events);
  117. // Validate that the event was correctly triggered.
  118. $event = reset($events);
  119. $this->assertInstanceOf('\core\event\user_info_category_deleted', $event);
  120. $this->assertEquals($event->objectid, $cat2->id);
  121. $this->assertEquals($event->other['name'], $cat2->name);
  122. }
  123. /**
  124. * Test that creating a user info field triggers a create event.
  125. */
  126. public function test_user_info_field_created_event() {
  127. global $DB;
  128. // Create a new profile category.
  129. $cat1 = new stdClass();
  130. $cat1->name = 'Example category';
  131. $cat1->sortorder = 1;
  132. $cat1->id = $DB->insert_record('user_info_category', $cat1);
  133. // Create a new profile field.
  134. $data = new stdClass();
  135. $data->datatype = 'text';
  136. $data->shortname = 'example';
  137. $data->name = 'Example field';
  138. $data->description = 'Hello this is an example.';
  139. $data->required = false;
  140. $data->locked = false;
  141. $data->forceunique = false;
  142. $data->signup = false;
  143. $data->visible = '0';
  144. $data->categoryid = $cat1->id;
  145. // Trigger the event.
  146. $sink = $this->redirectEvents();
  147. $field = new profile_define_base();
  148. $field->define_save($data);
  149. $events = $sink->get_events();
  150. $sink->close();
  151. // Get the field that was created.
  152. $field = $DB->get_record('user_info_field', array('shortname' => $data->shortname));
  153. // Confirm we got the right number of events.
  154. $this->assertCount(1, $events);
  155. // Validate that the event was correctly triggered.
  156. $event = reset($events);
  157. $this->assertInstanceOf('\core\event\user_info_field_created', $event);
  158. $this->assertEquals($event->objectid, $field->id);
  159. $this->assertEquals($event->other['shortname'], $field->shortname);
  160. $this->assertEquals($event->other['name'], $field->name);
  161. $this->assertEquals($event->other['datatype'], $field->datatype);
  162. }
  163. /**
  164. * Test that updating a user info field triggers an update event.
  165. */
  166. public function test_user_info_field_updated_event() {
  167. global $DB;
  168. // Create a new profile category.
  169. $cat1 = new stdClass();
  170. $cat1->name = 'Example category';
  171. $cat1->sortorder = 1;
  172. $cat1->id = $DB->insert_record('user_info_category', $cat1);
  173. // Create a new profile field.
  174. $data = new stdClass();
  175. $data->datatype = 'text';
  176. $data->shortname = 'example';
  177. $data->name = 'Example field';
  178. $data->description = 'Hello this is an example.';
  179. $data->required = false;
  180. $data->locked = false;
  181. $data->forceunique = false;
  182. $data->signup = false;
  183. $data->visible = '0';
  184. $data->categoryid = $cat1->id;
  185. $data->id = $DB->insert_record('user_info_field', $data);
  186. // Trigger the event.
  187. $sink = $this->redirectEvents();
  188. $field = new profile_define_base();
  189. $field->define_save($data);
  190. $events = $sink->get_events();
  191. $sink->close();
  192. // Confirm we got the right number of events.
  193. $this->assertCount(1, $events);
  194. // Validate that the event was correctly triggered.
  195. $event = reset($events);
  196. $this->assertInstanceOf('\core\event\user_info_field_updated', $event);
  197. $this->assertEquals($event->objectid, $data->id);
  198. $this->assertEquals($event->other['shortname'], $data->shortname);
  199. $this->assertEquals($event->other['name'], $data->name);
  200. $this->assertEquals($event->other['datatype'], $data->datatype);
  201. }
  202. /**
  203. * Test that moving a field triggers update events.
  204. */
  205. public function test_user_info_field_updated_event_move_field() {
  206. global $DB;
  207. // Create a new profile category.
  208. $cat1 = new stdClass();
  209. $cat1->name = 'Example category';
  210. $cat1->sortorder = 1;
  211. $cat1->id = $DB->insert_record('user_info_category', $cat1);
  212. // Create a new profile field.
  213. $field1 = new stdClass();
  214. $field1->datatype = 'text';
  215. $field1->shortname = 'example';
  216. $field1->name = 'Example field';
  217. $field1->description = 'Hello this is an example.';
  218. $field1->required = false;
  219. $field1->locked = false;
  220. $field1->forceunique = false;
  221. $field1->signup = false;
  222. $field1->visible = '0';
  223. $field1->categoryid = $cat1->id;
  224. $field1->sortorder = 1;
  225. $field1->id = $DB->insert_record('user_info_field', $field1);
  226. // Create another that we will be moving.
  227. $field2 = clone $field1;
  228. $field2->datatype = 'text';
  229. $field2->shortname = 'example2';
  230. $field2->name = 'Example field 2';
  231. $field2->sortorder = 2;
  232. $field2->id = $DB->insert_record('user_info_field', $field2);
  233. // Trigger the events.
  234. $sink = $this->redirectEvents();
  235. profile_move_field($field2->id, 'up');
  236. $events = $sink->get_events();
  237. $sink->close();
  238. // Should now have two events.
  239. $this->assertCount(2, $events);
  240. $event1 = array_shift($events);
  241. $event2 = array_shift($events);
  242. // Validate that the events were correctly triggered.
  243. $this->assertInstanceOf('\core\event\user_info_field_updated', $event1);
  244. $this->assertEquals($event1->objectid, $field2->id);
  245. $this->assertEquals($event1->other['shortname'], $field2->shortname);
  246. $this->assertEquals($event1->other['name'], $field2->name);
  247. $this->assertEquals($event1->other['datatype'], $field2->datatype);
  248. $this->assertInstanceOf('\core\event\user_info_field_updated', $event2);
  249. $this->assertEquals($event2->objectid, $field1->id);
  250. $this->assertEquals($event2->other['shortname'], $field1->shortname);
  251. $this->assertEquals($event2->other['name'], $field1->name);
  252. $this->assertEquals($event2->other['datatype'], $field1->datatype);
  253. }
  254. /**
  255. * Test that when we delete a category that contains a field, that the field being moved to
  256. * another category triggers an update event.
  257. */
  258. public function test_user_info_field_updated_event_delete_category() {
  259. global $DB;
  260. // Create a new profile category.
  261. $cat1 = new stdClass();
  262. $cat1->name = 'Example category';
  263. $cat1->sortorder = 1;
  264. $cat1->id = $DB->insert_record('user_info_category', $cat1);
  265. $cat2 = new stdClass();
  266. $cat2->name = 'Example category';
  267. $cat2->sortorder = 1;
  268. $cat2->id = $DB->insert_record('user_info_category', $cat2);
  269. // Create a new profile field.
  270. $field = new stdClass();
  271. $field->datatype = 'text';
  272. $field->shortname = 'example';
  273. $field->name = 'Example field';
  274. $field->description = 'Hello this is an example.';
  275. $field->required = false;
  276. $field->locked = false;
  277. $field->forceunique = false;
  278. $field->signup = false;
  279. $field->visible = '0';
  280. $field->categoryid = $cat1->id;
  281. $field->id = $DB->insert_record('user_info_field', $field);
  282. // Trigger the event.
  283. $sink = $this->redirectEvents();
  284. profile_delete_category($cat1->id);
  285. $events = $sink->get_events();
  286. $sink->close();
  287. // Check we got the right number of events.
  288. $this->assertCount(2, $events);
  289. // Validate that the event was correctly triggered.
  290. $event = reset($events);
  291. $this->assertInstanceOf('\core\event\user_info_field_updated', $event);
  292. $this->assertEquals($event->objectid, $field->id);
  293. $this->assertEquals($event->other['shortname'], $field->shortname);
  294. $this->assertEquals($event->other['name'], $field->name);
  295. $this->assertEquals($event->other['datatype'], $field->datatype);
  296. }
  297. /**
  298. * Test that deleting a user info field triggers a delete event.
  299. */
  300. public function test_user_info_field_deleted_event() {
  301. global $DB;
  302. // Create a new profile category.
  303. $cat1 = new stdClass();
  304. $cat1->name = 'Example category';
  305. $cat1->sortorder = 1;
  306. $cat1->id = $DB->insert_record('user_info_category', $cat1);
  307. // Create a new profile field.
  308. $data = new stdClass();
  309. $data->datatype = 'text';
  310. $data->shortname = 'delete';
  311. $data->name = 'Example field for delete';
  312. $data->description = 'Hello this is an example.';
  313. $data->required = false;
  314. $data->locked = false;
  315. $data->forceunique = false;
  316. $data->signup = false;
  317. $data->visible = '0';
  318. $data->categoryid = $cat1->id;
  319. $data->id = $DB->insert_record('user_info_field', $data, true);
  320. // Trigger the event.
  321. $sink = $this->redirectEvents();
  322. profile_delete_field($data->id);
  323. $events = $sink->get_events();
  324. $sink->close();
  325. // Confirm we got the right number of events.
  326. $this->assertCount(1, $events);
  327. // Validate that the event was correctly triggered.
  328. $event = reset($events);
  329. $this->assertInstanceOf('\core\event\user_info_field_deleted', $event);
  330. $this->assertEquals($event->objectid, $data->id);
  331. $this->assertEquals($event->other['shortname'], $data->shortname);
  332. $this->assertEquals($event->other['name'], $data->name);
  333. $this->assertEquals($event->other['datatype'], $data->datatype);
  334. }
  335. }