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 cm 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\cm 30 */ 31 class cm_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\cm 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_cm_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 $cmclass = $courseformat->get_output_classname('state\\cm'); 69 70 $cmstate = new $cmclass( 71 $courseformat, 72 $data->section, 73 $data->cm 74 ); 75 $state = $cmstate->export_for_template($renderer); 76 77 $this->assertEquals($expected, $state->hascmrestrictions); 78 } 79 80 /** 81 * Setup section or cm has restrictions scenario. 82 * 83 * @param string $format the course format 84 * @param string $rolename the user role name (editingteacher or student) 85 * @param bool $hasavailability if the activity|section has availability 86 * @param bool $available if the activity availability condition is available or not to the user 87 * @return stdClass the scenario instances. 88 */ 89 private function setup_hasrestrictions_scenario( 90 string $format = 'topics', 91 string $rolename = 'editingteacher', 92 bool $hasavailability = false, 93 bool $available = false 94 ): stdClass { 95 global $PAGE, $DB; 96 $this->resetAfterTest(); 97 98 set_config('enableavailability', 1); 99 100 $course = $this->getDataGenerator()->create_course(['numsections' => 1, 'format' => $format]); 101 102 // Create and enrol user. 103 $user = $this->getDataGenerator()->create_user(); 104 $this->getDataGenerator()->enrol_user( 105 $user->id, 106 $course->id, 107 $rolename 108 ); 109 $this->setUser($user); 110 111 // Create an activity. 112 $activity = $this->getDataGenerator()->create_module('page', ['course' => $course->id], [ 113 'section' => 1, 114 'visible' => 1 115 ]); 116 117 // Set up the availability settings. 118 if ($hasavailability) { 119 $operation = ($available) ? condition::DIRECTION_UNTIL : condition::DIRECTION_FROM; 120 $availabilityjson = json_encode(tree::get_root_json( 121 [ 122 condition::get_json($operation, time() + 3600), 123 ], 124 '&', 125 true 126 )); 127 $selector = ['id' => $activity->cmid]; 128 $DB->set_field('course_modules', 'availability', trim($availabilityjson), $selector); 129 } 130 131 // Get the cm state. 132 $courseformat = course_get_format($course->id); 133 $modinfo = $courseformat->get_modinfo(); 134 $renderer = $courseformat->get_renderer($PAGE); 135 136 if ($format == 'theunittest') { 137 // These course format's hasn't the renderer file, so a debugging message will be displayed. 138 $this->assertDebuggingCalled(); 139 } 140 141 return (object)[ 142 'courseformat' => $courseformat, 143 'section' => $modinfo->get_section_info(1), 144 'cm' => $modinfo->get_cm($activity->cmid), 145 'renderer' => $renderer, 146 ]; 147 } 148 149 /** 150 * Data provider for test_state(). 151 * 152 * @return array 153 */ 154 public function hasrestrictions_state_provider(): array { 155 return [ 156 // Teacher scenarios (topics). 157 'Teacher, Topics, can edit, has availability and is available' => [ 158 'format' => 'topics', 159 'rolename' => 'editingteacher', 160 'hasavailability' => true, 161 'available' => true, 162 'expected' => true, 163 ], 164 'Teacher, Topics, can edit, has availability and is not available' => [ 165 'format' => 'topics', 166 'rolename' => 'editingteacher', 167 'hasavailability' => true, 168 'available' => false, 169 'expected' => true, 170 ], 171 'Teacher, Topics, can edit and has not availability' => [ 172 'format' => 'topics', 173 'rolename' => 'editingteacher', 174 'hasavailability' => false, 175 'available' => true, 176 'expected' => false, 177 ], 178 // Teacher scenarios (weeks). 179 'Teacher, Weeks, can edit, has availability and is available' => [ 180 'format' => 'weeks', 181 'rolename' => 'editingteacher', 182 'hasavailability' => true, 183 'available' => true, 184 'expected' => true, 185 ], 186 'Teacher, Weeks, can edit, has availability and is not available' => [ 187 'format' => 'weeks', 188 'rolename' => 'editingteacher', 189 'hasavailability' => true, 190 'available' => false, 191 'expected' => true, 192 ], 193 'Teacher, Weeks, can edit and has not availability' => [ 194 'format' => 'weeks', 195 'rolename' => 'editingteacher', 196 'hasavailability' => false, 197 'available' => true, 198 'expected' => false, 199 ], 200 // Teacher scenarios (mock format). 201 'Teacher, Mock format, can edit, has availability and is available' => [ 202 'format' => 'theunittest', 203 'rolename' => 'editingteacher', 204 'hasavailability' => true, 205 'available' => true, 206 'expected' => true, 207 ], 208 'Teacher, Mock format, can edit, has availability and is not available' => [ 209 'format' => 'theunittest', 210 'rolename' => 'editingteacher', 211 'hasavailability' => true, 212 'available' => false, 213 'expected' => true, 214 ], 215 'Teacher, Mock format, can edit and has not availability' => [ 216 'format' => 'theunittest', 217 'rolename' => 'editingteacher', 218 'hasavailability' => false, 219 'available' => true, 220 'expected' => false, 221 ], 222 // Non editing teacher scenarios (topics). 223 'Non editing teacher, Topics, can edit, has availability and is available' => [ 224 'format' => 'topics', 225 'rolename' => 'teacher', 226 'hasavailability' => true, 227 'available' => true, 228 'expected' => true, 229 ], 230 'Non editing teacher, Topics, can edit, has availability and is not available' => [ 231 'format' => 'topics', 232 'rolename' => 'teacher', 233 'hasavailability' => true, 234 'available' => false, 235 'expected' => true, 236 ], 237 'Non editing teacher, Topics, can edit and has not availability' => [ 238 'format' => 'topics', 239 'rolename' => 'teacher', 240 'hasavailability' => false, 241 'available' => true, 242 'expected' => false, 243 ], 244 // Non editing teacher scenarios (weeks). 245 'Non editing teacher, Weeks, can edit, has availability and is available' => [ 246 'format' => 'weeks', 247 'rolename' => 'teacher', 248 'hasavailability' => true, 249 'available' => true, 250 'expected' => true, 251 ], 252 'Non editing teacher, Weeks, can edit, has availability and is not available' => [ 253 'format' => 'weeks', 254 'rolename' => 'teacher', 255 'hasavailability' => true, 256 'available' => false, 257 'expected' => true, 258 ], 259 'Non editing teacher, Weeks, can edit and has not availability' => [ 260 'format' => 'weeks', 261 'rolename' => 'teacher', 262 'hasavailability' => false, 263 'available' => true, 264 'expected' => false, 265 ], 266 // Non editing teacher scenarios (mock format). 267 'Non editing teacher, Mock format, can edit, has availability and is available' => [ 268 'format' => 'theunittest', 269 'rolename' => 'teacher', 270 'hasavailability' => true, 271 'available' => true, 272 'expected' => true, 273 ], 274 'Non editing teacher, Mock format, can edit, has availability and is not available' => [ 275 'format' => 'theunittest', 276 'rolename' => 'teacher', 277 'hasavailability' => true, 278 'available' => false, 279 'expected' => true, 280 ], 281 'Non editing teacher, Mock format, can edit and has not availability' => [ 282 'format' => 'theunittest', 283 'rolename' => 'teacher', 284 'hasavailability' => false, 285 'available' => true, 286 'expected' => false, 287 ], 288 // Student scenarios (topics). 289 'Student, Topics, cannot edit, has availability and is available' => [ 290 'format' => 'topics', 291 'rolename' => 'student', 292 'hasavailability' => true, 293 'available' => true, 294 'expected' => false, 295 ], 296 'Student, Topics, cannot edit, has availability and is not available' => [ 297 'format' => 'topics', 298 'rolename' => 'student', 299 'hasavailability' => true, 300 'available' => false, 301 'expected' => true, 302 ], 303 'Student, Topics, cannot edit and has not availability' => [ 304 'format' => 'topics', 305 'rolename' => 'student', 306 'hasavailability' => false, 307 'available' => true, 308 'expected' => false, 309 ], 310 // Student scenarios (weeks). 311 'Student, Weeks, cannot edit, has availability and is available' => [ 312 'format' => 'weeks', 313 'rolename' => 'student', 314 'hasavailability' => true, 315 'available' => true, 316 'expected' => false, 317 ], 318 'Student, Weeks, cannot edit, has availability and is not available' => [ 319 'format' => 'weeks', 320 'rolename' => 'student', 321 'hasavailability' => true, 322 'available' => false, 323 'expected' => true, 324 ], 325 'Student, Weeks, cannot edit and has not availability' => [ 326 'format' => 'weeks', 327 'rolename' => 'student', 328 'hasavailability' => false, 329 'available' => true, 330 'expected' => false, 331 ], 332 // Student scenarios (mock format). 333 'Student, Mock format, cannot edit, has availability and is available' => [ 334 'format' => 'theunittest', 335 'rolename' => 'student', 336 'hasavailability' => true, 337 'available' => true, 338 'expected' => false, 339 ], 340 'Student, Mock format, cannot edit, has availability and is not available' => [ 341 'format' => 'theunittest', 342 'rolename' => 'student', 343 'hasavailability' => true, 344 'available' => false, 345 'expected' => true, 346 ], 347 'Student, Mock format, cannot edit and has not availability' => [ 348 'format' => 'theunittest', 349 'rolename' => 'student', 350 'hasavailability' => false, 351 'available' => true, 352 'expected' => false, 353 ], 354 ]; 355 } 356 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body