Autoría | Ultima modificación | Ver Log |
<?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/>.
declare(strict_types=1);
namespace mod_subsection;
use advanced_testcase;
use context_course;
/**
* Unit tests for the subsection permission class
*
* @package mod_subsection
* @covers \mod_subsection\permission
* @copyright 2024 Mikel Martín <mikel@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
final class permission_test extends advanced_testcase {
/**
* Test that viewing reports list observes capability to do so
*
* @param bool $ismoddisabled
* @param bool $missingcapability
* @param bool $isdelegated
* @param bool $maxsectionsreached
* @param string $format
* @param bool $expected
*
* @dataProvider can_add_subsection_provider
*/
public function test_can_add_subsection(
bool $ismoddisabled,
bool $missingcapability,
bool $isdelegated,
bool $maxsectionsreached,
string $format,
bool $expected
): void {
global $DB;
$this->resetAfterTest();
$course = $this->getDataGenerator()->create_course(['format' => $format, 'numsections' => 5]);
$user = $this->getDataGenerator()->create_and_enrol($course, 'editingteacher');
$courseformat = course_get_format($course->id);
$targetsection = $courseformat->get_modinfo()->get_section_info(5);
$manager = \core_plugin_manager::resolve_plugininfo_class('mod');
$manager::enable_plugin('subsection', (int)!$ismoddisabled);
if ($missingcapability) {
$userrole = $DB->get_field('role', 'id', ['shortname' => 'editingteacher']);
assign_capability('mod/subsection:addinstance', CAP_PROHIBIT, $userrole, context_course::instance($course->id));
}
if ($maxsectionsreached) {
set_config('maxsections', 5, 'moodlecourse');
}
if ($isdelegated) {
$this->getDataGenerator()->create_module('subsection', ['course' => $course->id, 'section' => 1]);
$targetsection = $courseformat->get_modinfo()->get_section_info(6);
}
$this->setUser($user);
$this->assertEquals($expected, permission::can_add_subsection($targetsection, (int)$user->id));
}
/**
* Data provider for {@see self::test_can_add_subsection}
*
* @return array[]
*/
public static function can_add_subsection_provider(): array {
return [
'Plugin disabled' => [
'ismoddisabled' => true,
'missingcapability' => false,
'isdelegated' => false,
'maxsectionsreached' => false,
'format' => 'topics',
'expected' => false,
],
'User without capability' => [
'ismoddisabled' => false,
'missingcapability' => true,
'isdelegated' => false,
'maxsectionsreached' => false,
'format' => 'topics',
'expected' => false,
],
'Max sections reached' => [
'ismoddisabled' => false,
'missingcapability' => false,
'isdelegated' => false,
'maxsectionsreached' => true,
'format' => 'topics',
'expected' => false,
],
'Target section is a delegated section' => [
'ismoddisabled' => false,
'missingcapability' => false,
'isdelegated' => true,
'maxsectionsreached' => false,
'format' => 'topics',
'expected' => false,
],
'Format does not support components' => [
'ismoddisabled' => false,
'missingcapability' => false,
'isdelegated' => false,
'maxsectionsreached' => false,
'format' => 'singleactivity',
'expected' => false,
],
'Plugin enabled, with capability, max sections not reached, not inside a delegated section' => [
'ismoddisabled' => false,
'missingcapability' => false,
'isdelegated' => false,
'maxsectionsreached' => false,
'format' => 'topics',
'expected' => true,
],
];
}
}