Search moodle.org's
Developer Documentation

See Release Notes

  • Bug fixes for general core bugs in 4.2.x will end 22 April 2024 (12 months).
  • Bug fixes for security issues in 4.2.x will end 7 October 2024 (18 months).
  • PHP version: minimum PHP 8.0.0 Note: minimum PHP version has increased since Moodle 4.1. PHP 8.1.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 quizaccess_seb;

defined('MOODLE_INTERNAL') || die();

require_once(__DIR__ . '/test_helper_trait.php');

/**
 * PHPUnit tests for settings_provider.
 *
 * @package   quizaccess_seb
 * @author    Andrew Madden <andrewmadden@catalyst-au.net>
 * @copyright 2020 Catalyst IT
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
class settings_provider_test extends \advanced_testcase {
    use \quizaccess_seb_test_helper_trait;

    /**
     * Mocked quiz form instance.
     * @var \mod_quiz_mod_form
     */
    protected $mockedquizform;

    /**
     * Test moodle form.
     * @var \MoodleQuickForm
     */
    protected $mockedform;

    /**
     * Context for testing.
     * @var \context
     */
    protected $context;

    /**
     * Test user.
     * @var \stdClass
     */
    protected $user;

    /**
     * Test role ID.
     * @var int
     */
    protected $roleid;

    /**
     * Helper method to set up form mocks.
     */
    protected function set_up_form_mocks() {
        if (empty($this->context)) {
            $this->context = \context_module::instance($this->quiz->cmid);
        }

        $this->mockedquizform = $this->createMock('mod_quiz_mod_form');
        $this->mockedquizform->method('get_context')->willReturn($this->context);
        $this->mockedquizform->method('get_instance')->willReturn($this->quiz->id);
        $this->mockedform = new \MoodleQuickForm('test', 'post', '');
        $this->mockedform->addElement('static', 'security');
    }

    /**
     * Helper method to set up user and role for testing.
     */
    protected function set_up_user_and_role() {
        $this->user = $this->getDataGenerator()->create_user();

        $this->setUser($this->user);
        $this->roleid = $this->getDataGenerator()->create_role();

        $this->getDataGenerator()->role_assign($this->roleid, $this->user->id, $this->context->id);
    }

    /**
     * Capability data for testing.
     *
     * @return array
     */
    public function settings_capability_data_provider() {
        $data = [];

        // Build first level SEB config settings. Any of this setting let us use SEB manual config.
        foreach (settings_provider::get_seb_settings_map()[settings_provider::USE_SEB_CONFIG_MANUALLY] as $name => $children) {
            if (key_exists($name, settings_provider::get_seb_config_elements())) {
                $cap = settings_provider::build_setting_capability_name($name);
                $data[] = [$cap];
            }
        }

        return $data;
    }

    /**
     * Test that settings types to be added to quiz settings, are part of quiz_settings persistent class.
     */
    public function test_setting_elements_are_part_of_quiz_settings_table() {
< $dbsettings = (array) (new quiz_settings())->to_record();
> $dbsettings = (array) (new seb_quiz_settings())->to_record();
$settingelements = settings_provider::get_seb_config_elements(); $settingelements = (array) $this->strip_all_prefixes((object) $settingelements); // Get all elements to be added to form, that are not in the persistent quiz_settings class. $diffelements = array_diff_key($settingelements, $dbsettings); $this->assertEmpty($diffelements); } /** * Make sure that all SEB settings have related capabilities. */ public function test_that_all_seb_settings_have_capabilities() { foreach (settings_provider::get_seb_config_elements() as $name => $notused) { $this->assertNotEmpty(get_capability_info(settings_provider::build_setting_capability_name($name))); } } /** * Test that setting defaults only refer to settings defined in setting types. */ public function test_setting_defaults_are_part_of_file_types() { $settingelements = settings_provider::get_seb_config_elements(); $settingdefaults = settings_provider::get_seb_config_element_defaults(); // Get all defaults that have no matching element in settings types. $diffelements = array_diff_key($settingdefaults, $settingelements); $this->assertEmpty($diffelements); } /** * Test that setting types only refer to settings defined in setting types. */ public function test_setting_types_are_part_of_file_types() { $settingelements = settings_provider::get_seb_config_elements(); $settingtypes = settings_provider::get_seb_config_element_types(); // Get all defaults that have no matching element in settings types. $diffelements = array_diff_key($settingtypes, $settingelements); $this->assertEmpty($diffelements); } /** * Helper method to assert hide if element. * @param hideif_rule $hideif Rule to check. * @param string $element Expected element. * @param string $dependantname Expected dependant element name. * @param string $condition Expected condition. * @param mixed $value Expected value. */ protected function assert_hide_if(hideif_rule $hideif, $element, $dependantname, $condition, $value) { $this->assertEquals($element, $hideif->get_element()); $this->assertEquals($dependantname, $hideif->get_dependantname()); $this->assertEquals($condition, $hideif->get_condition()); $this->assertEquals($value, $hideif->get_dependantvalue()); } /** * Test hideif rules. */ public function test_hideifs() { $settinghideifs = settings_provider::get_quiz_hideifs(); $this->assertCount(23, $settinghideifs); $this->assertArrayHasKey('seb_templateid', $settinghideifs); $this->assertCount(1, $settinghideifs['seb_templateid']); $this->assert_hide_if( $settinghideifs['seb_templateid'][0], 'seb_templateid', 'seb_requiresafeexambrowser', 'noteq', settings_provider::USE_SEB_TEMPLATE ); $this->assertArrayHasKey('filemanager_sebconfigfile', $settinghideifs); $this->assertCount(1, $settinghideifs['filemanager_sebconfigfile']); $this->assert_hide_if( $settinghideifs['filemanager_sebconfigfile'][0], 'filemanager_sebconfigfile', 'seb_requiresafeexambrowser', 'noteq', settings_provider::USE_SEB_UPLOAD_CONFIG ); $this->assertArrayHasKey('seb_showsebtaskbar', $settinghideifs); $this->assertCount(1, $settinghideifs['seb_showsebtaskbar']); $this->assert_hide_if( $settinghideifs['seb_showsebtaskbar'][0], 'seb_showsebtaskbar', 'seb_requiresafeexambrowser', 'noteq', settings_provider::USE_SEB_CONFIG_MANUALLY ); $this->assertArrayHasKey('seb_showwificontrol', $settinghideifs); $this->assertCount(2, $settinghideifs['seb_showwificontrol']); $this->assert_hide_if( $settinghideifs['seb_showwificontrol'][0], 'seb_showwificontrol', 'seb_requiresafeexambrowser', 'noteq', settings_provider::USE_SEB_CONFIG_MANUALLY ); $this->assert_hide_if( $settinghideifs['seb_showwificontrol'][1], 'seb_showwificontrol', 'seb_showsebtaskbar', 'eq', 0 ); $this->assertArrayHasKey('seb_showreloadbutton', $settinghideifs); $this->assertCount(2, $settinghideifs['seb_showreloadbutton']); $this->assert_hide_if( $settinghideifs['seb_showreloadbutton'][0], 'seb_showreloadbutton', 'seb_requiresafeexambrowser', 'noteq', settings_provider::USE_SEB_CONFIG_MANUALLY ); $this->assert_hide_if( $settinghideifs['seb_showreloadbutton'][1], 'seb_showreloadbutton', 'seb_showsebtaskbar', 'eq', 0 ); $this->assertArrayHasKey('seb_showtime', $settinghideifs); $this->assertCount(2, $settinghideifs['seb_showtime']); $this->assert_hide_if( $settinghideifs['seb_showtime'][0], 'seb_showtime', 'seb_requiresafeexambrowser', 'noteq', settings_provider::USE_SEB_CONFIG_MANUALLY ); $this->assert_hide_if( $settinghideifs['seb_showtime'][1], 'seb_showtime', 'seb_showsebtaskbar', 'eq', 0 ); $this->assertArrayHasKey('seb_showkeyboardlayout', $settinghideifs); $this->assertCount(2, $settinghideifs['seb_showkeyboardlayout']); $this->assert_hide_if( $settinghideifs['seb_showkeyboardlayout'][0], 'seb_showkeyboardlayout', 'seb_requiresafeexambrowser', 'noteq', settings_provider::USE_SEB_CONFIG_MANUALLY ); $this->assert_hide_if( $settinghideifs['seb_showkeyboardlayout'][1], 'seb_showkeyboardlayout', 'seb_showsebtaskbar', 'eq', 0 ); $this->assertArrayHasKey('seb_allowuserquitseb', $settinghideifs); $this->assertCount(3, $settinghideifs['seb_allowuserquitseb']); $this->assert_hide_if( $settinghideifs['seb_allowuserquitseb'][0], 'seb_allowuserquitseb', 'seb_requiresafeexambrowser', 'eq', settings_provider::USE_SEB_NO ); $this->assert_hide_if( $settinghideifs['seb_allowuserquitseb'][1], 'seb_allowuserquitseb', 'seb_requiresafeexambrowser', 'eq', settings_provider::USE_SEB_CLIENT_CONFIG ); $this->assert_hide_if( $settinghideifs['seb_allowuserquitseb'][2], 'seb_allowuserquitseb', 'seb_requiresafeexambrowser', 'eq', settings_provider::USE_SEB_UPLOAD_CONFIG ); $this->assertArrayHasKey('seb_quitpassword', $settinghideifs); $this->assertCount(4, $settinghideifs['seb_quitpassword']); $this->assert_hide_if( $settinghideifs['seb_quitpassword'][0], 'seb_quitpassword', 'seb_requiresafeexambrowser', 'eq', settings_provider::USE_SEB_NO ); $this->assert_hide_if( $settinghideifs['seb_quitpassword'][1], 'seb_quitpassword', 'seb_requiresafeexambrowser', 'eq', settings_provider::USE_SEB_CLIENT_CONFIG ); $this->assert_hide_if( $settinghideifs['seb_quitpassword'][2], 'seb_quitpassword', 'seb_requiresafeexambrowser', 'eq', settings_provider::USE_SEB_UPLOAD_CONFIG ); $this->assert_hide_if( $settinghideifs['seb_quitpassword'][3], 'seb_quitpassword', 'seb_allowuserquitseb', 'eq', 0 ); $this->assertArrayHasKey('seb_linkquitseb', $settinghideifs); $this->assertCount(1, $settinghideifs['seb_linkquitseb']); $this->assert_hide_if( $settinghideifs['seb_linkquitseb'][0], 'seb_linkquitseb', 'seb_requiresafeexambrowser', 'noteq', settings_provider::USE_SEB_CONFIG_MANUALLY ); $this->assertArrayHasKey('seb_userconfirmquit', $settinghideifs); $this->assertCount(1, $settinghideifs['seb_userconfirmquit']); $this->assert_hide_if( $settinghideifs['seb_userconfirmquit'][0], 'seb_userconfirmquit', 'seb_requiresafeexambrowser', 'noteq', settings_provider::USE_SEB_CONFIG_MANUALLY ); $this->assertArrayHasKey('seb_enableaudiocontrol', $settinghideifs); $this->assertCount(1, $settinghideifs['seb_enableaudiocontrol']); $this->assert_hide_if( $settinghideifs['seb_enableaudiocontrol'][0], 'seb_enableaudiocontrol', 'seb_requiresafeexambrowser', 'noteq', settings_provider::USE_SEB_CONFIG_MANUALLY ); $this->assertArrayHasKey('seb_muteonstartup', $settinghideifs); $this->assertCount(2, $settinghideifs['seb_muteonstartup']); $this->assert_hide_if( $settinghideifs['seb_muteonstartup'][0], 'seb_muteonstartup', 'seb_requiresafeexambrowser', 'noteq', settings_provider::USE_SEB_CONFIG_MANUALLY ); $this->assert_hide_if( $settinghideifs['seb_muteonstartup'][1], 'seb_muteonstartup', 'seb_enableaudiocontrol', 'eq', 0 ); $this->assertArrayHasKey('seb_allowspellchecking', $settinghideifs); $this->assertCount(1, $settinghideifs['seb_allowspellchecking']); $this->assert_hide_if( $settinghideifs['seb_allowspellchecking'][0], 'seb_allowspellchecking', 'seb_requiresafeexambrowser', 'noteq', settings_provider::USE_SEB_CONFIG_MANUALLY ); $this->assertArrayHasKey('seb_allowreloadinexam', $settinghideifs); $this->assertCount(1, $settinghideifs['seb_allowreloadinexam']); $this->assert_hide_if( $settinghideifs['seb_allowreloadinexam'][0], 'seb_allowreloadinexam', 'seb_requiresafeexambrowser', 'noteq', settings_provider::USE_SEB_CONFIG_MANUALLY ); $this->assertArrayHasKey('seb_activateurlfiltering', $settinghideifs); $this->assertCount(1, $settinghideifs['seb_activateurlfiltering']); $this->assert_hide_if( $settinghideifs['seb_activateurlfiltering'][0], 'seb_activateurlfiltering', 'seb_requiresafeexambrowser', 'noteq', settings_provider::USE_SEB_CONFIG_MANUALLY ); $this->assertArrayHasKey('seb_filterembeddedcontent', $settinghideifs); $this->assertCount(2, $settinghideifs['seb_filterembeddedcontent']); $this->assert_hide_if( $settinghideifs['seb_filterembeddedcontent'][0], 'seb_filterembeddedcontent', 'seb_requiresafeexambrowser', 'noteq', settings_provider::USE_SEB_CONFIG_MANUALLY ); $this->assert_hide_if( $settinghideifs['seb_filterembeddedcontent'][1], 'seb_filterembeddedcontent', 'seb_activateurlfiltering', 'eq', 0 ); $this->assertArrayHasKey('seb_expressionsallowed', $settinghideifs); $this->assertCount(2, $settinghideifs['seb_expressionsallowed']); $this->assert_hide_if( $settinghideifs['seb_expressionsallowed'][0], 'seb_expressionsallowed', 'seb_requiresafeexambrowser', 'noteq', settings_provider::USE_SEB_CONFIG_MANUALLY ); $this->assert_hide_if( $settinghideifs['seb_expressionsallowed'][1], 'seb_expressionsallowed', 'seb_activateurlfiltering', 'eq', 0 ); $this->assertArrayHasKey('seb_regexallowed', $settinghideifs); $this->assertCount(2, $settinghideifs['seb_regexallowed']); $this->assert_hide_if( $settinghideifs['seb_regexallowed'][0], 'seb_regexallowed', 'seb_requiresafeexambrowser', 'noteq', settings_provider::USE_SEB_CONFIG_MANUALLY ); $this->assert_hide_if( $settinghideifs['seb_regexallowed'][1], 'seb_regexallowed', 'seb_activateurlfiltering', 'eq', 0 ); $this->assertArrayHasKey('seb_expressionsblocked', $settinghideifs); $this->assertCount(2, $settinghideifs['seb_expressionsblocked']); $this->assert_hide_if( $settinghideifs['seb_expressionsblocked'][0], 'seb_expressionsblocked', 'seb_requiresafeexambrowser', 'noteq', settings_provider::USE_SEB_CONFIG_MANUALLY ); $this->assert_hide_if( $settinghideifs['seb_expressionsblocked'][1], 'seb_expressionsblocked', 'seb_activateurlfiltering', 'eq', 0 ); $this->assertArrayHasKey('seb_regexblocked', $settinghideifs); $this->assertCount(2, $settinghideifs['seb_regexblocked']); $this->assert_hide_if( $settinghideifs['seb_regexblocked'][0], 'seb_regexblocked', 'seb_requiresafeexambrowser', 'noteq', settings_provider::USE_SEB_CONFIG_MANUALLY ); $this->assert_hide_if( $settinghideifs['seb_regexblocked'][1], 'seb_regexblocked', 'seb_activateurlfiltering', 'eq', 0 ); $this->assertArrayHasKey('seb_showsebdownloadlink', $settinghideifs); $this->assertCount(1, $settinghideifs['seb_showsebdownloadlink']); $this->assert_hide_if( $settinghideifs['seb_showsebdownloadlink'][0], 'seb_showsebdownloadlink', 'seb_requiresafeexambrowser', 'eq', settings_provider::USE_SEB_NO ); $this->assertArrayHasKey('seb_allowedbrowserexamkeys', $settinghideifs); $this->assertCount(3, $settinghideifs['seb_allowedbrowserexamkeys']); $this->assert_hide_if( $settinghideifs['seb_allowedbrowserexamkeys'][0], 'seb_allowedbrowserexamkeys', 'seb_requiresafeexambrowser', 'eq', settings_provider::USE_SEB_NO ); $this->assert_hide_if( $settinghideifs['seb_allowedbrowserexamkeys'][1], 'seb_allowedbrowserexamkeys', 'seb_requiresafeexambrowser', 'eq', settings_provider::USE_SEB_CONFIG_MANUALLY ); $this->assert_hide_if( $settinghideifs['seb_allowedbrowserexamkeys'][2], 'seb_allowedbrowserexamkeys', 'seb_requiresafeexambrowser', 'eq', settings_provider::USE_SEB_TEMPLATE ); } /** * Test that setting hideif rules only refer to settings defined in setting types, including the conditions. */ public function test_setting_hideifs_are_part_of_file_types() { $settingelements = settings_provider::get_seb_config_elements(); $settinghideifs = settings_provider::get_quiz_hideifs(); // Add known additional elements. $settingelements['seb_templateid'] = ''; $settingelements['filemanager_sebconfigfile'] = ''; $settingelements['seb_showsebdownloadlink'] = ''; $settingelements['seb_allowedbrowserexamkeys'] = ''; // Get all defaults that have no matching element in settings types. $diffelements = array_diff_key($settinghideifs, $settingelements); // Check no diff for elements to hide. $this->assertEmpty($diffelements); // Check each element's to hide conditions that each condition refers to element in settings types. foreach ($settinghideifs as $conditions) { foreach ($conditions as $condition) { $this->assertTrue(array_key_exists($condition->get_element(), $settingelements)); } } } /** * Test that exception thrown if we try to build capability name from the incorrect setting name. */ public function test_build_setting_capability_name_incorrect_setting() { $this->expectException(\coding_exception::class); $this->expectExceptionMessage('Incorrect SEB quiz setting broken'); $broken = settings_provider::build_setting_capability_name('broken'); } /** * Test we can build capability name from the the setting name. */ public function test_build_setting_capability_name_correct_setting() { foreach (settings_provider::get_seb_config_elements() as $name => $type) { $expected = 'quizaccess/seb:manage_' . $name; $actual = settings_provider::build_setting_capability_name($name); $this->assertSame($expected, $actual); } } /** * Test can check if can manage SEB settings respecting settings structure. */ public function test_can_manage_seb_config_setting() { $this->resetAfterTest(); $this->setAdminUser(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->getDataGenerator()->create_module('quiz', ['course' => $this->course->id]); $this->context = \context_module::instance($this->quiz->cmid); $this->set_up_user_and_role(); foreach (settings_provider::get_seb_settings_map()[settings_provider::USE_SEB_CONFIG_MANUALLY] as $setting => $children) { // Skip not SEB setting. if ($setting == 'seb_showsebdownloadlink') { continue; } $this->assertFalse(settings_provider::can_manage_seb_config_setting($setting, $this->context)); foreach ($children as $child => $empty) { $this->assertFalse(settings_provider::can_manage_seb_config_setting($child, $this->context)); // Assign child capability without having parent one. Should not have access to manage child. $childcap = settings_provider::build_setting_capability_name($child); assign_capability($childcap, CAP_ALLOW, $this->roleid, $this->context->id); $this->assertFalse(settings_provider::can_manage_seb_config_setting($child, $this->context)); } // Assign parent capability. Should be able to manage children now. $parentcap = settings_provider::build_setting_capability_name($setting); assign_capability($parentcap, CAP_ALLOW, $this->roleid, $this->context->id); $this->assertTrue(settings_provider::can_manage_seb_config_setting($setting, $this->context)); foreach ($children as $child => $empty) { $this->assertTrue(settings_provider::can_manage_seb_config_setting($child, $this->context)); } } } /** * Test SEB usage options. * * @param string $settingcapability Setting capability to check manual option against. * * @dataProvider settings_capability_data_provider */ public function test_get_requiresafeexambrowser_options($settingcapability) { $this->resetAfterTest(); $this->setAdminUser(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->getDataGenerator()->create_module('quiz', ['course' => $this->course->id]); $this->context = \context_module::instance($this->quiz->cmid); $options = settings_provider::get_requiresafeexambrowser_options($this->context); $this->assertCount(4, $options); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_NO, $options)); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_CONFIG_MANUALLY, $options)); $this->assertFalse(array_key_exists(settings_provider::USE_SEB_TEMPLATE, $options)); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_UPLOAD_CONFIG, $options)); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_CLIENT_CONFIG, $options)); // Create a template. $this->create_template(); // The template options should be visible now. $options = settings_provider::get_requiresafeexambrowser_options($this->context); $this->assertCount(5, $options); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_TEMPLATE, $options)); // A new user does not have the capability to use the file manager and template. $this->set_up_user_and_role(); $options = settings_provider::get_requiresafeexambrowser_options($this->context); $this->assertCount(2, $options); $this->assertFalse(array_key_exists(settings_provider::USE_SEB_CONFIG_MANUALLY, $options)); $this->assertFalse(array_key_exists(settings_provider::USE_SEB_TEMPLATE, $options)); $this->assertFalse(array_key_exists(settings_provider::USE_SEB_UPLOAD_CONFIG, $options)); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_CLIENT_CONFIG, $options)); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_NO, $options)); assign_capability($settingcapability, CAP_ALLOW, $this->roleid, $this->context->id); $options = settings_provider::get_requiresafeexambrowser_options($this->context); $this->assertCount(3, $options); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_CONFIG_MANUALLY, $options)); $this->assertFalse(array_key_exists(settings_provider::USE_SEB_TEMPLATE, $options)); $this->assertFalse(array_key_exists(settings_provider::USE_SEB_UPLOAD_CONFIG, $options)); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_CLIENT_CONFIG, $options)); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_NO, $options)); assign_capability('quizaccess/seb:manage_seb_templateid', CAP_ALLOW, $this->roleid, $this->context->id); $options = settings_provider::get_requiresafeexambrowser_options($this->context); $this->assertCount(4, $options); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_CONFIG_MANUALLY, $options)); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_TEMPLATE, $options)); $this->assertFalse(array_key_exists(settings_provider::USE_SEB_UPLOAD_CONFIG, $options)); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_CLIENT_CONFIG, $options)); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_NO, $options)); assign_capability('quizaccess/seb:manage_filemanager_sebconfigfile', CAP_ALLOW, $this->roleid, $this->context->id); $options = settings_provider::get_requiresafeexambrowser_options($this->context); $this->assertCount(5, $options); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_CONFIG_MANUALLY, $options)); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_TEMPLATE, $options)); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_UPLOAD_CONFIG, $options)); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_CLIENT_CONFIG, $options)); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_NO, $options)); } /** * Test SEB usage options with conflicting permissions. */ public function test_get_requiresafeexambrowser_options_with_conflicting_permissions() { $this->resetAfterTest(); $this->setAdminUser(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->create_test_quiz($this->course, settings_provider::USE_SEB_CONFIG_MANUALLY); $this->context = \context_module::instance($this->quiz->cmid); $template = $this->create_template();
< $settings = quiz_settings::get_record(['quizid' => $this->quiz->id]);
> $settings = seb_quiz_settings::get_record(['quizid' => $this->quiz->id]);
$settings->set('templateid', $template->get('id')); $settings->set('requiresafeexambrowser', settings_provider::USE_SEB_TEMPLATE); $settings->save(); $this->set_up_user_and_role(); $options = settings_provider::get_requiresafeexambrowser_options($this->context); // If there is nay conflict we return full list of options. $this->assertCount(5, $options); $this->assertTrue(array_key_exists(settings_provider::USE_SEB_TEMPLATE, $options)); } /** * Test that SEB options and templates are frozen if conflicting permissions. */ public function test_form_elements_are_frozen_if_conflicting_permissions() { $this->resetAfterTest(); $this->setAdminUser(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->create_test_quiz($this->course, settings_provider::USE_SEB_CONFIG_MANUALLY); $this->context = \context_module::instance($this->quiz->cmid); // Setup conflicting permissions. $template = $this->create_template();
< $settings = quiz_settings::get_record(['quizid' => $this->quiz->id]);
> $settings = seb_quiz_settings::get_record(['quizid' => $this->quiz->id]);
$settings->set('templateid', $template->get('id')); $settings->set('requiresafeexambrowser', settings_provider::USE_SEB_TEMPLATE); $settings->save(); $this->set_up_user_and_role(); assign_capability('quizaccess/seb:manage_seb_requiresafeexambrowser', CAP_ALLOW, $this->roleid, $this->context->id); assign_capability('quizaccess/seb:manage_seb_showsebdownloadlink', CAP_ALLOW, $this->roleid, $this->context->id); assign_capability('quizaccess/seb:manage_seb_allowedbrowserexamkeys', CAP_ALLOW, $this->roleid, $this->context->id); $this->set_up_form_mocks(); settings_provider::add_seb_settings_fields($this->mockedquizform, $this->mockedform); $this->assertTrue($this->mockedform->isElementFrozen('seb_requiresafeexambrowser')); $this->assertTrue($this->mockedform->isElementFrozen('seb_templateid')); $this->assertTrue($this->mockedform->isElementFrozen('seb_showsebdownloadlink')); $this->assertTrue($this->mockedform->isElementFrozen('seb_allowedbrowserexamkeys')); } /** * Test that All settings are frozen if quiz was attempted and use seb with manual settings. */ public function test_form_elements_are_locked_when_quiz_attempted_manual() { $this->resetAfterTest(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->create_test_quiz($this->course, settings_provider::USE_SEB_CONFIG_MANUALLY); $this->context = \context_module::instance($this->quiz->cmid); $user = $this->getDataGenerator()->create_user(); $this->attempt_quiz($this->quiz, $user); $this->setAdminUser(); $this->set_up_form_mocks(); settings_provider::add_seb_settings_fields($this->mockedquizform, $this->mockedform); $this->assertTrue($this->mockedform->isElementFrozen('seb_requiresafeexambrowser')); $this->assertTrue($this->mockedform->elementExists('filemanager_sebconfigfile')); $this->assertFalse($this->mockedform->elementExists('seb_templateid')); $this->assertTrue($this->mockedform->isElementFrozen('seb_showsebdownloadlink')); $this->assertTrue($this->mockedform->isElementFrozen('seb_allowedbrowserexamkeys')); foreach (settings_provider::get_seb_config_elements() as $name => $type) { $this->assertTrue($this->mockedform->isElementFrozen($name)); } } /** * Test that All settings are frozen if a quiz was attempted and use template. */ public function test_form_elements_are_locked_when_quiz_attempted_template() { $this->resetAfterTest(); $this->setAdminUser(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->create_test_quiz($this->course, settings_provider::USE_SEB_CONFIG_MANUALLY); $this->context = \context_module::instance($this->quiz->cmid); $template = $this->create_template();
< $settings = quiz_settings::get_record(['quizid' => $this->quiz->id]);
> $settings = seb_quiz_settings::get_record(['quizid' => $this->quiz->id]);
$settings->set('templateid', $template->get('id')); $settings->set('requiresafeexambrowser', settings_provider::USE_SEB_TEMPLATE); $settings->save(); $user = $this->getDataGenerator()->create_user(); $this->attempt_quiz($this->quiz, $user); $this->setAdminUser(); $this->set_up_form_mocks(); settings_provider::add_seb_settings_fields($this->mockedquizform, $this->mockedform); $this->assertTrue($this->mockedform->isElementFrozen('seb_requiresafeexambrowser')); $this->assertTrue($this->mockedform->elementExists('filemanager_sebconfigfile')); $this->assertTrue($this->mockedform->isElementFrozen('seb_templateid')); $this->assertTrue($this->mockedform->isElementFrozen('seb_showsebdownloadlink')); $this->assertTrue($this->mockedform->isElementFrozen('seb_allowedbrowserexamkeys')); foreach (settings_provider::get_seb_config_elements() as $name => $type) { $this->assertTrue($this->mockedform->isElementFrozen($name)); } } /** * Test Show Safe Exam Browser download button setting in the form. */ public function test_showsebdownloadlink_in_form() { $this->resetAfterTest(); $this->setAdminUser(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->create_test_quiz($this->course, settings_provider::USE_SEB_CONFIG_MANUALLY); $this->context = \context_module::instance($this->quiz->cmid); $this->set_up_user_and_role(); assign_capability('quizaccess/seb:manage_seb_requiresafeexambrowser', CAP_ALLOW, $this->roleid, $this->context->id); $this->set_up_form_mocks(); // Shouldn't be in the form if no permissions. settings_provider::add_seb_settings_fields($this->mockedquizform, $this->mockedform); $this->assertFalse($this->mockedform->elementExists('seb_showsebdownloadlink')); // Should be in the form if we grant require permissions. assign_capability('quizaccess/seb:manage_seb_showsebdownloadlink', CAP_ALLOW, $this->roleid, $this->context->id); settings_provider::add_seb_settings_fields($this->mockedquizform, $this->mockedform); $this->assertTrue($this->mockedform->elementExists('seb_showsebdownloadlink')); } /** * Test Allowed Browser Exam Keys setting in the form. */ public function test_allowedbrowserexamkeys_in_form() { $this->resetAfterTest(); $this->setAdminUser(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->create_test_quiz($this->course, settings_provider::USE_SEB_CLIENT_CONFIG); $this->context = \context_module::instance($this->quiz->cmid); $this->set_up_user_and_role(); assign_capability('quizaccess/seb:manage_seb_requiresafeexambrowser', CAP_ALLOW, $this->roleid, $this->context->id); $this->set_up_form_mocks(); // Shouldn't be in the form if no permissions. settings_provider::add_seb_settings_fields($this->mockedquizform, $this->mockedform); $this->assertFalse($this->mockedform->elementExists('seb_allowedbrowserexamkeys')); // Should be in the form if we grant require permissions. assign_capability('quizaccess/seb:manage_seb_allowedbrowserexamkeys', CAP_ALLOW, $this->roleid, $this->context->id); settings_provider::add_seb_settings_fields($this->mockedquizform, $this->mockedform); $this->assertTrue($this->mockedform->elementExists('seb_allowedbrowserexamkeys')); } /** * Test the validation of a seb config file. */ public function test_validate_draftarea_configfile_success() { $this->resetAfterTest(); $user = $this->getDataGenerator()->create_user(); $this->setUser($user); $xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" . "<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n" . "<plist version=\"1.0\"><dict><key>hashedQuitPassword</key><string>hashedpassword</string>" . "<key>allowWlan</key><false/></dict></plist>\n"; $itemid = $this->create_test_draftarea_file($xml); $errors = settings_provider::validate_draftarea_configfile($itemid); $this->assertEmpty($errors); } /** * Test the validation of a missing seb config file. */ public function test_validate_draftarea_configfile_failure() { $this->resetAfterTest(); $user = $this->getDataGenerator()->create_user(); $this->setUser($user); $xml = "This is not a config file."; $itemid = $this->create_test_draftarea_file($xml); $errors = settings_provider::validate_draftarea_configfile($itemid); $this->assertEquals($errors, new \lang_string('fileparsefailed', 'quizaccess_seb')); } /** * Test obtaining the draftarea content. */ public function test_get_current_user_draft_file() { $this->resetAfterTest(); $user = $this->getDataGenerator()->create_user(); $this->setUser($user); $xml = file_get_contents(__DIR__ . '/fixtures/unencrypted.seb'); $itemid = $this->create_test_draftarea_file($xml); $file = settings_provider::get_current_user_draft_file($itemid); $content = $file->get_content(); $this->assertEquals($xml, $content); } /** * Test saving files from the user draft area into the quiz context area storage. */ public function test_save_filemanager_sebconfigfile_draftarea() { $this->resetAfterTest(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->getDataGenerator()->create_module('quiz', ['course' => $this->course->id]); $this->context = \context_module::instance($this->quiz->cmid); $this->set_up_user_and_role(); $xml = file_get_contents(__DIR__ . '/fixtures/unencrypted.seb'); $draftitemid = $this->create_test_draftarea_file($xml); settings_provider::save_filemanager_sebconfigfile_draftarea($draftitemid, $this->quiz->cmid); $fs = get_file_storage(); $files = $fs->get_area_files($this->context->id, 'quizaccess_seb', 'filemanager_sebconfigfile'); $this->assertCount(2, $files); } /** * Test deleting the $this->quiz->cmid itemid from the file area. */ public function test_delete_uploaded_config_file() { $this->resetAfterTest(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->getDataGenerator()->create_module('quiz', ['course' => $this->course->id]); $this->context = \context_module::instance($this->quiz->cmid); $this->set_up_user_and_role(); $xml = file_get_contents(__DIR__ . '/fixtures/unencrypted.seb'); $draftitemid = $this->create_test_draftarea_file($xml); settings_provider::save_filemanager_sebconfigfile_draftarea($draftitemid, $this->quiz->cmid); $fs = get_file_storage(); $files = $fs->get_area_files($this->context->id, 'quizaccess_seb', 'filemanager_sebconfigfile'); $this->assertCount(2, $files); settings_provider::delete_uploaded_config_file($this->quiz->cmid); $files = $fs->get_area_files($this->context->id, 'quizaccess_seb', 'filemanager_sebconfigfile'); // The '.' directory. $this->assertCount(1, $files); } /** * Test getting the file from the context module id file area. */ public function test_get_module_context_sebconfig_file() { $this->resetAfterTest(); $this->setAdminUser(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->create_test_quiz($this->course, settings_provider::USE_SEB_CONFIG_MANUALLY); $this->context = \context_module::instance($this->quiz->cmid); $this->set_up_user_and_role(); $xml = file_get_contents(__DIR__ . '/fixtures/unencrypted.seb'); $draftitemid = $this->create_test_draftarea_file($xml); $fs = get_file_storage(); $files = $fs->get_area_files($this->context->id, 'quizaccess_seb', 'filemanager_sebconfigfile'); $this->assertCount(0, $files); settings_provider::save_filemanager_sebconfigfile_draftarea($draftitemid, $this->quiz->cmid);
< $settings = quiz_settings::get_record(['quizid' => $this->quiz->id]);
> $settings = seb_quiz_settings::get_record(['quizid' => $this->quiz->id]);
$settings->set('requiresafeexambrowser', settings_provider::USE_SEB_UPLOAD_CONFIG); $settings->save(); $file = settings_provider::get_module_context_sebconfig_file($this->quiz->cmid); $this->assertSame($file->get_content(), $xml); } /** * Test file manager options. */ public function test_get_filemanager_options() { $expected = [ 'subdirs' => 0, 'maxfiles' => 1, 'accepted_types' => ['.seb'] ]; $this->assertSame($expected, settings_provider::get_filemanager_options()); } /** * Test that users can or can not configure seb settings. */ public function test_can_configure_seb() { $this->resetAfterTest(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->getDataGenerator()->create_module('quiz', ['course' => $this->course->id]); $this->context = \context_module::instance($this->quiz->cmid); $this->setAdminUser(); $this->assertTrue(settings_provider::can_configure_seb($this->context)); $this->set_up_user_and_role(); $this->assertFalse(settings_provider::can_configure_seb($this->context)); assign_capability('quizaccess/seb:manage_seb_requiresafeexambrowser', CAP_ALLOW, $this->roleid, $this->context->id); $this->assertTrue(settings_provider::can_configure_seb($this->context)); } /** * Test that users can or can not use seb template. */ public function test_can_use_seb_template() { $this->resetAfterTest(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->getDataGenerator()->create_module('quiz', ['course' => $this->course->id]); $this->context = \context_module::instance($this->quiz->cmid); $this->setAdminUser(); $this->assertTrue(settings_provider::can_use_seb_template($this->context)); $this->set_up_user_and_role(); $this->assertFalse(settings_provider::can_use_seb_template($this->context)); assign_capability('quizaccess/seb:manage_seb_templateid', CAP_ALLOW, $this->roleid, $this->context->id); $this->assertTrue(settings_provider::can_use_seb_template($this->context)); } /** * Test that users can or can not upload seb config file. */ public function test_can_upload_seb_file() { $this->resetAfterTest(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->getDataGenerator()->create_module('quiz', ['course' => $this->course->id]); $this->context = \context_module::instance($this->quiz->cmid); $this->setAdminUser(); $this->assertTrue(settings_provider::can_upload_seb_file($this->context)); $this->set_up_user_and_role(); $this->assertFalse(settings_provider::can_upload_seb_file($this->context)); assign_capability('quizaccess/seb:manage_filemanager_sebconfigfile', CAP_ALLOW, $this->roleid, $this->context->id); $this->assertTrue(settings_provider::can_upload_seb_file($this->context)); } /** * Test that users can or can not change Show Safe Exam Browser download button setting. */ public function test_can_change_seb_showsebdownloadlink() { $this->resetAfterTest(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->getDataGenerator()->create_module('quiz', ['course' => $this->course->id]); $this->context = \context_module::instance($this->quiz->cmid); $this->setAdminUser(); $this->assertTrue(settings_provider::can_change_seb_showsebdownloadlink($this->context)); $this->set_up_user_and_role(); $this->assertFalse(settings_provider::can_change_seb_showsebdownloadlink($this->context)); assign_capability('quizaccess/seb:manage_seb_showsebdownloadlink', CAP_ALLOW, $this->roleid, $this->context->id); $this->assertTrue(settings_provider::can_change_seb_showsebdownloadlink($this->context)); } /** * Test that users can or can not change Allowed Browser Exam Keys setting. */ public function test_can_change_seb_allowedbrowserexamkeys() { $this->resetAfterTest(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->getDataGenerator()->create_module('quiz', ['course' => $this->course->id]); $this->context = \context_module::instance($this->quiz->cmid); $this->setAdminUser(); $this->assertTrue(settings_provider::can_change_seb_allowedbrowserexamkeys($this->context)); $this->set_up_user_and_role(); $this->assertFalse(settings_provider::can_change_seb_allowedbrowserexamkeys($this->context)); assign_capability('quizaccess/seb:manage_seb_allowedbrowserexamkeys', CAP_ALLOW, $this->roleid, $this->context->id); $this->assertTrue(settings_provider::can_change_seb_allowedbrowserexamkeys($this->context)); } /** * Test that users can or can not Configure SEb manually * * @param string $settingcapability Setting capability to check manual option against. * * @dataProvider settings_capability_data_provider */ public function test_can_configure_manually($settingcapability) { $this->resetAfterTest(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->getDataGenerator()->create_module('quiz', ['course' => $this->course->id]); $this->context = \context_module::instance($this->quiz->cmid); $this->setAdminUser(); $this->assertTrue(settings_provider::can_configure_manually($this->context)); $this->set_up_user_and_role(); $this->assertFalse(settings_provider::can_configure_manually($this->context)); assign_capability($settingcapability, CAP_ALLOW, $this->roleid, $this->context->id); $this->assertTrue(settings_provider::can_configure_manually($this->context)); } /** * Test that we can check if the seb settings are locked. */ public function test_is_seb_settings_locked() { $this->resetAfterTest(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->create_test_quiz($this->course); $user = $this->getDataGenerator()->create_user(); $this->assertFalse(settings_provider::is_seb_settings_locked($this->quiz->id)); $this->attempt_quiz($this->quiz, $user); $this->assertTrue(settings_provider::is_seb_settings_locked($this->quiz->id)); } /** * Test that we can check identify conflicting permissions if set to use template. */ public function test_is_conflicting_permissions_for_manage_templates() { $this->resetAfterTest(); $this->setAdminUser(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->create_test_quiz($this->course, settings_provider::USE_SEB_CONFIG_MANUALLY); $this->context = \context_module::instance($this->quiz->cmid); // Create a template. $template = $this->create_template();
< $settings = quiz_settings::get_record(['quizid' => $this->quiz->id]);
> $settings = seb_quiz_settings::get_record(['quizid' => $this->quiz->id]);
$settings->set('templateid', $template->get('id')); $settings->set('requiresafeexambrowser', settings_provider::USE_SEB_TEMPLATE); $settings->save(); $this->assertFalse(settings_provider::is_conflicting_permissions($this->context)); $this->set_up_user_and_role(); $this->assertTrue(settings_provider::is_conflicting_permissions($this->context)); assign_capability('quizaccess/seb:manage_seb_templateid', CAP_ALLOW, $this->roleid, $this->context->id); $this->assertFalse(settings_provider::is_conflicting_permissions($this->context)); } /** * Test that we can check identify conflicting permissions if set to use own seb file. */ public function test_is_conflicting_permissions_for_upload_seb_file() { $this->resetAfterTest(); $this->setAdminUser(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->create_test_quiz($this->course, settings_provider::USE_SEB_CONFIG_MANUALLY); $this->context = \context_module::instance($this->quiz->cmid); // Save file. $xml = file_get_contents(__DIR__ . '/fixtures/unencrypted.seb'); $draftitemid = $this->create_test_draftarea_file($xml); settings_provider::save_filemanager_sebconfigfile_draftarea($draftitemid, $this->quiz->cmid);
< $settings = quiz_settings::get_record(['quizid' => $this->quiz->id]);
> $settings = seb_quiz_settings::get_record(['quizid' => $this->quiz->id]);
$settings->set('requiresafeexambrowser', settings_provider::USE_SEB_UPLOAD_CONFIG); $settings->save(); $this->assertFalse(settings_provider::is_conflicting_permissions($this->context)); $this->set_up_user_and_role(); assign_capability('quizaccess/seb:manage_filemanager_sebconfigfile', CAP_ALLOW, $this->roleid, $this->context->id); $this->assertFalse(settings_provider::is_conflicting_permissions($this->context)); } /** * Test that we can check identify conflicting permissions if set to use own configure manually. * * @param string $settingcapability Setting capability to check manual option against. * * @dataProvider settings_capability_data_provider */ public function test_is_conflicting_permissions_for_configure_manually($settingcapability) { $this->resetAfterTest(); $this->setAdminUser(); $this->course = $this->getDataGenerator()->create_course(); $this->quiz = $this->create_test_quiz($this->course, settings_provider::USE_SEB_CONFIG_MANUALLY); $this->context = \context_module::instance($this->quiz->cmid); $this->assertFalse(settings_provider::is_conflicting_permissions($this->context)); $this->set_up_user_and_role(); assign_capability($settingcapability, CAP_ALLOW, $this->roleid, $this->context->id); $this->assertFalse(settings_provider::is_conflicting_permissions($this->context)); } /** * Test add_prefix helper method. */ public function test_add_prefix() { $this->assertEquals('seb_one', settings_provider::add_prefix('one')); $this->assertEquals('seb_two', settings_provider::add_prefix('seb_two')); $this->assertEquals('seb_seb_three', settings_provider::add_prefix('seb_seb_three')); $this->assertEquals('seb_', settings_provider::add_prefix('seb_')); $this->assertEquals('seb_', settings_provider::add_prefix('')); $this->assertEquals('seb_one_seb', settings_provider::add_prefix('one_seb')); } /** * Test filter_plugin_settings helper method. */ public function test_filter_plugin_settings() { $test = new \stdClass(); $test->one = 'one'; $test->seb_two = 'two'; $test->seb_seb_three = 'three'; $test->four = 'four'; $newsettings = (array)settings_provider::filter_plugin_settings($test); $this->assertFalse(key_exists('one', $newsettings)); $this->assertFalse(key_exists('four', $newsettings)); $this->assertCount(2, $newsettings); $this->assertEquals('two', $newsettings['two']); $this->assertEquals('three', $newsettings['seb_three']); } /** * Helper method to get a list of settings. * * @return \stdClass */ protected function get_settings() { $allsettings = new \stdClass(); $allsettings->seb_showsebdownloadlink = 0; $allsettings->seb_linkquitseb = 2; $allsettings->seb_userconfirmquit = 3; $allsettings->seb_allowuserquitseb = 4; $allsettings->seb_quitpassword = 5; $allsettings->seb_allowreloadinexam = 6; $allsettings->seb_showsebtaskbar = 7; $allsettings->seb_showreloadbutton = 8; $allsettings->seb_showtime = 9; $allsettings->seb_showkeyboardlayout = 10; $allsettings->seb_showwificontrol = 11; $allsettings->seb_enableaudiocontrol = 12; $allsettings->seb_muteonstartup = 13; $allsettings->seb_allowspellchecking = 14; $allsettings->seb_activateurlfiltering = 15; $allsettings->seb_filterembeddedcontent = 16; $allsettings->seb_expressionsallowed = 17; $allsettings->seb_regexallowed = 18; $allsettings->seb_expressionsblocked = 19; $allsettings->seb_regexblocked = 20; $allsettings->seb_templateid = 21; $allsettings->seb_allowedbrowserexamkeys = 22; return $allsettings; } /** * Helper method to assert results of filter_plugin_settings * * @param int $type Type of SEB usage. * @param array $notnulls A list of expected not null settings. */ protected function assert_filter_plugin_settings(int $type, array $notnulls) { $allsettings = $this->get_settings(); $allsettings->seb_requiresafeexambrowser = $type; $actual = settings_provider::filter_plugin_settings($allsettings); $expected = (array)$allsettings; foreach ($actual as $name => $value) { if (in_array($name, $notnulls)) { $this->assertEquals($expected['seb_' . $name], $value); } else { $this->assertNull($value); } } } /** * Test filter_plugin_settings method for no SEB case. */ public function test_filter_plugin_settings_for_no_seb() { $notnulls = ['requiresafeexambrowser']; $this->assert_filter_plugin_settings(settings_provider::USE_SEB_NO, $notnulls); } /** * Test filter_plugin_settings method for using uploaded config. */ public function test_filter_plugin_settings_for_uploaded_config() { $notnulls = ['requiresafeexambrowser', 'showsebdownloadlink', 'allowedbrowserexamkeys']; $this->assert_filter_plugin_settings(settings_provider::USE_SEB_UPLOAD_CONFIG, $notnulls); } /** * Test filter_plugin_settings method for using template. */ public function test_filter_plugin_settings_for_template() { $notnulls = ['requiresafeexambrowser', 'showsebdownloadlink', 'allowuserquitseb', 'quitpassword', 'templateid']; $this->assert_filter_plugin_settings(settings_provider::USE_SEB_TEMPLATE, $notnulls); } /** * Test filter_plugin_settings method for using client config. */ public function test_filter_plugin_settings_for_client_config() { $notnulls = ['requiresafeexambrowser', 'showsebdownloadlink', 'allowedbrowserexamkeys']; $this->assert_filter_plugin_settings(settings_provider::USE_SEB_CLIENT_CONFIG, $notnulls); } /** * Test filter_plugin_settings method for manually configured SEB. */ public function test_filter_plugin_settings_for_configure_manually() { $allsettings = $this->get_settings(); $allsettings->seb_requiresafeexambrowser = settings_provider::USE_SEB_CONFIG_MANUALLY; $actual = settings_provider::filter_plugin_settings($allsettings); // For manual it's easier to check nulls, as most of the settings are not null. $nulls = ['templateid', 'allowedbrowserexamkeys']; $expected = (array)$allsettings; foreach ($actual as $name => $value) { if (in_array($name, $nulls)) { $this->assertNull($value); } else { $this->assertEquals($expected['seb_' . $name], $value); } } } /** * Test settings map. */ public function test_get_seb_settings_map() { $expected = [ settings_provider::USE_SEB_NO => [ ], settings_provider::USE_SEB_CONFIG_MANUALLY => [ 'seb_showsebdownloadlink' => [], 'seb_linkquitseb' => [], 'seb_userconfirmquit' => [], 'seb_allowuserquitseb' => [ 'seb_quitpassword' => [] ], 'seb_allowreloadinexam' => [], 'seb_showsebtaskbar' => [ 'seb_showreloadbutton' => [], 'seb_showtime' => [], 'seb_showkeyboardlayout' => [], 'seb_showwificontrol' => [], ], 'seb_enableaudiocontrol' => [ 'seb_muteonstartup' => [], ], 'seb_allowspellchecking' => [], 'seb_activateurlfiltering' => [ 'seb_filterembeddedcontent' => [], 'seb_expressionsallowed' => [], 'seb_regexallowed' => [], 'seb_expressionsblocked' => [], 'seb_regexblocked' => [], ], ], settings_provider::USE_SEB_TEMPLATE => [ 'seb_templateid' => [], 'seb_showsebdownloadlink' => [], 'seb_allowuserquitseb' => [ 'seb_quitpassword' => [], ], ], settings_provider::USE_SEB_UPLOAD_CONFIG => [ 'filemanager_sebconfigfile' => [], 'seb_showsebdownloadlink' => [], 'seb_allowedbrowserexamkeys' => [], ], settings_provider::USE_SEB_CLIENT_CONFIG => [ 'seb_showsebdownloadlink' => [], 'seb_allowedbrowserexamkeys' => [], ], ]; $this->assertEquals($expected, settings_provider::get_seb_settings_map()); } }