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 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 core_courseformat\output\local\state;
  18  
  19  use availability_date\condition;
  20  use core_availability\tree;
  21  use stdClass;
  22  
  23  /**
  24   * Tests for section state class.
  25   *
  26   * @package    core_courseformat
  27   * @copyright  2022 Ferran Recio <ferran@moodle.com>
  28   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  29   * @coversDefaultClass \core_courseformat\output\local\state\section
  30   */
  31  class section_test extends \advanced_testcase {
  32  
  33      /**
  34       * Setup to ensure that fixtures are loaded.
  35       */
  36      public static function setupBeforeClass(): void {
  37          global $CFG;
  38          require_once($CFG->dirroot . '/course/lib.php');
  39          require_once($CFG->dirroot . '/course/format/tests/fixtures/format_theunittest.php');
  40          require_once($CFG->dirroot . '/course/format/tests/fixtures/format_theunittest_output_course_format_state.php');
  41      }
  42  
  43      /**
  44       * Test the behaviour of state\section hasavailability attribute.
  45       *
  46       * @dataProvider hasrestrictions_state_provider
  47       * @covers ::export_for_template
  48       *
  49       * @param string $format the course format
  50       * @param string $rolename the user role name (editingteacher or student)
  51       * @param bool $hasavailability if the activity|section has availability
  52       * @param bool $available if the activity availability condition is available or not to the user
  53       * @param bool $expected the expected result
  54       */
  55      public function test_section_hasrestrictions_state(
  56          string $format = 'topics',
  57          string $rolename = 'editingteacher',
  58          bool $hasavailability = false,
  59          bool $available = false,
  60          bool $expected = false
  61      ) {
  62          $data = $this->setup_hasrestrictions_scenario($format, $rolename, $hasavailability, $available);
  63  
  64          // Get the cm state.
  65          $courseformat = $data->courseformat;
  66          $renderer = $data->renderer;
  67  
  68          $sectionclass = $courseformat->get_output_classname('state\\section');
  69  
  70          $sectionstate = new $sectionclass(
  71              $courseformat,
  72              $data->section
  73          );
  74          $state = $sectionstate->export_for_template($renderer);
  75  
  76          $this->assertEquals($expected, $state->hasrestrictions);
  77      }
  78  
  79      /**
  80       * Setup section or cm has restrictions scenario.
  81       *
  82       * @param string $format the course format
  83       * @param string $rolename the user role name (editingteacher or student)
  84       * @param bool $hasavailability if the section has availability
  85       * @param bool $available if the section availability condition is available or not to the user
  86       * @return stdClass the scenario instances.
  87       */
  88      private function setup_hasrestrictions_scenario(
  89          string $format = 'topics',
  90          string $rolename = 'editingteacher',
  91          bool $hasavailability = false,
  92          bool $available = false
  93      ): stdClass {
  94          global $PAGE, $DB;
  95          $this->resetAfterTest();
  96  
  97          $course = $this->getDataGenerator()->create_course(['numsections' => 1, 'format' => $format]);
  98  
  99          // Create and enrol user.
 100          $user = $this->getDataGenerator()->create_user();
 101          $this->getDataGenerator()->enrol_user(
 102              $user->id,
 103              $course->id,
 104              $rolename
 105          );
 106          $this->setUser($user);
 107  
 108          // Set up the availability settings.
 109          if ($hasavailability) {
 110              $operation = ($available) ? condition::DIRECTION_UNTIL : condition::DIRECTION_FROM;
 111              $availabilityjson = json_encode(tree::get_root_json(
 112                  [
 113                      condition::get_json($operation, time() + 3600),
 114                  ],
 115                  '&',
 116                  true
 117              ));
 118              $modinfo = get_fast_modinfo($course);
 119              $sectioninfo = $modinfo->get_section_info(1);
 120              $selector = ['id' => $sectioninfo->id];
 121              $DB->set_field('course_sections', 'availability', trim($availabilityjson), $selector);
 122          }
 123          rebuild_course_cache($course->id, true);
 124  
 125          $courseformat = course_get_format($course->id);
 126          $modinfo = $courseformat->get_modinfo();
 127          $renderer = $courseformat->get_renderer($PAGE);
 128  
 129          if ($format == 'theunittest') {
 130              // These course format's hasn't the renderer file, so a debugging message will be displayed.
 131              $this->assertDebuggingCalled();
 132          }
 133  
 134          return (object)[
 135              'courseformat' => $courseformat,
 136              'section' => $modinfo->get_section_info(1),
 137              'renderer' => $renderer,
 138          ];
 139      }
 140  
 141      /**
 142       * Data provider for test_state().
 143       *
 144       * @return array
 145       */
 146      public function hasrestrictions_state_provider(): array {
 147          return [
 148              // Teacher scenarios (topics).
 149              'Teacher, Topics, can edit, has availability and is available' => [
 150                  'format' => 'topics',
 151                  'rolename' => 'editingteacher',
 152                  'hasavailability' => true,
 153                  'available' => true,
 154                  'expected' => true,
 155              ],
 156              'Teacher, Topics, can edit, has availability and is not available' => [
 157                  'format' => 'topics',
 158                  'rolename' => 'editingteacher',
 159                  'hasavailability' => true,
 160                  'available' => false,
 161                  'expected' => true,
 162              ],
 163              'Teacher, Topics, can edit and has not availability' => [
 164                  'format' => 'topics',
 165                  'rolename' => 'editingteacher',
 166                  'hasavailability' => false,
 167                  'available' => true,
 168                  'expected' => false,
 169              ],
 170              // Teacher scenarios (weeks).
 171              'Teacher, Weeks, can edit, has availability and is available' => [
 172                  'format' => 'weeks',
 173                  'rolename' => 'editingteacher',
 174                  'hasavailability' => true,
 175                  'available' => true,
 176                  'expected' => true,
 177              ],
 178              'Teacher, Weeks, can edit, has availability and is not available' => [
 179                  'format' => 'weeks',
 180                  'rolename' => 'editingteacher',
 181                  'hasavailability' => true,
 182                  'available' => false,
 183                  'expected' => true,
 184              ],
 185              'Teacher, Weeks, can edit and has not availability' => [
 186                  'format' => 'weeks',
 187                  'rolename' => 'editingteacher',
 188                  'hasavailability' => false,
 189                  'available' => true,
 190                  'expected' => false,
 191              ],
 192              // Teacher scenarios (mock format).
 193              'Teacher, Mock format, can edit, has availability and is available' => [
 194                  'format' => 'theunittest',
 195                  'rolename' => 'editingteacher',
 196                  'hasavailability' => true,
 197                  'available' => true,
 198                  'expected' => true,
 199              ],
 200              'Teacher, Mock format, can edit, has availability and is not available' => [
 201                  'format' => 'theunittest',
 202                  'rolename' => 'editingteacher',
 203                  'hasavailability' => true,
 204                  'available' => false,
 205                  'expected' => true,
 206              ],
 207              'Teacher, Mock format, can edit and has not availability' => [
 208                  'format' => 'theunittest',
 209                  'rolename' => 'editingteacher',
 210                  'hasavailability' => false,
 211                  'available' => true,
 212                  'expected' => false,
 213              ],
 214              // Non editing teacher scenarios (topics).
 215              'Non editing teacher, Topics, can edit, has availability and is available' => [
 216                  'format' => 'topics',
 217                  'rolename' => 'teacher',
 218                  'hasavailability' => true,
 219                  'available' => true,
 220                  'expected' => false,
 221              ],
 222              'Non editing teacher, Topics, can edit, has availability and is not available' => [
 223                  'format' => 'topics',
 224                  'rolename' => 'teacher',
 225                  'hasavailability' => true,
 226                  'available' => false,
 227                  'expected' => false,
 228              ],
 229              'Non editing teacher, Topics, can edit and has not availability' => [
 230                  'format' => 'topics',
 231                  'rolename' => 'teacher',
 232                  'hasavailability' => false,
 233                  'available' => true,
 234                  'expected' => false,
 235              ],
 236              // Non editing teacher scenarios (weeks).
 237              'Non editing teacher, Weeks, can edit, has availability and is available' => [
 238                  'format' => 'weeks',
 239                  'rolename' => 'teacher',
 240                  'hasavailability' => true,
 241                  'available' => true,
 242                  'expected' => false,
 243              ],
 244              'Non editing teacher, Weeks, can edit, has availability and is not available' => [
 245                  'format' => 'weeks',
 246                  'rolename' => 'teacher',
 247                  'hasavailability' => true,
 248                  'available' => false,
 249                  'expected' => false,
 250              ],
 251              'Non editing teacher, Weeks, can edit and has not availability' => [
 252                  'format' => 'weeks',
 253                  'rolename' => 'teacher',
 254                  'hasavailability' => false,
 255                  'available' => true,
 256                  'expected' => false,
 257              ],
 258              // Non editing teacher scenarios (mock format).
 259              'Non editing teacher, Mock format, can edit, has availability and is available' => [
 260                  'format' => 'theunittest',
 261                  'rolename' => 'teacher',
 262                  'hasavailability' => true,
 263                  'available' => true,
 264                  'expected' => false,
 265              ],
 266              'Non editing teacher, Mock format, can edit, has availability and is not available' => [
 267                  'format' => 'theunittest',
 268                  'rolename' => 'teacher',
 269                  'hasavailability' => true,
 270                  'available' => false,
 271                  'expected' => false,
 272              ],
 273              'Non editing teacher, Mock format, can edit and has not availability' => [
 274                  'format' => 'theunittest',
 275                  'rolename' => 'teacher',
 276                  'hasavailability' => false,
 277                  'available' => true,
 278                  'expected' => false,
 279              ],
 280              // Student scenarios (topics).
 281              'Topics, cannot edit, has availability and is available' => [
 282                  'format' => 'topics',
 283                  'rolename' => 'student',
 284                  'hasavailability' => true,
 285                  'available' => true,
 286                  'expected' => false,
 287              ],
 288              'Topics, cannot edit, has availability and is not available' => [
 289                  'format' => 'topics',
 290                  'rolename' => 'student',
 291                  'hasavailability' => true,
 292                  'available' => false,
 293                  'expected' => true,
 294              ],
 295              'Topics, cannot edit and has not availability' => [
 296                  'format' => 'topics',
 297                  'rolename' => 'student',
 298                  'hasavailability' => false,
 299                  'available' => true,
 300                  'expected' => false,
 301              ],
 302              // Student scenarios (weeks).
 303              'Weeks, cannot edit, has availability and is available' => [
 304                  'format' => 'weeks',
 305                  'rolename' => 'student',
 306                  'hasavailability' => true,
 307                  'available' => true,
 308                  'expected' => false,
 309              ],
 310              'Weeks, cannot edit, has availability and is not available' => [
 311                  'format' => 'weeks',
 312                  'rolename' => 'student',
 313                  'hasavailability' => true,
 314                  'available' => false,
 315                  'expected' => true,
 316              ],
 317              'Weeks, cannot edit and has not availability' => [
 318                  'format' => 'weeks',
 319                  'rolename' => 'student',
 320                  'hasavailability' => false,
 321                  'available' => true,
 322                  'expected' => false,
 323              ],
 324              // Student scenarios (mock format).
 325              'Mock format, cannot edit, has availability and is available' => [
 326                  'format' => 'theunittest',
 327                  'rolename' => 'student',
 328                  'hasavailability' => true,
 329                  'available' => true,
 330                  'expected' => false,
 331              ],
 332              'Mock format, cannot edit, has availability and is not available' => [
 333                  'format' => 'theunittest',
 334                  'rolename' => 'student',
 335                  'hasavailability' => true,
 336                  'available' => false,
 337                  'expected' => true,
 338              ],
 339              'Mock format, cannot edit and has not availability' => [
 340                  'format' => 'theunittest',
 341                  'rolename' => 'student',
 342                  'hasavailability' => false,
 343                  'available' => true,
 344                  'expected' => false,
 345              ],
 346          ];
 347      }
 348  }