See Release Notes
Long Term Support Release
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 mod_data; 18 19 use context_module; 20 use moodle_url; 21 use core_component; 22 use stdClass; 23 24 /** 25 * Manager tests class for mod_data. 26 * 27 * @package mod_data 28 * @category test 29 * @copyright 2022 Ferran Recio <ferran@moodle.com> 30 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 31 * @coversDefaultClass \mod_data\manager 32 */ 33 class manager_test extends \advanced_testcase { 34 35 /** 36 * Test for static create methods. 37 * 38 * @covers ::create_from_instance 39 * @covers ::create_from_coursemodule 40 * @covers ::create_from_data_record 41 */ 42 public function test_create() { 43 44 $this->resetAfterTest(); 45 $this->setAdminUser(); 46 47 $course = $this->getDataGenerator()->create_course(); 48 $activity = $this->getDataGenerator()->create_module(manager::MODULE, ['course' => $course]); 49 $cm = get_coursemodule_from_id(manager::MODULE, $activity->cmid, 0, false, MUST_EXIST); 50 $context = context_module::instance($cm->id); 51 52 $manager = manager::create_from_instance($activity); 53 $manageractivity = $manager->get_instance(); 54 $this->assertEquals($activity->id, $manageractivity->id); 55 $managercm = $manager->get_coursemodule(); 56 $this->assertEquals($cm->id, $managercm->id); 57 $managercontext = $manager->get_context(); 58 $this->assertEquals($context->id, $managercontext->id); 59 60 $manager = manager::create_from_coursemodule($cm); 61 $manageractivity = $manager->get_instance(); 62 $this->assertEquals($activity->id, $manageractivity->id); 63 $managercm = $manager->get_coursemodule(); 64 $this->assertEquals($cm->id, $managercm->id); 65 $managercontext = $manager->get_context(); 66 $this->assertEquals($context->id, $managercontext->id); 67 68 $datarecord = (object)[ 69 'dataid' => $activity->id, 70 'id' => 0, 71 'userid' => 0, 72 'groupid' => 0, 73 'timecreated' => 0, 74 'timemodified' => 0, 75 'approved' => 0, 76 ]; 77 $manager = manager::create_from_data_record($datarecord); 78 $manageractivity = $manager->get_instance(); 79 $this->assertEquals($activity->id, $manageractivity->id); 80 $managercm = $manager->get_coursemodule(); 81 $this->assertEquals($cm->id, $managercm->id); 82 $managercontext = $manager->get_context(); 83 $this->assertEquals($context->id, $managercontext->id); 84 } 85 86 /** 87 * Test set_module_viewed 88 * @covers ::set_module_viewed 89 */ 90 public function test_set_module_viewed() { 91 global $CFG; 92 93 $CFG->enablecompletion = 1; 94 $this->resetAfterTest(); 95 $this->setAdminUser(); 96 97 // Setup test data. 98 $course = $this->getDataGenerator()->create_course(['enablecompletion' => 1]); 99 $instance = $this->getDataGenerator()->create_module( 100 'data', 101 ['course' => $course->id], 102 ['completion' => 2, 'completionview' => 1] 103 ); 104 $manager = manager::create_from_instance($instance); 105 $context = $manager->get_context(); 106 $cm = $manager->get_coursemodule(); 107 108 // Trigger and capture the event. 109 $sink = $this->redirectEvents(); 110 111 $manager->set_module_viewed($course); 112 113 $events = $sink->get_events(); 114 // 2 additional events thanks to completion. 115 $this->assertCount(3, $events); 116 $event = array_shift($events); 117 118 // Checking that the event contains the expected values. 119 $this->assertInstanceOf('\mod_data\event\course_module_viewed', $event); 120 $this->assertEquals($context, $event->get_context()); 121 $moodleurl = new moodle_url('/mod/data/view.php', ['id' => $cm->id]); 122 $this->assertEquals($moodleurl, $event->get_url()); 123 $this->assertEventContextNotUsed($event); 124 $this->assertNotEmpty($event->get_name()); 125 126 // Check completion status. 127 $completion = new \completion_info($course); 128 $completiondata = $completion->get_data($cm); 129 $this->assertEquals(1, $completiondata->completionstate); 130 } 131 132 /** 133 * Test set_template_viewed 134 * @covers ::set_template_viewed 135 */ 136 public function test_set_template_viewed() { 137 $this->resetAfterTest(); 138 $this->setAdminUser(); 139 140 // Setup test data. 141 $course = $this->getDataGenerator()->create_course(); 142 $instance = $this->getDataGenerator()->create_module( 143 'data', 144 ['course' => $course->id] 145 ); 146 $manager = manager::create_from_instance($instance); 147 $context = $manager->get_context(); 148 149 // Trigger and capture the event. 150 $sink = $this->redirectEvents(); 151 152 $manager->set_template_viewed(); 153 154 $events = $sink->get_events(); 155 $this->assertCount(1, $events); 156 $event = reset($events); 157 158 // Checking that the event contains the expected values. 159 $this->assertInstanceOf('mod_data\event\template_viewed', $event); 160 $this->assertEquals($context, $event->get_context()); 161 $moodleurl = new moodle_url('/mod/data/templates.php', ['d' => $instance->id]); 162 $this->assertEquals($moodleurl, $event->get_url()); 163 $this->assertEventContextNotUsed($event); 164 $this->assertNotEmpty($event->get_name()); 165 } 166 167 /** 168 * Test for has_records(). 169 * 170 * @covers ::has_records 171 */ 172 public function test_has_records() { 173 global $DB; 174 175 $this->resetAfterTest(); 176 177 $course = $this->getDataGenerator()->create_course(); 178 $data = $this->getDataGenerator()->create_module(manager::MODULE, ['course' => $course]); 179 $manager = manager::create_from_instance($data); 180 181 // Empty database should return false. 182 $this->assertFalse($manager->has_records()); 183 184 // Create data record. 185 $datarecords = new \stdClass(); 186 $datarecords->userid = '2'; 187 $datarecords->dataid = $data->id; 188 $datarecords->id = $DB->insert_record('data_records', $datarecords); 189 190 // Database with records should return true. 191 $this->assertTrue($manager->has_records()); 192 } 193 194 /** 195 * Test for has_fields(). 196 * 197 * @covers ::has_fields 198 */ 199 public function test_has_fields() { 200 $this->resetAfterTest(); 201 202 $course = $this->getDataGenerator()->create_course(); 203 $activity = $this->getDataGenerator()->create_module(manager::MODULE, ['course' => $course]); 204 $manager = manager::create_from_instance($activity); 205 206 // Empty database should return false. 207 $this->assertFalse($manager->has_fields()); 208 209 // Add a field to the activity. 210 $datagenerator = $this->getDataGenerator()->get_plugin_generator('mod_data'); 211 $fieldrecord = new \stdClass(); 212 $fieldrecord->name = 'field1'; 213 $fieldrecord->type = 'text'; 214 $datagenerator->create_field($fieldrecord, $activity); 215 216 // Database with fields should return true. 217 $this->assertTrue($manager->has_fields()); 218 } 219 220 /** 221 * Test for get_available_presets(). 222 * 223 * @covers ::get_available_presets 224 */ 225 public function test_get_available_presets() { 226 global $DB; 227 228 $this->resetAfterTest(); 229 230 $course = $this->getDataGenerator()->create_course(); 231 $user = $this->getDataGenerator()->create_and_enrol($course, 'teacher'); 232 $this->setUser($user); 233 234 $activity = $this->getDataGenerator()->create_module(manager::MODULE, ['course' => $course]); 235 $cm = get_coursemodule_from_id(manager::MODULE, $activity->cmid, 0, false, MUST_EXIST); 236 237 // Check available presets meet the datapreset plugins when there are no any preset saved by users. 238 $datapresetplugins = core_component::get_plugin_list('datapreset'); 239 $manager = manager::create_from_coursemodule($cm); 240 $presets = $manager->get_available_presets(); 241 $this->assertCount(count($datapresetplugins), $presets); 242 // Confirm that, at least, the "Image gallery" is one of them. 243 $namepresets = array_map(function($preset) { 244 return $preset->name; 245 }, $presets); 246 $this->assertContains('Image gallery', $namepresets); 247 248 // Login as admin and create some presets saved manually by users. 249 $this->setAdminUser(); 250 $plugingenerator = $this->getDataGenerator()->get_plugin_generator('mod_data'); 251 $savedpresets = []; 252 for ($i = 1; $i <= 3; $i++) { 253 $preset = (object) [ 254 'name' => 'Preset name ' . $i, 255 ]; 256 $plugingenerator->create_preset($activity, $preset); 257 $savedpresets[] = $preset; 258 } 259 $savedpresetsnames = array_map(function($preset) { 260 return $preset->name; 261 }, $savedpresets); 262 $this->setUser($user); 263 264 // Check available presets meet the datapreset plugins + presets saved manually by users. 265 $presets = $manager->get_available_presets(); 266 $this->assertCount(count($datapresetplugins) + count($savedpresets), $presets); 267 // Confirm that, apart from the "Image gallery" preset, the ones created manually have been also returned. 268 $namepresets = array_map(function($preset) { 269 return $preset->name; 270 }, $presets); 271 $this->assertContains('Image gallery', $namepresets); 272 foreach ($savedpresets as $savedpreset) { 273 $this->assertContains($savedpreset->name, $namepresets); 274 } 275 // Check all the presets have the proper value for the isplugin attribute. 276 foreach ($presets as $preset) { 277 if (in_array($preset->name, $savedpresetsnames)) { 278 $this->assertFalse($preset->isplugin); 279 } else { 280 $this->assertTrue($preset->isplugin); 281 } 282 } 283 284 // Unassign the capability to the teacher role and check that only plugin presets are returned (because the saved presets 285 // have been created by admin). 286 $teacherrole = $DB->get_record('role', ['shortname' => 'teacher']); 287 unassign_capability('mod/data:viewalluserpresets', $teacherrole->id); 288 $presets = $manager->get_available_presets(); 289 $this->assertCount(count($datapresetplugins), $presets); 290 // Confirm that, at least, the "Image gallery" is one of them. 291 $namepresets = array_map(function($preset) { 292 return $preset->name; 293 }, $presets); 294 $this->assertContains('Image gallery', $namepresets); 295 foreach ($savedpresets as $savedpreset) { 296 $this->assertNotContains($savedpreset->name, $namepresets); 297 } 298 299 // Create a preset with the current user and check that, although the viewalluserpresets is not assigned to the teacher 300 // role, the preset is returned because the teacher is the owner. 301 $savedpreset = (object) [ 302 'name' => 'Preset created by teacher', 303 ]; 304 $plugingenerator->create_preset($activity, $savedpreset); 305 $presets = $manager->get_available_presets(); 306 // The presets total is all the plugin presets plus the preset created by the teacher. 307 $this->assertCount(count($datapresetplugins) + 1, $presets); 308 // Confirm that, at least, the "Image gallery" is one of them. 309 $namepresets = array_map(function($preset) { 310 return $preset->name; 311 }, $presets); 312 $this->assertContains('Image gallery', $namepresets); 313 // Confirm that savedpresets are still not returned. 314 foreach ($savedpresets as $savedpreset) { 315 $this->assertNotContains($savedpreset->name, $namepresets); 316 } 317 // Confirm the new preset created by the teacher is returned too. 318 $this->assertContains('Preset created by teacher', $namepresets); 319 } 320 321 /** 322 * Test for get_available_plugin_presets(). 323 * 324 * @covers ::get_available_plugin_presets 325 */ 326 public function test_get_available_plugin_presets() { 327 $this->resetAfterTest(); 328 $this->setAdminUser(); 329 330 $course = $this->getDataGenerator()->create_course(); 331 $activity = $this->getDataGenerator()->create_module(manager::MODULE, ['course' => $course]); 332 333 // Check available plugin presets meet the datapreset plugins. 334 $datapresetplugins = core_component::get_plugin_list('datapreset'); 335 $manager = manager::create_from_instance($activity); 336 $presets = $manager->get_available_plugin_presets(); 337 $this->assertCount(count($datapresetplugins), $presets); 338 // Confirm that, at least, the "Image gallery" is one of them. 339 $namepresets = array_map(function($preset) { 340 return $preset->name; 341 }, $presets); 342 $this->assertContains('Image gallery', $namepresets); 343 344 // Create a preset saved manually by users. 345 $savedpreset = (object) [ 346 'name' => 'Preset name 1', 347 ]; 348 $plugingenerator = $this->getDataGenerator()->get_plugin_generator('mod_data'); 349 $plugingenerator->create_preset($activity, $savedpreset); 350 351 // Check available plugin presets don't contain the preset saved manually. 352 $presets = $manager->get_available_plugin_presets(); 353 $this->assertCount(count($datapresetplugins), $presets); 354 // Confirm that, at least, the "Image gallery" is one of them. 355 $namepresets = array_map(function($preset) { 356 return $preset->name; 357 }, $presets); 358 $this->assertContains('Image gallery', $namepresets); 359 // Confirm that the preset saved manually hasn't been returned. 360 $this->assertNotContains($savedpreset->name, $namepresets); 361 // Check all the presets have the proper value for the isplugin attribute. 362 foreach ($presets as $preset) { 363 $this->assertTrue($preset->isplugin); 364 } 365 } 366 367 /** 368 * Test for get_available_saved_presets(). 369 * 370 * @covers ::get_available_saved_presets 371 */ 372 public function test_get_available_saved_presets() { 373 global $DB; 374 375 $this->resetAfterTest(); 376 377 $course = $this->getDataGenerator()->create_course(); 378 $user = $this->getDataGenerator()->create_and_enrol($course, 'teacher'); 379 $this->setUser($user); 380 381 $activity = $this->getDataGenerator()->create_module(manager::MODULE, ['course' => $course]); 382 $cm = get_coursemodule_from_id(manager::MODULE, $activity->cmid, 0, false, MUST_EXIST); 383 384 // Check available saved presets is empty (because, for now, no user preset has been created). 385 $manager = manager::create_from_coursemodule($cm); 386 $presets = $manager->get_available_saved_presets(); 387 $this->assertCount(0, $presets); 388 389 // Create some presets saved manually by the admin user. 390 $this->setAdminUser(); 391 $plugingenerator = $this->getDataGenerator()->get_plugin_generator('mod_data'); 392 $savedpresets = []; 393 for ($i = 1; $i <= 3; $i++) { 394 $preset = (object) [ 395 'name' => 'Preset name ' . $i, 396 ]; 397 $plugingenerator->create_preset($activity, $preset); 398 $savedpresets[] = $preset; 399 } 400 // Create one more preset saved manually by the teacher user. 401 $this->setUser($user); 402 $teacherpreset = (object) [ 403 'name' => 'Preset created by teacher', 404 ]; 405 $plugingenerator->create_preset($activity, $teacherpreset); 406 $savedpresets[] = $teacherpreset; 407 408 $savedpresetsnames = array_map(function($preset) { 409 return $preset->name; 410 }, $savedpresets); 411 412 // Check available saved presets only contain presets saved manually by users. 413 $presets = $manager->get_available_saved_presets(); 414 $this->assertCount(count($savedpresets), $presets); 415 // Confirm that it contains only the presets created manually. 416 foreach ($presets as $preset) { 417 $this->assertContains($preset->name, $savedpresetsnames); 418 $this->assertFalse($preset->isplugin); 419 } 420 421 // Unassign the mod/data:viewalluserpresets capability to the teacher role and check that saved presets are not returned. 422 $teacherrole = $DB->get_record('role', ['shortname' => 'teacher']); 423 unassign_capability('mod/data:viewalluserpresets', $teacherrole->id); 424 425 $presets = $manager->get_available_saved_presets(); 426 $this->assertCount(1, $presets); 427 $preset = reset($presets); 428 $this->assertEquals($teacherpreset->name, $preset->name); 429 } 430 431 /** 432 * Test for can_view_preset(). 433 * 434 * @covers ::can_view_preset 435 * @dataProvider can_view_preset_provider 436 * @param string $rolename the user role name 437 * @param bool $ownpreset if the preset belongs to the user 438 * @param bool|null $useridparam if the method should be called with a user id param 439 * @param bool $plugin if the preset is a plugin or not 440 * @param bool $expected the expected result 441 */ 442 public function test_can_view_preset(string $rolename, bool $ownpreset, ?bool $useridparam, bool $plugin, bool $expected) { 443 444 $this->resetAfterTest(); 445 446 $course = $this->getDataGenerator()->create_course(); 447 $user = $this->getDataGenerator()->create_and_enrol($course, $rolename); 448 $activity = $this->getDataGenerator()->create_module(manager::MODULE, ['course' => $course]); 449 $cm = get_coursemodule_from_id(manager::MODULE, $activity->cmid, 0, false, MUST_EXIST); 450 $manager = manager::create_from_coursemodule($cm); 451 452 // Create preset. 453 if ($ownpreset) { 454 $this->setUser($user); 455 } else { 456 $this->setAdminUser(); 457 } 458 459 if ($plugin) { 460 $preset = preset::create_from_plugin($manager, 'imagegallery'); 461 } else { 462 $plugingenerator = $this->getDataGenerator()->get_plugin_generator('mod_data'); 463 $preset = $plugingenerator->create_preset($activity, (object)['name' => 'Preset name']); 464 } 465 466 // Setup user param. 467 if ($useridparam) { 468 // Login as a different user to validate the userid param is working. 469 $otheruser = $this->getDataGenerator()->create_user(); 470 $this->setUser($otheruser); 471 $useridparam = $user->id; 472 } else { 473 $this->setUser($user); 474 } 475 476 $result = $manager->can_view_preset($preset, $useridparam); 477 $this->assertEquals($expected, $result); 478 } 479 480 /** 481 * Data provider for test_can_view_preset. 482 * 483 * @return array 484 */ 485 public function can_view_preset_provider(): array { 486 return [ 487 // User presets. 488 'Teacher owned preset without user id param' => [ 489 'rolename' => 'editingteacher', 490 'ownpreset' => true, 491 'useridparam' => null, 492 'plugin' => false, 493 'expected' => true, 494 ], 495 'Teacher owned preset with user id param' => [ 496 'rolename' => 'editingteacher', 497 'ownpreset' => true, 498 'useridparam' => true, 499 'plugin' => false, 500 'expected' => true, 501 ], 502 'Teacher not owned preset without user id param' => [ 503 'rolename' => 'editingteacher', 504 'ownpreset' => false, 505 'useridparam' => null, 506 'plugin' => false, 507 'expected' => true, 508 ], 509 'Teacher not owned preset with user id param' => [ 510 'rolename' => 'editingteacher', 511 'ownpreset' => false, 512 'useridparam' => true, 513 'plugin' => false, 514 'expected' => true, 515 ], 516 'Student owned preset without user id param' => [ 517 'rolename' => 'student', 518 'ownpreset' => true, 519 'useridparam' => null, 520 'plugin' => false, 521 'expected' => true, 522 ], 523 'Student owned preset with user id param' => [ 524 'rolename' => 'student', 525 'ownpreset' => true, 526 'useridparam' => true, 527 'plugin' => false, 528 'expected' => true, 529 ], 530 'Student not owned preset without user id param' => [ 531 'rolename' => 'student', 532 'ownpreset' => false, 533 'useridparam' => null, 534 'plugin' => false, 535 'expected' => false, 536 ], 537 'Student not owned preset with user id param' => [ 538 'rolename' => 'student', 539 'ownpreset' => false, 540 'useridparam' => true, 541 'plugin' => false, 542 'expected' => false, 543 ], 544 // Plugin presets. 545 'Teacher plugin preset without user id param' => [ 546 'rolename' => 'editingteacher', 547 'ownpreset' => false, 548 'useridparam' => null, 549 'plugin' => true, 550 'expected' => true, 551 ], 552 'Teacher plugin preset with user id param' => [ 553 'rolename' => 'editingteacher', 554 'ownpreset' => false, 555 'useridparam' => true, 556 'plugin' => true, 557 'expected' => true, 558 ], 559 'Student plugin preset without user id param' => [ 560 'rolename' => 'student', 561 'ownpreset' => false, 562 'useridparam' => null, 563 'plugin' => true, 564 'expected' => true, 565 ], 566 'Student plugin preset with user id param' => [ 567 'rolename' => 'student', 568 'ownpreset' => false, 569 'useridparam' => true, 570 'plugin' => true, 571 'expected' => true, 572 ], 573 ]; 574 } 575 576 /** 577 * Test for can_export_entries(). 578 * 579 * @covers ::can_export_entries 580 */ 581 public function test_can_export_entries() { 582 global $DB; 583 584 $this->resetAfterTest(); 585 586 // Create course with activity and enrol users. 587 $course = $this->getDataGenerator()->create_course(); 588 $teacherrole = $DB->get_record('role', ['shortname' => 'teacher']); 589 $teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher'); 590 $student = $this->getDataGenerator()->create_and_enrol($course, 'student'); 591 $activity = $this->getDataGenerator()->create_module(manager::MODULE, ['course' => $course]); 592 $cm = get_coursemodule_from_id(manager::MODULE, $activity->cmid, 0, false, MUST_EXIST); 593 $manager = manager::create_from_coursemodule($cm); 594 595 // Add a field. 596 /** @var \mod_data_generator $generator */ 597 $generator = $this->getDataGenerator()->get_plugin_generator('mod_data'); 598 $fieldrecord = (object)[ 599 'name' => 'myfield', 600 'type' => 'text', 601 ]; 602 $field = $generator->create_field($fieldrecord, $activity); 603 604 // Teacher with default capabilities can export entries. 605 $this->setUser($teacher); 606 $result = $manager->can_export_entries(); 607 $this->assertEquals(true, $result); 608 609 // Teacher without exportallentries can still export entries. 610 unassign_capability('mod/data:exportallentries', $teacherrole->id); 611 $result = $manager->can_export_entries(); 612 $this->assertEquals(true, $result); 613 614 // Teacher without exportallentries and exportentry can't export entries (unless they have created some entries). 615 unassign_capability('mod/data:exportentry', $teacherrole->id); 616 $result = $manager->can_export_entries(); 617 $this->assertEquals(false, $result); 618 619 $generator->create_entry( 620 $activity, 621 [$field->field->id => 'Example entry'], 622 ); 623 $result = $manager->can_export_entries(); 624 $this->assertEquals(true, $result); 625 626 // Student without entries can't export. 627 $this->setUser($student); 628 $result = $manager->can_export_entries(); 629 $this->assertEquals(false, $result); 630 631 // However, student who has created any entry, can export. 632 $generator->create_entry( 633 $activity, 634 [$field->field->id => 'Another example entry'], 635 ); 636 $this->setUser($student); 637 $result = $manager->can_export_entries(); 638 $this->assertEquals(true, $result); 639 } 640 641 /* 642 * Test reset_all_templates. 643 * 644 * @covers ::reset_all_templates 645 */ 646 public function test_reset_all_templates() { 647 global $DB; 648 649 $this->resetAfterTest(); 650 $this->setAdminUser(); 651 652 // Setup test data. 653 $course = $this->getDataGenerator()->create_course(); 654 $instance = $this->getDataGenerator()->create_module( 655 'data', 656 ['course' => $course->id] 657 ); 658 $manager = manager::create_from_instance($instance); 659 660 // Create some initial templates. 661 $initialtemplates = new stdClass(); 662 foreach (manager::TEMPLATES_LIST as $templatename => $unused) { 663 $initialtemplates->$templatename = "Initial $templatename"; 664 } 665 $manager->update_templates($initialtemplates); 666 $instance = $manager->get_instance(); 667 $record = $DB->get_record('data', ['id' => $instance->id]); 668 foreach (manager::TEMPLATES_LIST as $templatename => $unused) { 669 $this->assertEquals($initialtemplates->$templatename, $instance->$templatename); 670 $this->assertEquals($initialtemplates->$templatename, $record->$templatename); 671 } 672 673 // Reset all templates. 674 $result = $manager->reset_all_templates(); 675 $this->assertTrue($result); 676 $instance = $manager->get_instance(); 677 $record = $DB->get_record('data', ['id' => $instance->id]); 678 foreach (manager::TEMPLATES_LIST as $templatename => $unused) { 679 $this->assertEquals('', $instance->$templatename); 680 $this->assertEquals('', $record->$templatename); 681 } 682 } 683 684 /** 685 * Test reset_template. 686 * 687 * @covers ::reset_template 688 * @dataProvider reset_template_provider 689 * @param string $templatetoreset the template to reset 690 * @param string[] $expected the expected templates to be reset 691 */ 692 public function test_reset_template(string $templatetoreset, array $expected) { 693 global $DB; 694 695 $this->resetAfterTest(); 696 $this->setAdminUser(); 697 698 // Setup test data. 699 $course = $this->getDataGenerator()->create_course(); 700 $instance = $this->getDataGenerator()->create_module( 701 'data', 702 ['course' => $course->id] 703 ); 704 $manager = manager::create_from_instance($instance); 705 706 // Create some initial templates. 707 $initialtemplates = new stdClass(); 708 foreach (manager::TEMPLATES_LIST as $templatename => $unused) { 709 $initialtemplates->$templatename = "Initial $templatename"; 710 } 711 $manager->update_templates($initialtemplates); 712 $instance = $manager->get_instance(); 713 $record = $DB->get_record('data', ['id' => $instance->id]); 714 foreach (manager::TEMPLATES_LIST as $templatename => $unused) { 715 $this->assertEquals($initialtemplates->$templatename, $instance->$templatename); 716 $this->assertEquals($initialtemplates->$templatename, $record->$templatename); 717 } 718 719 // Reset template. 720 $result = $manager->reset_template($templatetoreset); 721 $this->assertTrue($result); 722 $instance = $manager->get_instance(); 723 $record = $DB->get_record('data', ['id' => $instance->id]); 724 foreach (manager::TEMPLATES_LIST as $templatename => $unused) { 725 if (in_array($templatename, $expected)) { 726 $this->assertEquals('', $instance->$templatename); 727 $this->assertEquals('', $record->$templatename); 728 } else { 729 $this->assertEquals($initialtemplates->$templatename, $instance->$templatename); 730 $this->assertEquals($initialtemplates->$templatename, $record->$templatename); 731 } 732 } 733 } 734 735 /** 736 * Data provider for test_reset_templatet. 737 * 738 * @return array 739 */ 740 public function reset_template_provider(): array { 741 return [ 742 // User presets. 743 'listtemplate' => [ 744 'templatename' => 'listtemplate', 745 'expected' => ['listtemplate', 'listtemplateheader', 'listtemplatefooter'], 746 ], 747 'singletemplate' => [ 748 'templatename' => 'singletemplate', 749 'expected' => ['singletemplate'], 750 ], 751 'asearchtemplate' => [ 752 'templatename' => 'asearchtemplate', 753 'expected' => ['asearchtemplate'], 754 ], 755 'addtemplate' => [ 756 'templatename' => 'addtemplate', 757 'expected' => ['addtemplate'], 758 ], 759 'rsstemplate' => [ 760 'templatename' => 'rsstemplate', 761 'expected' => ['rsstemplate', 'rsstitletemplate'], 762 ], 763 'csstemplate' => [ 764 'templatename' => 'csstemplate', 765 'expected' => ['csstemplate'], 766 ], 767 'jstemplate' => [ 768 'templatename' => 'jstemplate', 769 'expected' => ['jstemplate'], 770 ], 771 ]; 772 } 773 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body