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 namespace core_adminpresets; 18 19 /** 20 * Tests for the helper class. 21 * 22 * @package core_adminpresets 23 * @category test 24 * @copyright 2021 Sara Arjona (sara@moodle.com) 25 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 26 * @coversDefaultClass helper 27 */ 28 class helper_test extends \advanced_testcase { 29 30 /** 31 * Test the behaviour of create_preset() method. 32 * 33 * @covers ::create_preset 34 * @dataProvider create_preset_provider 35 * 36 * @param string|null $name Preset name field. 37 * @param string|null $comments Preset comments field. 38 * @param int|null $iscore Preset iscore field. 39 * @param int|null $iscoreresult Expected iscore value for the result preset. 40 */ 41 public function test_create_preset(?string $name = null, ?string $comments = null, ?int $iscore = null, 42 ?int $iscoreresult = null): void { 43 global $CFG, $DB, $USER; 44 45 $this->resetAfterTest(); 46 47 $data = []; 48 if (isset($name)) { 49 $data['name'] = $name; 50 } 51 if (isset($comments)) { 52 $data['comments'] = $comments; 53 } 54 if (isset($iscore)) { 55 $data['iscore'] = $iscore; 56 } 57 if (!isset($iscoreresult)) { 58 $iscoreresult = manager::NONCORE_PRESET; 59 } 60 61 // Create a preset. 62 $presetid = helper::create_preset($data); 63 64 // Check the preset data. 65 $preset = $DB->get_record('adminpresets', ['id' => $presetid]); 66 67 $this->assertEquals($name, $preset->name); 68 $this->assertEquals($comments, $preset->comments); 69 $this->assertEquals(fullname($USER), $preset->author); 70 $this->assertEquals($iscoreresult, $preset->iscore); 71 $this->assertEquals($CFG->version, $preset->moodleversion); 72 $this->assertEquals($CFG->release, $preset->moodlerelease); 73 $this->assertEquals($CFG->wwwroot, $preset->site); 74 75 // Check the preset is empty and hasn't settings or plugins. 76 $settings = $DB->get_records('adminpresets_it', ['adminpresetid' => $presetid]); 77 $this->assertCount(0, $settings); 78 $plugins = $DB->get_records('adminpresets_plug', ['adminpresetid' => $presetid]); 79 $this->assertCount(0, $plugins); 80 } 81 82 /** 83 * Data provider for test_create_preset(). 84 * 85 * @return array 86 */ 87 public function create_preset_provider(): array { 88 return [ 89 'Default values' => [ 90 ], 91 'Name not empty' => [ 92 'name' => 'Preset xaxi name', 93 ], 94 'Comments not empty' => [ 95 'name' => null, 96 'comments' => 'This is a different comment', 97 ], 98 'Name and comments not empty' => [ 99 'name' => 'Preset with a super-nice name', 100 'comments' => 'This is a comment different from the previous one', 101 ], 102 'Starter preset' => [ 103 'name' => 'Starter', 104 'comments' => null, 105 'iscore' => manager::STARTER_PRESET, 106 'iscoreresult' => manager::STARTER_PRESET, 107 ], 108 'Full preset' => [ 109 'name' => 'Full', 110 'comments' => null, 111 'iscore' => manager::FULL_PRESET, 112 'iscoreresult' => manager::FULL_PRESET, 113 ], 114 'Invalid iscore' => [ 115 'name' => 'Invalid iscore value', 116 'comments' => null, 117 'iscore' => -1, 118 'iscoreresult' => manager::NONCORE_PRESET, 119 ], 120 ]; 121 } 122 123 /** 124 * Test the behaviour of add_item() method. 125 * 126 * @covers ::add_item 127 * @dataProvider add_item_provider 128 * 129 * @param string $name Item name. 130 * @param string $value Item value. 131 * @param string|null $plugin Item plugin. 132 * @param string|null $advname If the item is an advanced setting, the name of the advanced setting should be specified here. 133 * @param string|null $advvalue If the item is an advanced setting, the value of the advanced setting should be specified here. 134 */ 135 public function test_add_item(string $name, string $value, ?string $plugin = 'none', ?string $advname = null, 136 ?string $advvalue = null): void { 137 global $DB; 138 139 $this->resetAfterTest(); 140 141 // Create a preset. 142 $presetid = helper::create_preset([]); 143 $this->assertEquals(1, $DB->count_records('adminpresets', ['id' => $presetid])); 144 145 // Add items. 146 $itemid = helper::add_item($presetid, $name, $value, $plugin, $advname, $advvalue); 147 148 // Check settings have been created. 149 $settings = $DB->get_records('adminpresets_it', ['adminpresetid' => $presetid]); 150 $this->assertCount(1, $settings); 151 152 $setting = reset($settings); 153 $this->assertEquals($itemid, $setting->id); 154 $this->assertEquals($name, $setting->name); 155 $this->assertEquals($value, $setting->value); 156 $this->assertEquals($plugin, $setting->plugin); 157 158 if ($advname) { 159 // Check settings have been created. 160 $advsettings = $DB->get_records('adminpresets_it_a', ['itemid' => $itemid]); 161 $this->assertCount(1, $advsettings); 162 163 $advsetting = reset($advsettings); 164 $this->assertEquals($advname, $advsetting->name); 165 $this->assertEquals($advvalue, $advsetting->value); 166 } else { 167 // Check no advanced items have been created. 168 $this->assertEquals(0, $DB->count_records('adminpresets_it_a', ['itemid' => $itemid])); 169 } 170 171 // Check no plugins have been created. 172 $this->assertEquals(0, $DB->count_records('adminpresets_plug', ['adminpresetid' => $presetid])); 173 } 174 175 /** 176 * Data provider for test_add_item(). 177 * 178 * @return array 179 */ 180 public function add_item_provider(): array { 181 return [ 182 'Setting without plugin' => [ 183 'name' => 'settingname', 184 'value' => 'thisisthevalue', 185 ], 186 'Setting with plugin' => [ 187 'name' => 'settingname', 188 'value' => 'thisisthevalue', 189 'plugin' => 'pluginname', 190 ], 191 'Setting with advanced item' => [ 192 'name' => 'settingname', 193 'value' => 'thevalue', 194 'plugin' => 'pluginname', 195 'advname' => 'advsettingname', 196 'advvalue' => 'advsettingvalue', 197 ], 198 ]; 199 } 200 201 /** 202 * Test the behaviour of add_plugin() method. 203 * 204 * @covers ::add_plugin 205 * @dataProvider add_plugin_provider 206 * 207 * @param string $type Plugin type. 208 * @param string $name Plugin name. 209 * @param mixed $enabled Whether the plugin will be enabled or not. 210 */ 211 public function test_add_plugin(string $type, string $name, $enabled = 0): void { 212 global $DB; 213 214 $this->resetAfterTest(); 215 216 // Create a preset. 217 $presetid = helper::create_preset([]); 218 $this->assertEquals(1, $DB->count_records('adminpresets', ['id' => $presetid])); 219 220 // Add plugin. 221 $pluginid = helper::add_plugin($presetid, $type, $name, $enabled); 222 223 // Check plugin has been created. 224 $pluggins = $DB->get_records('adminpresets_plug', ['adminpresetid' => $presetid]); 225 $this->assertCount(1, $pluggins); 226 227 $plugin = reset($pluggins); 228 $this->assertEquals($pluginid, $plugin->id); 229 $this->assertEquals($type, $plugin->plugin); 230 $this->assertEquals($name, $plugin->name); 231 $this->assertEquals((int) $enabled, $plugin->enabled); 232 233 // Check no settings have been created. 234 $this->assertEquals(0, $DB->count_records('adminpresets_it', ['adminpresetid' => $presetid])); 235 } 236 237 /** 238 * Data provider for test_add_plugin(). 239 * 240 * @return array 241 */ 242 public function add_plugin_provider(): array { 243 return [ 244 'Plugin: enabled (using int)' => [ 245 'type' => 'plugintype', 246 'name' => 'pluginname', 247 'enabled' => 1, 248 ], 249 'Plugin: enabled (using bool)' => [ 250 'type' => 'plugintype', 251 'name' => 'pluginname', 252 'enabled' => true, 253 ], 254 'Plugin: disabled (using int)' => [ 255 'type' => 'plugintype', 256 'name' => 'pluginname', 257 'enabled' => 0, 258 ], 259 'Plugin: disabled (using bool)' => [ 260 'type' => 'plugintype', 261 'name' => 'pluginname', 262 'enabled' => false, 263 ], 264 'Plugin: negative int value' => [ 265 'type' => 'plugintype', 266 'name' => 'pluginname', 267 'enabled' => -9999, 268 ], 269 ]; 270 } 271 272 /** 273 * Test the behaviour of change_default_preset() method. 274 * 275 * @covers ::change_default_preset 276 * @dataProvider change_default_preset_provider 277 * 278 * @param string $preset The preset name to apply or the path to the XML to be imported and applied. 279 * @param array|null $settings A few settings to check (with their expected values). 280 * @param array|null $plugins A few module plugins to check (with their expected values for the visibility). 281 */ 282 public function test_change_default_preset(string $preset, ?array $settings = null, ?array $plugins = null): void { 283 $this->resetAfterTest(); 284 $this->setAdminUser(); 285 286 // We need to change some of the default values; otherwise, the full preset won't be applied, because all the settings 287 // and plugins are the same. 288 set_config('enableanalytics', '0'); 289 290 $generator = $this->getDataGenerator()->get_plugin_generator('core_adminpresets'); 291 $generator->create_preset(['name' => 'Preset 1']); 292 293 $presetid = helper::change_default_preset($preset); 294 295 if (empty($settings) && empty($plugins)) { 296 // The preset hasn't been applied. 297 $this->assertNull($presetid); 298 } else { 299 // The preset has been applied. Check the settings and plugins are the expected. 300 $this->assertNotEmpty($presetid); 301 302 // Check the setting values have changed accordingly with the ones defined in the preset. 303 foreach ($settings as $settingname => $settingvalue) { 304 $this->assertEquals($settingvalue, get_config('core', $settingname)); 305 } 306 307 // Check the plugins visibility have changed accordingly with the ones defined in the preset. 308 $enabledplugins = \core\plugininfo\mod::get_enabled_plugins(); 309 foreach ($plugins as $pluginname => $pluginvalue) { 310 if ($pluginvalue) { 311 $this->assertArrayHasKey($pluginname, $enabledplugins); 312 } else { 313 $this->assertArrayNotHasKey($pluginname, $enabledplugins); 314 } 315 } 316 } 317 } 318 319 /** 320 * Data provider for test_change_default_preset(). 321 * 322 * @return array 323 */ 324 public function change_default_preset_provider(): array { 325 return [ 326 'Starter preset' => [ 327 'preset' => 'starter', 328 'settings' => [ 329 'enablebadges' => 0, 330 'enableportfolios' => 0, 331 ], 332 'plugins' => [ 333 'assign' => 1, 334 'chat' => 0, 335 'data' => 0, 336 'lesson' => 0, 337 ], 338 ], 339 'Full preset' => [ 340 'preset' => 'full', 341 'settings' => [ 342 'enablebadges' => 1, 343 'enableportfolios' => 0, 344 ], 345 'plugins' => [ 346 'assign' => 1, 347 'chat' => 1, 348 'data' => 1, 349 'lesson' => 1, 350 ], 351 ], 352 'Preset 1, created manually' => [ 353 'preset' => 'Preset 1', 354 'settings' => [ 355 'enablebadges' => 0, 356 'allowemojipicker' => 1, 357 ], 358 'plugins' => [ 359 'assign' => 1, 360 'glossary' => 0, 361 ], 362 ], 363 'Unexisting preset name' => [ 364 'preset' => 'unexisting', 365 ], 366 'Valid XML file' => [ 367 'preset' => __DIR__ . '/fixtures/import_settings_plugins.xml', 368 'settings' => [ 369 'allowemojipicker' => 1, 370 'enableportfolios' => 1, 371 ], 372 'plugins' => [ 373 'assign' => 1, 374 'chat' => 0, 375 'data' => 0, 376 'lesson' => 1, 377 ], 378 ], 379 'Invalid XML file' => [ 380 'preset' => __DIR__ . '/fixtures/invalid_xml_file.xml', 381 ], 382 'Unexisting XML file' => [ 383 'preset' => __DIR__ . '/fixtures/unexisting.xml', 384 ], 385 ]; 386 } 387 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body