Files
moodle/course/format/tests/external/update_course_test.php
T
Ferran Recio 830c3eb907 MDL-71209 courseformat: add course index modules
The course index is the first UI component that implements the new
drawers and the reactive components. The course index uses the course
state to present the current course structure and changes whenever
that structure change.
2021-08-20 16:49:06 +02:00

237 lines
7.9 KiB
PHP

<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
namespace core_courseformat\external;
use stdClass;
use moodle_exception;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->dirroot . '/webservice/tests/helpers.php');
/**
* Tests for the update_course class.
*
* @package core_course
* @category test
* @copyright 2021 Sara Arjona (sara@moodle.com)
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @coversDefaultClass \core_courseformat\external\update_course
*/
class update_course_test extends \externallib_advanced_testcase {
/**
* Setup to ensure that fixtures are loaded.
*/
public static function setupBeforeClass(): void {
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 a core state action (cm_state).
*
* @dataProvider execute_course_state_provider
* @covers ::execute
*
* @param string $format the course format
* @param string $action the state action name
* @param array $expected the expected results
* @param bool $expectexception if an exception should happen.
* @param bool $assertdebug if an debug message should happen.
*/
public function test_execute_course_state(
string $format,
string $action,
array $expected,
bool $expectexception,
bool $assertdebug
) {
$this->resetAfterTest();
// Create a course with two activities.
$course = $this->getDataGenerator()->create_course(['format' => $format]);
$activity = $this->getDataGenerator()->create_module('book', ['course' => $course->id]);
$this->setAdminUser();
// Expect exception.
if ($expectexception) {
$this->expectException(moodle_exception::class);
}
// Execute course action.
$results = json_decode(update_course::execute($action, $course->id, [$activity->cmid]));
if ($assertdebug) {
// Some course formats hasn't the renderer file, so a debugging message will be displayed.
$this->assertDebuggingCalled();
}
// Check result.
$this->assertCount($expected['count'], $results);
$update = $this->find_update($results, $expected['action'], 'cm', $activity->cmid);
$this->assertNotEmpty($update);
if ($expected['visible'] === null) {
$this->assertObjectNotHasAttribute('visible', $update->fields);
} else {
$this->assertEquals($expected['visible'], $update->fields->visible);
}
}
/**
* Data provider for test_execute_course_state
*
* @return array of testing scenarios
*/
public function execute_course_state_provider(): array {
return [
'Execute a core state action (cm_state)' => [
'format' => 'topics',
'action' => 'cm_state',
'expected' => [
'count' => 2,
'action' => 'put',
'visible' => 1,
],
'expectexception' => false,
'assertdebug' => false,
],
'Formats can override core state actions' => [
'format' => 'theunittest',
'action' => 'cm_state',
'expected' => [
'count' => 1,
'action' => 'create',
'visible' => 1,
],
'expectexception' => false,
'assertdebug' => true,
],
'Formats can create new state actions' => [
'format' => 'theunittest',
'action' => 'format_do_something',
'expected' => [
'count' => 1,
'action' => 'delete',
'visible' => null,
],
'expectexception' => false,
'assertdebug' => true,
],
'Innexisting state action' => [
'format' => 'topics',
'action' => 'Wrong_State_Action_Name',
'expected' => [],
'expectexception' => true,
'assertdebug' => false,
],
];
}
/**
* 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 int $identifier the element id value
* @return stdClass|null the object found, if any.
*/
private function find_update(
array $updatelist,
string $action,
string $name,
int $identifier
): ?stdClass {
foreach ($updatelist as $update) {
if ($update->action != $action || $update->name != $name) {
continue;
}
if (!isset($update->fields->id)) {
continue;
}
if ($update->fields->id == $identifier) {
return $update;
}
}
return null;
}
/**
* Test a wrong course id.
*
* @covers ::execute
*
*/
public function test_execute_wrong_courseid() {
$this->resetAfterTest();
// Create a course with two activities.
$course = $this->getDataGenerator()->create_course(['format' => 'topics']);
$activity = $this->getDataGenerator()->create_module('book', ['course' => $course->id]);
$this->setAdminUser();
// Expect exception.
$this->expectException(moodle_exception::class);
// Execute course action.
$results = json_decode(update_course::execute('cm_state', $course->id + 1, [$activity->cmid]));
}
/**
* Test target params are passed to the state actions.
*
* @covers ::execute
*/
public function test_execute_target_params() {
$this->resetAfterTest();
// Create a course with two activities.
$course = $this->getDataGenerator()->create_course(['format' => 'theunittest', 'numsections' => 2]);
$activity = $this->getDataGenerator()->create_module('book', ['course' => $course->id]);
$modinfo = get_fast_modinfo($course);
$section = $modinfo->get_section_info(1);
$this->setAdminUser();
// Execute action with targetsectionid.
$results = json_decode(update_course::execute('targetsection_test', $course->id, [], $section->id));
$this->assertDebuggingCalled();
$this->assertCount(1, $results);
$update = $this->find_update($results, 'put', 'section', $section->id);
$this->assertNotEmpty($update);
// Execute action with targetcmid.
$results = json_decode(update_course::execute('targetcm_test', $course->id, [], null, $activity->cmid));
$this->assertDebuggingCalled();
$this->assertCount(1, $results);
$update = $this->find_update($results, 'put', 'cm', $activity->cmid);
$this->assertNotEmpty($update);
}
}