/filter/tests/external_test.php

https://github.com/markn86/moodle · PHP · 200 lines · 112 code · 33 blank · 55 comment · 1 complexity · 37dc825597098862be3cd1a502453299 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. * External filter functions unit tests.
  18. *
  19. * @package core_filters
  20. * @category external
  21. * @copyright 2017 Juan Leyva
  22. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  23. * @since Moodle 3.4
  24. */
  25. defined('MOODLE_INTERNAL') || die();
  26. global $CFG;
  27. require_once($CFG->dirroot . '/webservice/tests/helpers.php');
  28. use core_filters\external;
  29. /**
  30. * External filter functions unit tests.
  31. *
  32. * @package core_filters
  33. * @category external
  34. * @copyright 2017 Juan Leyva
  35. * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  36. * @since Moodle 3.4
  37. */
  38. class core_filter_external_testcase extends externallib_advanced_testcase {
  39. /**
  40. * Test get_available_in_context_system
  41. */
  42. public function test_get_available_in_context_system() {
  43. global $DB;
  44. $this->resetAfterTest(true);
  45. $this->setAdminUser();
  46. $this->expectException('moodle_exception');
  47. external::get_available_in_context(array(array('contextlevel' => 'system', 'instanceid' => 0)));
  48. }
  49. /**
  50. * Test get_available_in_context_category
  51. */
  52. public function test_get_available_in_context_category() {
  53. global $DB;
  54. $this->resetAfterTest(true);
  55. $this->setAdminUser();
  56. $category = self::getDataGenerator()->create_category();
  57. // Get all filters and disable them all globally.
  58. $allfilters = filter_get_all_installed();
  59. foreach ($allfilters as $filter => $filtername) {
  60. filter_set_global_state($filter, TEXTFILTER_DISABLED);
  61. }
  62. $result = external::get_available_in_context(array(array('contextlevel' => 'coursecat', 'instanceid' => $category->id)));
  63. $result = external_api::clean_returnvalue(external::get_available_in_context_returns(), $result);
  64. $this->assertEmpty($result['filters']); // No filters, all disabled.
  65. $this->assertEmpty($result['warnings']);
  66. // Enable one filter at global level.
  67. reset($allfilters);
  68. $firstfilter = key($allfilters);
  69. filter_set_global_state($firstfilter, TEXTFILTER_ON);
  70. $result = external::get_available_in_context(array(array('contextlevel' => 'coursecat', 'instanceid' => $category->id)));
  71. $result = external_api::clean_returnvalue(external::get_available_in_context_returns(), $result);
  72. $this->assertEmpty($result['warnings']);
  73. $this->assertEquals($firstfilter, $result['filters'][0]['filter']); // OK, the filter is enabled.
  74. $this->assertEquals(TEXTFILTER_INHERIT, $result['filters'][0]['localstate']); // Inherits the parent context status.
  75. $this->assertEquals(TEXTFILTER_ON, $result['filters'][0]['inheritedstate']); // In the parent context is available.
  76. // Set off the same filter at local context level.
  77. filter_set_local_state($firstfilter, context_coursecat::instance($category->id)->id, TEXTFILTER_OFF);
  78. $result = external::get_available_in_context(array(array('contextlevel' => 'coursecat', 'instanceid' => $category->id)));
  79. $result = external_api::clean_returnvalue(external::get_available_in_context_returns(), $result);
  80. $this->assertEmpty($result['warnings']);
  81. $this->assertEquals($firstfilter, $result['filters'][0]['filter']); // OK, the filter is enabled globally.
  82. $this->assertEquals(TEXTFILTER_OFF, $result['filters'][0]['localstate']); // It is not available in this context.
  83. $this->assertEquals(TEXTFILTER_ON, $result['filters'][0]['inheritedstate']); // In the parent context is available.
  84. }
  85. /**
  86. * Test get_available_in_context_course
  87. */
  88. public function test_get_available_in_context_course() {
  89. global $DB;
  90. $this->resetAfterTest(true);
  91. $this->setAdminUser();
  92. $course = self::getDataGenerator()->create_course();
  93. // Get all filters and disable them all globally.
  94. $allfilters = filter_get_all_installed();
  95. foreach ($allfilters as $filter => $filtername) {
  96. filter_set_global_state($filter, TEXTFILTER_DISABLED);
  97. }
  98. $result = external::get_available_in_context(array(array('contextlevel' => 'course', 'instanceid' => $course->id)));
  99. $result = external_api::clean_returnvalue(external::get_available_in_context_returns(), $result);
  100. $this->assertEmpty($result['filters']); // No filters, all disabled at global level.
  101. $this->assertEmpty($result['warnings']);
  102. // Enable one filter at global level.
  103. reset($allfilters);
  104. $firstfilter = key($allfilters);
  105. filter_set_global_state($firstfilter, TEXTFILTER_ON);
  106. $result = external::get_available_in_context(array(array('contextlevel' => 'course', 'instanceid' => $course->id)));
  107. $result = external_api::clean_returnvalue(external::get_available_in_context_returns(), $result);
  108. $this->assertEmpty($result['warnings']);
  109. $this->assertEquals($firstfilter, $result['filters'][0]['filter']); // OK, the filter is enabled.
  110. $this->assertEquals(TEXTFILTER_INHERIT, $result['filters'][0]['localstate']); // Inherits the parent context status.
  111. $this->assertEquals(TEXTFILTER_ON, $result['filters'][0]['inheritedstate']); // In the parent context is available.
  112. // Set off the same filter at local context level.
  113. filter_set_local_state($firstfilter, context_course::instance($course->id)->id, TEXTFILTER_OFF);
  114. $result = external::get_available_in_context(array(array('contextlevel' => 'course', 'instanceid' => $course->id)));
  115. $result = external_api::clean_returnvalue(external::get_available_in_context_returns(), $result);
  116. $this->assertEmpty($result['warnings']);
  117. $this->assertEquals($firstfilter, $result['filters'][0]['filter']); // OK, the filter is enabled globally.
  118. $this->assertEquals(TEXTFILTER_OFF, $result['filters'][0]['localstate']); // It is not available in this context.
  119. $this->assertEquals(TEXTFILTER_ON, $result['filters'][0]['inheritedstate']); // In the parent context is available.
  120. }
  121. /**
  122. * Test get_available_in_context_module
  123. */
  124. public function test_get_available_in_context_module() {
  125. global $DB;
  126. $this->resetAfterTest(true);
  127. $this->setAdminUser();
  128. // Create one activity.
  129. $course = self::getDataGenerator()->create_course();
  130. $forum = self::getDataGenerator()->create_module('forum', (object) array('course' => $course->id));
  131. // Get all filters and disable them all globally.
  132. $allfilters = filter_get_all_installed();
  133. foreach ($allfilters as $filter => $filtername) {
  134. filter_set_global_state($filter, TEXTFILTER_DISABLED);
  135. }
  136. $result = external::get_available_in_context(array(array('contextlevel' => 'module', 'instanceid' => $forum->cmid)));
  137. $result = external_api::clean_returnvalue(external::get_available_in_context_returns(), $result);
  138. $this->assertEmpty($result['filters']); // No filters, all disabled at global level.
  139. $this->assertEmpty($result['warnings']);
  140. // Enable one filter at global level.
  141. reset($allfilters);
  142. $firstfilter = key($allfilters);
  143. filter_set_global_state($firstfilter, TEXTFILTER_ON);
  144. $result = external::get_available_in_context(array(array('contextlevel' => 'module', 'instanceid' => $forum->cmid)));
  145. $result = external_api::clean_returnvalue(external::get_available_in_context_returns(), $result);
  146. $this->assertEmpty($result['warnings']);
  147. $this->assertEquals($firstfilter, $result['filters'][0]['filter']); // OK, the filter is enabled.
  148. $this->assertEquals(TEXTFILTER_INHERIT, $result['filters'][0]['localstate']); // Inherits the parent context status.
  149. $this->assertEquals(TEXTFILTER_ON, $result['filters'][0]['inheritedstate']); // In the parent context is available.
  150. // Set off the same filter at local context level.
  151. filter_set_local_state($firstfilter, context_module::instance($forum->cmid)->id, TEXTFILTER_OFF);
  152. $result = external::get_available_in_context(array(array('contextlevel' => 'module', 'instanceid' => $forum->cmid)));
  153. $result = external_api::clean_returnvalue(external::get_available_in_context_returns(), $result);
  154. $this->assertEmpty($result['warnings']);
  155. $this->assertEquals($firstfilter, $result['filters'][0]['filter']); // OK, the filter is enabled globally.
  156. $this->assertEquals(TEXTFILTER_OFF, $result['filters'][0]['localstate']); // It is not available in this context.
  157. $this->assertEquals(TEXTFILTER_ON, $result['filters'][0]['inheritedstate']); // In the parent context is available.
  158. // Try user without permission, warning expected.
  159. $user = $this->getDataGenerator()->create_user();
  160. $this->setUser($user);
  161. $result = external::get_available_in_context(array(array('contextlevel' => 'module', 'instanceid' => $forum->cmid)));
  162. $result = external_api::clean_returnvalue(external::get_available_in_context_returns(), $result);
  163. $this->assertNotEmpty($result['warnings']);
  164. $this->assertEquals('context', $result['warnings'][0]['item']);
  165. $this->assertEquals($forum->cmid, $result['warnings'][0]['itemid']);
  166. }
  167. }