Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.3.x will end 7 October 2024 (12 months).
  • Bug fixes for security issues in 4.3.x will end 21 April 2025 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.2.x is supported too.
<?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_grades\output;

use advanced_testcase;
use grade_helper;
use context_course;
use moodle_url;

/**
 * A test class used to test general_action_bar.
 *
 * @package    core_grades
 * @copyright  2021 Mihail Geshoski <mihail@moodle.com>
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
class general_action_bar_test extends advanced_testcase {

    /**
     * Load required test libraries
     */
    public static function setUpBeforeClass(): void {
        global $CFG;
        require_once("{$CFG->dirroot}/grade/lib.php");
    }

    /**
     * Search array $options for an element which is an array containing 'name' => $name.
     *
     * @param array $options the array of options.
     * @param string $name the name to find.
     * @return array|null the particular option if found, else null.
     */
    protected function find_option_by_name(array $options, string $name): ?array {
        foreach ($options as $option) {
            if ($option['name'] == $name) {
                return $option;
            }
        }
        return null;
    }

    /**
     * Test the exported data for the general action bar for different user roles and settings.
     *
     * @dataProvider export_for_template_provider
     * @param string $userrole The user role to test
     * @param bool $enableoutcomes Whether to enable outcomes
     * @param array $expectedoptions The expected options returned in the general action selector
     * @covers \core_grades\output\general_action_bar::export_for_template
     */
    public function test_export_for_template(string $userrole, bool $enableoutcomes, array $expectedoptions): void {
        global $PAGE;

        // There may be additional plugins installed in the codebase where this
        // test is being run, therefore, we need to know which links can be
        // present in a standard Moodle install, and only check them.
        $allcorenavlinks = [
            get_string('view') => [
                get_string('pluginname', 'gradereport_grader'),
                get_string('pluginname', 'gradereport_history'),
                get_string('pluginname', 'gradereport_outcomes'),
                get_string('pluginname', 'gradereport_overview'),
                get_string('pluginname', 'gradereport_singleview'),
> get_string('pluginname', 'gradereport_summary'),
get_string('pluginname', 'gradereport_user'), ], get_string('setup', 'grades') => [ get_string('gradebooksetup', 'grades'), get_string('coursegradesettings', 'grades'), get_string('preferences', 'grades') . ': ' . get_string('pluginname', 'gradereport_grader'), ], get_string('moremenu') => [ get_string('scales'), get_string('outcomes', 'grades'), get_string('gradeletters', 'grades'), get_string('import', 'grades'), get_string('export', 'grades'), ], ]; $this->resetAfterTest(); // Reset the cache. grade_helper::reset_caches(); // Create a course. $course = $this->getDataGenerator()->create_course(); $coursecontext = context_course::instance($course->id); if ($userrole === 'admin') { $this->setAdminUser(); } else { // Enrol user to the course. $user = $this->getDataGenerator()->create_and_enrol($course, $userrole); $this->setUser($user); } if ($enableoutcomes) { set_config('enableoutcomes', 1); } $generalactionbar = new general_action_bar($coursecontext, new moodle_url('/grade/report/user/index.php', ['id' => $course->id]), 'report', 'user'); $renderer = $PAGE->get_renderer('core'); $generalactionbardata = $generalactionbar->export_for_template($renderer); $this->assertCount(1, $generalactionbardata); $this->assertArrayHasKey('generalnavselector', $generalactionbardata); $generalnavselector = $generalactionbardata['generalnavselector']; // Assert that the right links are present in each group. foreach ($allcorenavlinks as $groupname => $corelinks) { $actualgroup = $this->find_option_by_name($generalnavselector->options, $groupname); if (!isset($expectedoptions[$groupname])) { // This group should not be present. $this->assertNull($actualgroup, "Nav link group '$groupname' should not be present, but is."); continue; } $this->assertNotNull($actualgroup, "Nav link group '$groupname' should be present, but is not."); $this->assertTrue($actualgroup['isgroup'], "the thing claiming to be nav link group '$groupname' is not a group."); foreach ($corelinks as $corelinkname) { $actuallink = $this->find_option_by_name($actualgroup['options'], $corelinkname); if (!in_array($corelinkname, $expectedoptions[$groupname])) { $this->assertNull($actuallink, "Nav link '$corelinkname' should not be present in group '$groupname', but is."); } else { $this->assertNotNull($actuallink, "Nav link '$corelinkname' should be present in group '$groupname', but is not."); } } } } /** * Data provider for the test_export_for_template test. * * @return array */ public function export_for_template_provider(): array { $graderpluginname = get_string('pluginname', 'gradereport_grader'); $historypluginname = get_string('pluginname', 'gradereport_history'); $outcomespluginname = get_string('pluginname', 'gradereport_outcomes'); $overviewpluginname = get_string('pluginname', 'gradereport_overview'); $singleviewpluginname = get_string('pluginname', 'gradereport_singleview');
> $summarypluginname = get_string('pluginname', 'gradereport_summary');
$userpluginname = get_string('pluginname', 'gradereport_user'); $viewstr = get_string('view'); $setupstr = get_string('setup', 'grades'); $morestr = get_string('moremenu'); $gradebooksetupstr = get_string('gradebooksetup', 'grades'); $coursegradesettingsstr = get_string('coursegradesettings', 'grades'); $graderpreferencesstr = get_string('preferences', 'grades') . ': ' . get_string('pluginname', 'gradereport_grader'); $scalesstr = get_string('scales'); $outcomesstr = get_string('outcomes', 'grades'); $gradelettersstr = get_string('gradeletters', 'grades'); $importstr = get_string('import', 'grades'); $exportstr = get_string('export', 'grades'); return [ 'Gradebook general navigation for admin; outcomes disabled.' => [ 'admin', false, [ $viewstr => [ $graderpluginname, $historypluginname, $overviewpluginname, $singleviewpluginname,
> $summarypluginname,
$userpluginname, ], $setupstr => [ $gradebooksetupstr, $coursegradesettingsstr, $graderpreferencesstr, ], $morestr => [ $scalesstr, $gradelettersstr, $importstr, $exportstr, ], ], ], 'Gradebook general navigation for admin; outcomes enabled.' => [ 'admin', true, [ $viewstr => [ $graderpluginname, $historypluginname, $outcomespluginname, $overviewpluginname, $singleviewpluginname,
> $summarypluginname,
$userpluginname, ], $setupstr => [ $gradebooksetupstr, $coursegradesettingsstr, $graderpreferencesstr, ], $morestr => [ $scalesstr, $outcomesstr, $gradelettersstr, $importstr, $exportstr, ], ], ], 'Gradebook general navigation for editing teacher; outcomes disabled.' => [ 'editingteacher', false, [ $viewstr => [ $graderpluginname, $historypluginname, $overviewpluginname, $singleviewpluginname,
> $summarypluginname,
$userpluginname, ], $setupstr => [ $gradebooksetupstr, $coursegradesettingsstr, $graderpreferencesstr, ], $morestr => [ $scalesstr, $gradelettersstr, $importstr, $exportstr, ], ], ], 'Gradebook general navigation for editing teacher; outcomes enabled.' => [ 'editingteacher', true, [ $viewstr => [ $graderpluginname, $historypluginname, $outcomespluginname, $overviewpluginname, $singleviewpluginname,
> $summarypluginname,
$userpluginname, ], $setupstr => [ $gradebooksetupstr, $coursegradesettingsstr, $graderpreferencesstr, ], $morestr => [ $scalesstr, $outcomesstr, $gradelettersstr, $importstr, $exportstr, ], ], ], 'Gradebook general navigation for non-editing teacher; outcomes enabled.' => [ 'teacher', true, [ $viewstr => [ $graderpluginname, $historypluginname, $outcomespluginname, $overviewpluginname,
> $summarypluginname,
$userpluginname, ], $setupstr => [ $graderpreferencesstr, ], $morestr => [ $exportstr, ], ], ], 'Gradebook general navigation for student; outcomes enabled.' => [ 'student', true, [ $viewstr => [ $overviewpluginname, $userpluginname, ], ], ], ]; } }