From a066cfc843fba21b54255915064c8060b4861604 Mon Sep 17 00:00:00 2001 From: Damyon Wiese Date: Wed, 6 Jul 2016 09:50:20 +0800 Subject: [PATCH] MDL-55133 javascript: Correctly use component names in requirejs Core subsystems must use the 'core_' prefix always. --- grade/edit/tree/index.php | 2 +- lib/classes/requirejs.php | 2 +- lib/tests/requirejs_test.php | 95 ++++++++++++++++++++++++++++++++++++ 3 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 lib/tests/requirejs_test.php diff --git a/grade/edit/tree/index.php b/grade/edit/tree/index.php index 02577987ab1..ac912f7cde7 100644 --- a/grade/edit/tree/index.php +++ b/grade/edit/tree/index.php @@ -45,7 +45,7 @@ require_login($course); $context = context_course::instance($course->id); require_capability('moodle/grade:manage', $context); -$PAGE->requires->js_call_amd('grades/edittree_index', 'enhance'); +$PAGE->requires->js_call_amd('core_grades/edittree_index', 'enhance'); /// return tracking object $gpr = new grade_plugin_return(array('type'=>'edit', 'plugin'=>'tree', 'courseid'=>$courseid)); diff --git a/lib/classes/requirejs.php b/lib/classes/requirejs.php index 9894dc5c987..ebe4e6ff19b 100644 --- a/lib/classes/requirejs.php +++ b/lib/classes/requirejs.php @@ -90,7 +90,7 @@ class core_requirejs { $subsystems = core_component::get_core_subsystems(); foreach ($subsystems as $subsystem => $dir) { if (!empty($dir) && is_dir($dir . '/amd')) { - $jsdirs[$subsystem] = $dir . '/amd'; + $jsdirs['core_' . $subsystem] = $dir . '/amd'; } } $plugintypes = core_component::get_plugin_types(); diff --git a/lib/tests/requirejs_test.php b/lib/tests/requirejs_test.php new file mode 100644 index 00000000000..ef2732a18e9 --- /dev/null +++ b/lib/tests/requirejs_test.php @@ -0,0 +1,95 @@ +. + +/** + * Unit tests for requirejs loader. + * + * @package core + * @author Damyon Wiese + * @copyright 2016 Damyon Wiese + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ + +defined('MOODLE_INTERNAL') || die(); + +/** + * Unit tests for requirejs. + * + * @package core + * @author Damyon Wiese + * @copyright 2016 Damyon Wiese + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class core_requirejs_testcase extends advanced_testcase { + + /** + * Test requirejs loader + */ + public function test_requirejs() { + global $CFG; + + // Find a core module. + $result = core_requirejs::find_one_amd_module('core', 'templates', false); + $expected = ['core/templates' => $CFG->dirroot . '/lib/amd/build/templates.min.js']; + $this->assertEquals($expected, $result); + + $result = core_requirejs::find_one_amd_module('core', 'templates', true); + $expected = ['core/templates' => $CFG->dirroot . '/lib/amd/src/templates.js']; + $this->assertEquals($expected, $result); + + // Find a subsystem module (none exist yet). + $result = core_requirejs::find_one_amd_module('core_group', 'doesnotexist', false); + $expected = []; + $this->assertEquals($expected, $result); + + // Find a plugin module. + $result = core_requirejs::find_one_amd_module('mod_assign', 'grading_panel', true); + $expected = ['mod_assign/grading_panel' => $CFG->dirroot . '/mod/assign/amd/src/grading_panel.js']; + $this->assertEquals($expected, $result); + + // Find all modules - no debugging. + $result = core_requirejs::find_all_amd_modules(true); + foreach ($result as $key => $path) { + // Lets verify the first part of the key is a valid component name and the second part correctly contains "min" or not. + list($component, $template) = explode('/', $key, 2); + // Can we resolve it to a valid dir? + $dir = core_component::get_component_directory($component); + $this->assertNotEmpty($dir); + + // Only "core" is allowed to have no _ in component names. + if (strpos($component, '_') === false) { + $this->assertEquals('core', $component); + } + $this->assertNotContains('.min', $path); + } + + // Find all modules - debugging. + $result = core_requirejs::find_all_amd_modules(false); + foreach ($result as $key => $path) { + // Lets verify the first part of the key is a valid component name and the second part correctly contains "min" or not. + list($component, $template) = explode('/', $key, 2); + $dir = core_component::get_component_directory($component); + $this->assertNotEmpty($dir); + // Only "core" is allowed to have no _ in component names. + if (strpos($component, '_') === false) { + $this->assertEquals('core', $component); + } + + $this->assertContains('.min', $path); + } + + } +}