Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
   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_feedback\form;
  18  
  19  /**
  20   * Tests the confirm use template form
  21   *
  22   * @author Peter Dias
  23   * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
  24   * @package mod_feedback
  25   */
  26  class create_template_form_test extends \advanced_testcase {
  27      /**
  28       * Run the basic setup for the test
  29       */
  30      public function setup_instance(): array {
  31          global $DB, $PAGE;
  32          $this->resetAfterTest();
  33          $this->setAdminUser();
  34  
  35          $course = $this->getDataGenerator()->create_course();
  36          $feedback = $this->getDataGenerator()->create_module('feedback', ['course' => $course->id]);
  37          $cm = get_coursemodule_from_instance('feedback', $feedback->id, $course->id);
  38          $user = $this->getDataGenerator()->create_user();
  39          $teacher = $this->getDataGenerator()->create_user();
  40          $manager = $this->getDataGenerator()->create_user();
  41  
  42          // Enrol a student and teacher.
  43          $this->getDataGenerator()->enrol_user($user->id, $course->id, 'student');
  44          $this->getDataGenerator()->enrol_user($teacher->id, $course->id, 'editingteacher');
  45  
  46          // Setup the site wide manager role.
  47          $managerrole = $DB->get_record('role', ['shortname' => 'manager']);
  48          role_assign($managerrole->id, $manager->id, SYSCONTEXTID);
  49  
  50          $feedbackgenerator = $this->getDataGenerator()->get_plugin_generator('mod_feedback');
  51  
  52          // Create at least one page.
  53          $feedbackgenerator->create_item_multichoice($feedback, ['values' => "y\nn"]);
  54          $feedbackgenerator->create_item_multichoice($feedback, ['values' => "0\n1"]);
  55          $feedbackparams = [
  56              'id' => $cm->id,
  57          ];
  58          $PAGE->set_cm($cm);
  59          $PAGE->set_activity_record($feedback);
  60  
  61          return [$manager, $teacher, $user, $managerrole, $feedbackparams];
  62      }
  63  
  64      /**
  65       * Test the create template for when capabilities have been modified
  66       *
  67       * @param array $unassignedroles
  68       * @param bool $accessallowed
  69       * @param bool $public
  70       * @param bool $expectedispublicvalue
  71       * @dataProvider createtemplate_form_with_modified_capabilities_provider
  72       */
  73      public function test_createtemplate_form_with_modified_capabilities(array $unassignedroles, bool $accessallowed,
  74              bool $public = false, bool $expectedispublicvalue = false) {
  75          global $DB;
  76          [$manager, $teacher, $user, $managerrole, $feedback] = $this->setup_instance();
  77          $this->setAdminUser();
  78          foreach ($unassignedroles as $role) {
  79              unassign_capability($role, $managerrole->id);
  80          }
  81          $data = [
  82              'id' => $feedback['id'],
  83              'templatename' => 'mytemplate',
  84              'ispublic' => $public
  85          ];
  86          $this->setUser($manager);
  87          $submitdata = create_template_form::mock_ajax_submit($data);
  88          if (!$accessallowed) {
  89              $this->expectException(\moodle_exception::class);
  90          }
  91          $form = new create_template_form(null, null, 'post', '', null, true,
  92              $submitdata, true);
  93          $form->set_data_for_dynamic_submission();
  94          $this->assertTrue($form->is_validated());
  95          $form->process_dynamic_submission();
  96          $records = array_values($DB->get_records('feedback_template', null, 'id ASC'));
  97          $this->assertEquals($expectedispublicvalue, (bool) $records[0]->ispublic);
  98      }
  99  
 100      /**
 101       * Provider for the test_createtemplate_form_with_modified_capabilities
 102       *
 103       * @return array
 104       */
 105      public function createtemplate_form_with_modified_capabilities_provider(): array {
 106          return [
 107              "Manager without edititems permission cannot create any templates" => [
 108                  ['mod/feedback:edititems'], false
 109              ],
 110              "Manager without createprivatetemplate permission creating public template" => [
 111                  ['mod/feedback:createprivatetemplate'], true, true, true
 112              ],
 113              "Manager without createprivatetemplate permission creating private template" => [
 114                  ['mod/feedback:createprivatetemplate'], true
 115              ],
 116              "Manager without createpublictemplate permission creating private template" => [
 117                  ['mod/feedback:createpublictemplate'], true
 118              ],
 119              "Manager without createpublictemplate permission creating public template" => [
 120                  ['mod/feedback:createpublictemplate'], true, true
 121              ],
 122              "Manager without createprivatetemplate,createpublictemplate permission cannot create templates" => [
 123                  ['mod/feedback:createpublictemplate', 'mod/feedback:createprivatetemplate'], false
 124              ]
 125          ];
 126      }
 127  
 128      /**
 129       * Test the form
 130       *
 131       * @param string $loginas
 132       * @param bool $public
 133       * @param bool $accessallowed
 134       * @dataProvider createtemplate_form_provider
 135       */
 136      public function test_createtemplate_form(string $loginas, bool $public,
 137              bool $accessallowed = true) {
 138          global $DB;
 139          [$manager, $teacher, $user, $managerrole, $feedback] = $this->setup_instance();
 140          switch($loginas) {
 141              case 'admin':
 142                  $this->setAdminUser();
 143                  break;
 144              case 'student':
 145                  $this->setUser($user);
 146                  break;
 147              case 'teacher':
 148                  $this->setUser($teacher);
 149                  break;
 150              case 'manager':
 151                  $this->setUser($manager);
 152                  break;
 153          }
 154  
 155          $data = [
 156              'id' => $feedback['id'],
 157              'templatename' => 'mytemplate',
 158              'ispublic' => $public
 159          ];
 160  
 161          $submitdata = create_template_form::mock_ajax_submit($data);
 162          if (!$accessallowed) {
 163              $this->expectException(\moodle_exception::class);
 164          }
 165          $form = new create_template_form(null, null, 'post', '', null, true,
 166              $submitdata, true);
 167          $form->set_data_for_dynamic_submission();
 168          $this->assertTrue($form->is_validated());
 169          $form->process_dynamic_submission();
 170  
 171          // A teacher can access the form but cannot create public templates.
 172          if ($loginas == 'teacher' && $public) {
 173              $records = array_values($DB->get_records('feedback_template', null, 'id ASC'));
 174              $this->assertFalse((bool) $records[0]->ispublic);
 175          }
 176      }
 177  
 178      /**
 179       * Provider for the test_createtemplate_form
 180       *
 181       * @return array
 182       */
 183      public function createtemplate_form_provider(): array {
 184          return [
 185              'Create a private template as an admin' => [
 186                  'admin', false
 187              ],
 188              'Create a public template as an admin' => [
 189                  'admin', true
 190              ],
 191              'Create a private template as a manager' => [
 192                  'manager', false
 193              ],
 194              'Create a public template as a manager' => [
 195                  'manager', true
 196              ],
 197              'Create a private template as a teacher' => [
 198                  'teacher', false
 199              ],
 200              'Create a public template as a teacher' => [
 201                  'teacher', true
 202              ],
 203              'Create a public template as a student' => [
 204                  'student', true, false
 205              ],
 206              'Create a private template as a student' => [
 207                  'student', false, false
 208              ],
 209          ];
 210      }
 211  }