1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 /** 18 * Unit tests for current_language() in moodlelib.php. 19 * 20 * @package core 21 * @category test 22 * @copyright 2022 The Open University 23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 24 */ 25 26 namespace core; 27 28 use moodle_page; 29 30 defined('MOODLE_INTERNAL') || die(); 31 32 /** 33 * Unit tests for current_language() in moodlelib.php. 34 * 35 * @copyright 2022 The Open University 36 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 37 * @covers ::current_language 38 */ 39 class moodlelib_current_language_test extends \advanced_testcase { 40 41 public function test_current_language_site_default(): void { 42 $this->resetAfterTest(); 43 testable_string_manager_for_current_language_tests::set_fake_list_of_installed_languages( 44 ['en' => 'English', 'en_ar' => 'English (pirate)']); 45 46 set_config('lang', 'en_ar'); 47 48 $this->assertEquals('en_ar', current_language()); 49 50 testable_string_manager_for_current_language_tests::reset_installed_languages_override(); 51 } 52 53 public function test_current_language_user_pref(): void { 54 $this->resetAfterTest(); 55 testable_string_manager_for_current_language_tests::set_fake_list_of_installed_languages( 56 ['en' => 'English', 'en_ar' => 'English (pirate)', 'fr' => 'French']); 57 58 set_config('lang', 'en_ar'); 59 $this->setUser($this->getDataGenerator()->create_user(['lang' => 'fr'])); 60 61 $this->assertEquals('fr', current_language()); 62 63 testable_string_manager_for_current_language_tests::reset_installed_languages_override(); 64 } 65 66 public function test_current_language_forced(): void { 67 $this->resetAfterTest(); 68 testable_string_manager_for_current_language_tests::set_fake_list_of_installed_languages( 69 ['en' => 'English', 'en_ar' => 'English (pirate)', 'fr' => 'French', 'de' => 'German']); 70 71 set_config('lang', 'en_ar'); 72 $this->setUser($this->getDataGenerator()->create_user(['lang' => 'fr'])); 73 force_current_language('en'); 74 75 $this->assertEquals('en', current_language()); 76 } 77 78 public function test_current_language_course_setting(): void { 79 global $PAGE; 80 $this->resetAfterTest(); 81 testable_string_manager_for_current_language_tests::set_fake_list_of_installed_languages( 82 ['en' => 'English', 'en_ar' => 'English (pirate)', 'fr' => 'French']); 83 84 set_config('lang', 'en_ar'); 85 $this->setUser($this->getDataGenerator()->create_user(['lang' => 'fr'])); 86 $PAGE = new moodle_page(); 87 $PAGE->set_course($this->getDataGenerator()->create_course(['lang' => 'de'])); 88 89 $this->assertEquals('de', current_language()); 90 91 testable_string_manager_for_current_language_tests::reset_installed_languages_override(); 92 } 93 94 public function test_current_language_in_course_no_lang_set(): void { 95 global $PAGE; 96 $this->resetAfterTest(); 97 testable_string_manager_for_current_language_tests::set_fake_list_of_installed_languages( 98 ['en' => 'English', 'en_ar' => 'English (pirate)', 'fr' => 'French']); 99 100 set_config('lang', 'en_ar'); 101 $PAGE = new moodle_page(); 102 $PAGE->set_course($this->getDataGenerator()->create_course()); 103 104 $this->assertEquals('en_ar', current_language()); 105 106 testable_string_manager_for_current_language_tests::reset_installed_languages_override(); 107 } 108 109 public function test_current_language_activity_setting(): void { 110 global $PAGE; 111 $this->resetAfterTest(); 112 testable_string_manager_for_current_language_tests::set_fake_list_of_installed_languages( 113 ['en' => 'English', 'en_ar' => 'English (pirate)', 'fr' => 'French']); 114 115 $this->setAdminUser(); 116 $course = $this->getDataGenerator()->create_course(['lang' => 'de']); 117 $pageactivity = $this->getDataGenerator()->create_module('page', ['course' => $course->id, 'lang' => 'en']); 118 $cm = get_fast_modinfo($course)->get_cm($pageactivity->cmid); 119 120 set_config('lang', 'en_ar'); 121 $this->setUser($this->getDataGenerator()->create_user(['lang' => 'fr'])); 122 $PAGE = new moodle_page(); 123 $PAGE->set_cm($cm, $course, $pageactivity); 124 125 $this->assertEquals('en', current_language()); 126 127 testable_string_manager_for_current_language_tests::reset_installed_languages_override(); 128 } 129 130 public function test_current_language_activity_setting_not_set(): void { 131 global $PAGE; 132 $this->resetAfterTest(); 133 testable_string_manager_for_current_language_tests::set_fake_list_of_installed_languages( 134 ['en' => 'English', 'en_ar' => 'English (pirate)', 'fr' => 'French']); 135 136 $this->setAdminUser(); 137 $course = $this->getDataGenerator()->create_course(['lang' => 'de']); 138 $pageactivity = $this->getDataGenerator()->create_module('page', ['course' => $course->id]); 139 $cm = get_fast_modinfo($course)->get_cm($pageactivity->cmid); 140 141 set_config('lang', 'en_ar'); 142 $this->setUser($this->getDataGenerator()->create_user(['lang' => 'fr'])); 143 $PAGE = new moodle_page(); 144 $PAGE->set_cm($cm, $course, $pageactivity); 145 146 $this->assertEquals('de', current_language()); 147 148 testable_string_manager_for_current_language_tests::reset_installed_languages_override(); 149 } 150 } 151 152 153 /** 154 * Test helper class for test which need Moodle to think there are other languages installed. 155 * 156 * @copyright 2022 The Open University 157 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 158 */ 159 class testable_string_manager_for_current_language_tests extends \core_string_manager_standard { 160 161 /** @var array $installedlanguages list of languages which we want to pretend are installed. */ 162 protected $installedlanguages; 163 164 /** 165 * Start pretending that the list of installed languages is other than what it is. 166 * 167 * You need to pass in an array like ['en' => 'English', 'fr' => 'French']. 168 * 169 * @param array $installedlanguages the list of languages to assume are installed. 170 */ 171 public static function set_fake_list_of_installed_languages(array $installedlanguages): void { 172 global $CFG; 173 174 // Re-create the custom string-manager instance using this class, and force the thing we are overriding. 175 $oldsetting = $CFG->config_php_settings['customstringmanager'] ?? null; 176 $CFG->config_php_settings['customstringmanager'] = self::class; 177 get_string_manager(true)->installedlanguages = $installedlanguages; 178 179 // Reset the setting we overrode. 180 unset($CFG->config_php_settings['customstringmanager']); 181 if ($oldsetting) { 182 $CFG->config_php_settings['customstringmanager'] = $oldsetting; 183 } 184 } 185 186 /** 187 * Must be called at the end of any test which called set_fake_list_of_installed_languages to reset things. 188 */ 189 public static function reset_installed_languages_override(): void { 190 get_string_manager(true); 191 } 192 193 public function get_list_of_translations($returnall = false) { 194 return $this->installedlanguages; 195 } 196 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body