From 55d7b7b9354f052d79c6a01586357c9c643d7c39 Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Wed, 13 Aug 2025 22:00:21 +0800 Subject: [PATCH] MDL-86301 core: Create autoloadable externallib_testcase --- .upgradenotes/MDL-86283-2025081311280177.yml | 7 + .../tests/classes/externallib_testcase.php | 142 ++++++++++++++++++ webservice/tests/helpers.php | 111 +------------- 3 files changed, 155 insertions(+), 105 deletions(-) create mode 100644 .upgradenotes/MDL-86283-2025081311280177.yml create mode 100644 lib/external/tests/classes/externallib_testcase.php diff --git a/.upgradenotes/MDL-86283-2025081311280177.yml b/.upgradenotes/MDL-86283-2025081311280177.yml new file mode 100644 index 00000000000..0b70127150e --- /dev/null +++ b/.upgradenotes/MDL-86283-2025081311280177.yml @@ -0,0 +1,7 @@ +issueNumber: MDL-86283 +notes: + core: + - message: > + The `\externallib_advanced_testcase` has been replaced by + `\core_external\tests\externallib_testcase` and is now autoloadable. + type: improved diff --git a/lib/external/tests/classes/externallib_testcase.php b/lib/external/tests/classes/externallib_testcase.php new file mode 100644 index 00000000000..b3073c626e1 --- /dev/null +++ b/lib/external/tests/classes/externallib_testcase.php @@ -0,0 +1,142 @@ +. + +namespace core_external\tests; + +use core\context; +use core\exception\coding_exception; +use core_external\external_settings; +use filter_manager; + +// phpcs:disable moodle.NamingConventions.ValidFunctionName.LowercaseMethod + +/** + * Helper base class for external tests. Helpfull to test capabilities. + * + * @package core_external + * @copyright 2012 Jerome Mouneyrac + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +abstract class externallib_testcase extends \advanced_testcase { + /** + * Assign a capability to $USER + * The function creates a student $USER if $USER->id is empty + * + * @param string $capability capability name + * @param int|context $contextid + * @param int $roleid + * @return int the role id - mainly returned for creation, so calling function can reuse it + */ + public static function assignUserCapability($capability, $contextid, $roleid = null) { + global $USER; + + // Create a new student $USER if $USER doesn't exist. + if (empty($USER->id)) { + $user = self::getDataGenerator()->create_user(); + self::setUser($user); + } + + if (empty($roleid)) { + $roleid = create_role('Dummy role', 'dummyrole', 'dummy role description'); + } + + assign_capability($capability, CAP_ALLOW, $roleid, $contextid); + + role_assign($roleid, $USER->id, $contextid); + + accesslib_clear_all_caches_for_unit_testing(); + + return $roleid; + } + + /** + * Configure some filters for external tests. + * + * @param array $filters Filters to enable. Each filter should contain: + * - name: name of the filter. + * - state: the state of the filter. + * - move: -1 means up, 0 means the same, 1 means down. + * - applytostrings: true to apply the filter to content and headings, false for just content. + */ + public static function configure_filters($filters) { + global $CFG; + + $filterstrings = false; + + // Enable the filters. + foreach ($filters as $filter) { + $filter = (array) $filter; + filter_set_global_state($filter['name'], $filter['state'], $filter['move']); + filter_set_applies_to_strings($filter['name'], $filter['applytostrings']); + + $filterstrings = $filterstrings || $filter['applytostrings']; + } + + // Set WS filtering. + $wssettings = external_settings::get_instance(); + $wssettings->set_filter(true); + + // Reset filter caches. + $filtermanager = filter_manager::instance(); + $filtermanager->reset_caches(); + + if ($filterstrings) { + // Don't strip tags in strings. + $CFG->formatstringstriptags = false; + } + } + + /** + * Unassign a capability to $USER. + * + * @param string $capability capability name. + * @param int $contextid set the context id if you used assignUserCapability. + * @param int $roleid set the role id if you used assignUserCapability. + * @param int $courseid set the course id if you used getDataGenerator->enrol_users. + * @param string $enrol set the enrol plugin name if you used + * getDataGenerator->enrol_users with a different plugin than 'manual'. + */ + public static function unassignUserCapability( + $capability, + $contextid = null, + $roleid = null, + $courseid = null, + $enrol = 'manual', + ) { + global $DB; + + if (!empty($courseid)) { + // Retrieve the role id. + $instances = $DB->get_records('enrol', ['courseid' => $courseid, 'enrol' => $enrol]); + if (count($instances) != 1) { + throw new coding_exception('No found enrol instance for courseid: ' . $courseid . ' and enrol: ' . $enrol); + } + $instance = reset($instances); + + if (is_null($roleid) && $instance->roleid) { + $roleid = $instance->roleid; + } + } else { + if (empty($contextid) || empty($roleid)) { + throw new coding_exception('unassignUserCapaibility requires contextid/roleid or courseid'); + } + } + + unassign_capability($capability, $roleid, $contextid); + + accesslib_clear_all_caches_for_unit_testing(); + } +} diff --git a/webservice/tests/helpers.php b/webservice/tests/helpers.php index 025da61c34f..c44d01661c4 100644 --- a/webservice/tests/helpers.php +++ b/webservice/tests/helpers.php @@ -14,8 +14,6 @@ // You should have received a copy of the GNU General Public License // along with Moodle. If not, see . -use core_external\external_settings; - /** * Helper base class for external tests. Helpfull to test capabilities. * @@ -23,107 +21,10 @@ use core_external\external_settings; * @copyright 2012 Jerome Mouneyrac * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -abstract class externallib_advanced_testcase extends advanced_testcase { - /** - * Assign a capability to $USER - * The function creates a student $USER if $USER->id is empty - * - * @param string $capability capability name - * @param int|context $contextid - * @param int $roleid - * @return int the role id - mainly returned for creation, so calling function can reuse it - */ - public static function assignUserCapability($capability, $contextid, $roleid = null) { - global $USER; - - // Create a new student $USER if $USER doesn't exist - if (empty($USER->id)) { - $user = self::getDataGenerator()->create_user(); - self::setUser($user); - } - - if (empty($roleid)) { - $roleid = create_role('Dummy role', 'dummyrole', 'dummy role description'); - } - - assign_capability($capability, CAP_ALLOW, $roleid, $contextid); - - role_assign($roleid, $USER->id, $contextid); - - accesslib_clear_all_caches_for_unit_testing(); - - return $roleid; - } - - /** - * Configure some filters for external tests. - * - * @param array $filters Filters to enable. Each filter should contain: - * - name: name of the filter. - * - state: the state of the filter. - * - move: -1 means up, 0 means the same, 1 means down. - * - applytostrings: true to apply the filter to content and headings, false for just content. - */ - public static function configure_filters($filters) { - global $CFG; - - $filterstrings = false; - - // Enable the filters. - foreach ($filters as $filter) { - $filter = (array) $filter; - filter_set_global_state($filter['name'], $filter['state'], $filter['move']); - filter_set_applies_to_strings($filter['name'], $filter['applytostrings']); - - $filterstrings = $filterstrings || $filter['applytostrings']; - } - - // Set WS filtering. - $wssettings = external_settings::get_instance(); - $wssettings->set_filter(true); - - // Reset filter caches. - $filtermanager = filter_manager::instance(); - $filtermanager->reset_caches(); - - if ($filterstrings) { - // Don't strip tags in strings. - $CFG->formatstringstriptags = false; - } - } - - /** - * Unassign a capability to $USER. - * - * @param string $capability capability name. - * @param int $contextid set the context id if you used assignUserCapability. - * @param int $roleid set the role id if you used assignUserCapability. - * @param int $courseid set the course id if you used getDataGenerator->enrol_users. - * @param string $enrol set the enrol plugin name if you used getDataGenerator->enrol_users with a different plugin than 'manual'. - */ - public static function unassignUserCapability($capability, $contextid = null, $roleid = null, $courseid = null, $enrol = 'manual') { - global $DB; - - if (!empty($courseid)) { - // Retrieve the role id. - $instances = $DB->get_records('enrol', array('courseid'=>$courseid, 'enrol'=>$enrol)); - if (count($instances) != 1) { - throw new coding_exception('No found enrol instance for courseid: ' . $courseid . ' and enrol: ' . $enrol); - } - $instance = reset($instances); - - if (is_null($roleid) and $instance->roleid) { - $roleid = $instance->roleid; - } - } else { - if (empty($contextid) or empty($roleid)) { - throw new coding_exception('unassignUserCapaibility requires contextid/roleid or courseid'); - } - } - - unassign_capability($capability, $roleid, $contextid); - - accesslib_clear_all_caches_for_unit_testing(); - } -} +// Alias this class to the old name. +// In future all uses of this class will be corrected and the legacy references will be removed. +class_alias( + \core_external\tests\externallib_testcase::class, + \externallib_advanced_testcase::class, +);