. declare(strict_types=1); namespace core_courseformat\external; defined('MOODLE_INTERNAL') || die(); use moodle_exception; use stdClass; global $CFG; require_once($CFG->dirroot . '/webservice/tests/helpers.php'); /** * Tests for the create_module class. * * @package core_courseformat * @category test * @copyright 2024 Mikel Martín * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @coversDefaultClass \core_courseformat\external\create_module */ final class create_module_test extends \externallib_advanced_testcase { /** * Setup to ensure that fixtures are loaded. */ public static function setupBeforeClass(): void { // phpcs:ignore global $CFG; require_once($CFG->dirroot . '/course/format/tests/fixtures/format_theunittest.php'); require_once($CFG->dirroot . '/course/format/tests/fixtures/format_theunittest_output_course_format_state.php'); require_once($CFG->dirroot . '/course/format/tests/fixtures/format_theunittest_stateactions.php'); } /** * Test the webservice can execute the create_module action. * * @covers ::execute */ public function test_execute(): void { $this->resetAfterTest(); $modname = 'subsection'; $manager = \core_plugin_manager::resolve_plugininfo_class('mod'); $manager::enable_plugin($modname, 1); // Create a course with an activity. $course = $this->getDataGenerator()->create_course(['numsections' => 1]); $activity = $this->getDataGenerator()->create_module('book', ['course' => $course->id]); $targetsection = get_fast_modinfo($course->id)->get_section_info(1); $this->setAdminUser(); // Execute course action. $results = json_decode(create_module::execute((int)$course->id, $modname, (int)$targetsection->id, (int)$activity->id)); $this->assertDebuggingCalled(); // Check result. $cmupdate = $this->find_update_by_fieldname($results, 'put', 'cm', get_string('quickcreatename', 'mod_' . $modname)); $this->assertNotEmpty($cmupdate); $this->assertEquals($modname, $cmupdate->fields->module); $this->assertEquals($targetsection->id, $cmupdate->fields->sectionnumber); } /** * Test the webservice can execute the create_module action with a format override. * * @covers ::execute */ public function test_execute_with_format_override(): void { $this->resetAfterTest(); // Create a course. $course = $this->getDataGenerator()->create_course(['format' => 'theunittest', 'numsections' => 1, 'initsections' => 1]); $targetsection = get_fast_modinfo($course->id)->get_section_info(1); $this->setAdminUser(); // Execute course action. $modname = 'subsection'; $results = json_decode(create_module::execute((int)$course->id, $modname, (int)$targetsection->id)); // Some course formats doesn't have the renderer file, so a debugging message will be displayed. $this->assertDebuggingCalled(); // Check result. $this->assertEmpty($results); } /** * Test the webservice can execute the create_module action with an invalid module. * * @covers ::execute */ public function test_execute_with_invalid_module(): void { $this->resetAfterTest(); // Create a course. $course = $this->getDataGenerator()->create_course(['numsections' => 1]); $targetsection = get_fast_modinfo($course->id)->get_section_info(1); $this->setAdminUser(); // Expect exception. Book module doesn't support quickcreate feature. $this->expectException(moodle_exception::class); // Execute course action. $modname = 'book'; create_module::execute((int)$course->id, $modname, (int)$targetsection->id); $this->assertDebuggingCalled(); } /** * Helper methods to find a specific update in the updadelist. * * @param array $updatelist the update list * @param string $action the action to find * @param string $name the element name to find * @param string $fieldname the element identifiername * @return stdClass|null the object found, if any. */ private function find_update_by_fieldname( array $updatelist, string $action, string $name, string $fieldname, ): ?stdClass { foreach ($updatelist as $update) { if ($update->action != $action || $update->name != $name) { continue; } if (!isset($update->fields->name)) { continue; } if ($update->fields->name == $fieldname) { return $update; } } return null; } }