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.

Differences Between: [Versions 310 and 402] [Versions 311 and 402] [Versions 39 and 402] [Versions 400 and 402] [Versions 401 and 402]

   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 tool_usertours;
  18  
  19  /**
  20   * Tests for role filter.
  21   *
  22   * @package    tool_usertours
  23   * @copyright  2016 Andrew Nicols <andrew@nicols.co.uk>
  24   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  25   */
  26  class role_filter_test extends \advanced_testcase {
  27  
  28      /**
  29       * @var $course Test course
  30       */
  31      protected $course;
  32  
  33      /**
  34       * @var $student Test student
  35       */
  36      protected $student;
  37  
  38      /**
  39       * @var $teacher Test teacher
  40       */
  41      protected $teacher;
  42  
  43      /**
  44       * @var $editingteacher Test editor
  45       */
  46      protected $editingteacher;
  47  
  48      /**
  49       * @var $roles List of all roles
  50       */
  51      protected $roles;
  52  
  53      /** @var array Roles. */
  54      protected array $testroles = [];
  55  
  56      public function setUp(): void {
  57          global $DB;
  58  
  59          $this->resetAfterTest(true);
  60          $generator = $this->getDataGenerator();
  61  
  62          $this->course = $generator->create_course();
  63          $this->roles = $DB->get_records_menu('role', [], null, 'shortname, id');
  64          $this->testroles = ['student', 'teacher', 'editingteacher'];
  65  
  66          foreach ($this->testroles as $role) {
  67              $user = $this->$role = $generator->create_user();
  68              $generator->enrol_user($user->id, $this->course->id, $this->roles[$role]);
  69          }
  70      }
  71  
  72      /**
  73       * Test the filter_matches function when any is set.
  74       */
  75      public function test_filter_matches_any() {
  76          $context = \context_course::instance($this->course->id);
  77  
  78          // Note: No need to persist this tour.
  79          $tour = new \tool_usertours\tour();
  80          $tour->set_filter_values('role', []);
  81  
  82          // Note: The role filter does not use the context.
  83          foreach ($this->testroles as $role) {
  84              $this->setUser($this->$role);
  85              $this->assertTrue(\tool_usertours\local\filter\role::filter_matches($tour, $context));
  86          }
  87  
  88          // The admin should always be able to view too.
  89          $this->setAdminUser();
  90          $this->assertTrue(\tool_usertours\local\filter\role::filter_matches($tour, $context));
  91      }
  92  
  93      /**
  94       * Test the filter_matches function when one role is set.
  95       */
  96      public function test_filter_matches_single_role() {
  97          $context = \context_course::instance($this->course->id);
  98  
  99          $roles = [
 100              'student',
 101          ];
 102  
 103          // Note: No need to persist this tour.
 104          $tour = new \tool_usertours\tour();
 105          $tour->set_filter_values('role', $roles);
 106  
 107          // Note: The role filter does not use the context.
 108          foreach ($this->testroles as $role) {
 109              $this->setUser($this->$role);
 110              if ($role === 'student') {
 111                  $this->assertTrue(\tool_usertours\local\filter\role::filter_matches($tour, $context));
 112              } else {
 113                  $this->assertFalse(\tool_usertours\local\filter\role::filter_matches($tour, $context));
 114              }
 115          }
 116  
 117          // The admin can't view this one either.
 118          $this->setAdminUser();
 119          $this->assertFalse(\tool_usertours\local\filter\role::filter_matches($tour, $context));
 120      }
 121  
 122      /**
 123       * Test the filter_matches function when multiple roles are set.
 124       */
 125      public function test_filter_matches_multiple_role() {
 126          $context = \context_course::instance($this->course->id);
 127  
 128          $roles = [
 129              'teacher',
 130              'editingteacher',
 131          ];
 132  
 133          // Note: No need to persist this tour.
 134          $tour = new \tool_usertours\tour();
 135          $tour->set_filter_values('role', $roles);
 136  
 137          // Note: The role filter does not use the context.
 138          foreach ($this->testroles as $role) {
 139              $this->setUser($this->$role);
 140              if ($role === 'student') {
 141                  $this->assertFalse(\tool_usertours\local\filter\role::filter_matches($tour, $context));
 142              } else {
 143                  $this->assertTrue(\tool_usertours\local\filter\role::filter_matches($tour, $context));
 144              }
 145          }
 146  
 147          // The admin can't view this one either.
 148          $this->setAdminUser();
 149          $this->assertFalse(\tool_usertours\local\filter\role::filter_matches($tour, $context));
 150      }
 151  
 152      /**
 153       * Test the filter_matches function when one user has multiple roles.
 154       */
 155      public function test_filter_matches_multiple_role_one_user() {
 156          $context = \context_course::instance($this->course->id);
 157  
 158          $roles = [
 159              'student',
 160          ];
 161  
 162          $this->getDataGenerator()->enrol_user($this->student->id, $this->course->id, $this->roles['teacher']);
 163  
 164          // Note: No need to persist this tour.
 165          $tour = new \tool_usertours\tour();
 166          $tour->set_filter_values('role', $roles);
 167  
 168  
 169          // Note: The role filter does not use the context.
 170          foreach ($this->testroles as $role) {
 171              $this->setUser($this->$role);
 172              if ($role === 'student') {
 173                  $this->assertTrue(\tool_usertours\local\filter\role::filter_matches($tour, $context));
 174              } else {
 175                  $this->assertFalse(\tool_usertours\local\filter\role::filter_matches($tour, $context));
 176              }
 177          }
 178  
 179          // The admin can't view this one either.
 180          $this->setAdminUser();
 181          $this->assertFalse(\tool_usertours\local\filter\role::filter_matches($tour, $context));
 182      }
 183  
 184      /**
 185       * Test the filter_matches function when it is targetted at an admin.
 186       */
 187      public function test_filter_matches_multiple_role_only_admin() {
 188          $context = \context_course::instance($this->course->id);
 189  
 190          $roles = [
 191              \tool_usertours\local\filter\role::ROLE_SITEADMIN,
 192          ];
 193  
 194          $this->getDataGenerator()->enrol_user($this->student->id, $this->course->id, $this->roles['teacher']);
 195  
 196          // Note: No need to persist this tour.
 197          $tour = new \tool_usertours\tour();
 198          $tour->set_filter_values('role', $roles);
 199  
 200  
 201          // Note: The role filter does not use the context.
 202          foreach ($this->testroles as $role) {
 203              $this->setUser($this->$role);
 204              $this->assertFalse(\tool_usertours\local\filter\role::filter_matches($tour, $context));
 205          }
 206  
 207          // The admin can view this one because it's only aimed at them.
 208          $this->setAdminUser();
 209          $this->assertTrue(\tool_usertours\local\filter\role::filter_matches($tour, $context));
 210      }
 211  
 212      /**
 213       * Test the filter_matches function when multiple roles are set, including an admin user.
 214       */
 215      public function test_filter_matches_multiple_role_including_admin() {
 216          $context = \context_course::instance($this->course->id);
 217  
 218          $roles = [
 219              \tool_usertours\local\filter\role::ROLE_SITEADMIN,
 220              'teacher',
 221              'editingteacher',
 222          ];
 223  
 224          // Note: No need to persist this tour.
 225          $tour = new \tool_usertours\tour();
 226          $tour->set_filter_values('role', $roles);
 227  
 228          // Note: The role filter does not use the context.
 229          foreach ($this->testroles as $role) {
 230              $this->setUser($this->$role);
 231              if ($role === 'student') {
 232                  $this->assertFalse(\tool_usertours\local\filter\role::filter_matches($tour, $context));
 233              } else {
 234                  $this->assertTrue(\tool_usertours\local\filter\role::filter_matches($tour, $context));
 235              }
 236          }
 237  
 238          // The admin can view this one because it's only aimed at them.
 239          $this->setAdminUser();
 240          $this->assertTrue(\tool_usertours\local\filter\role::filter_matches($tour, $context));
 241      }
 242  
 243      /**
 244       * Test the filter_matches function when an admin user has multiple roles.
 245       */
 246      public function test_filter_matches_multiple_role_admin_user() {
 247          global $USER;
 248  
 249          $context = \context_course::instance($this->course->id);
 250  
 251          $roles = [
 252              \tool_usertours\local\filter\role::ROLE_SITEADMIN,
 253          ];
 254  
 255          $this->setAdminUser();
 256          $this->getDataGenerator()->enrol_user($USER->id, $this->course->id, $this->roles['student']);
 257  
 258          // Note: No need to persist this tour.
 259          $tour = new \tool_usertours\tour();
 260          $tour->set_filter_values('role', $roles);
 261  
 262          // The admin can view this one because it's only aimed at them.
 263          $this->assertTrue(\tool_usertours\local\filter\role::filter_matches($tour, $context));
 264      }
 265  
 266      /**
 267       * Test that the get_filter_options function does not include the guest roles.
 268       */
 269      public function test_get_filter_options_no_guest_roles() {
 270          create_role('Test Role', 'testrole', 'This is a test role', 'guest');
 271  
 272          $allroles = role_get_names(null, ROLENAME_ALIAS);
 273          $options = \tool_usertours\local\filter\role::get_filter_options();
 274  
 275          foreach ($allroles as $role) {
 276              $hasrole = isset($options[$role->shortname]);
 277              if ($role->archetype === 'guest') {
 278                  $this->assertFalse($hasrole);
 279              } else {
 280                  $this->assertTrue($hasrole);
 281              }
 282          }
 283      }
 284  }