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