[ Index ] |
PHP Cross Reference of moodle-2.8 |
[Summary view] [Print] [Text view]
1 <?php 2 3 // This file is part of Moodle - http://moodle.org/ 4 // 5 // Moodle is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // Moodle is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU General Public License for more details. 14 // 15 // You should have received a copy of the GNU General Public License 16 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 17 18 /** 19 * The module forums external functions unit tests 20 * 21 * @package mod_forum 22 * @category external 23 * @copyright 2012 Mark Nelson <[email protected]> 24 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 25 */ 26 27 defined('MOODLE_INTERNAL') || die(); 28 29 global $CFG; 30 31 require_once($CFG->dirroot . '/webservice/tests/helpers.php'); 32 33 class mod_forum_external_testcase extends externallib_advanced_testcase { 34 35 /** 36 * Tests set up 37 */ 38 protected function setUp() { 39 global $CFG; 40 41 // We must clear the subscription caches. This has to be done both before each test, and after in case of other 42 // tests using these functions. 43 \mod_forum\subscriptions::reset_forum_cache(); 44 45 require_once($CFG->dirroot . '/mod/forum/externallib.php'); 46 } 47 48 public function tearDown() { 49 // We must clear the subscription caches. This has to be done both before each test, and after in case of other 50 // tests using these functions. 51 \mod_forum\subscriptions::reset_forum_cache(); 52 } 53 54 /** 55 * Test get forums 56 */ 57 public function test_mod_forum_get_forums_by_courses() { 58 global $USER, $CFG, $DB; 59 60 $this->resetAfterTest(true); 61 62 // Create a user. 63 $user = self::getDataGenerator()->create_user(); 64 65 // Set to the user. 66 self::setUser($user); 67 68 // Create courses to add the modules. 69 $course1 = self::getDataGenerator()->create_course(); 70 $course2 = self::getDataGenerator()->create_course(); 71 72 // First forum. 73 $record = new stdClass(); 74 $record->introformat = FORMAT_HTML; 75 $record->course = $course1->id; 76 $forum1 = self::getDataGenerator()->create_module('forum', $record); 77 78 // Second forum. 79 $record = new stdClass(); 80 $record->introformat = FORMAT_HTML; 81 $record->course = $course2->id; 82 $forum2 = self::getDataGenerator()->create_module('forum', $record); 83 84 // Add discussions to the forums. 85 $record = new stdClass(); 86 $record->course = $course1->id; 87 $record->userid = $user->id; 88 $record->forum = $forum1->id; 89 $discussion1 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record); 90 // Expect one discussion. 91 $forum1->numdiscussions = 1; 92 93 $record = new stdClass(); 94 $record->course = $course2->id; 95 $record->userid = $user->id; 96 $record->forum = $forum2->id; 97 $discussion2 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record); 98 $discussion3 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record); 99 // Expect two discussions. 100 $forum2->numdiscussions = 2; 101 102 // Check the forum was correctly created. 103 $this->assertEquals(2, $DB->count_records_select('forum', 'id = :forum1 OR id = :forum2', 104 array('forum1' => $forum1->id, 'forum2' => $forum2->id))); 105 106 // Enrol the user in two courses. 107 // DataGenerator->enrol_user automatically sets a role for the user with the permission mod/form:viewdiscussion. 108 $this->getDataGenerator()->enrol_user($user->id, $course1->id, null, 'manual'); 109 // Execute real Moodle enrolment as we'll call unenrol() method on the instance later. 110 $enrol = enrol_get_plugin('manual'); 111 $enrolinstances = enrol_get_instances($course2->id, true); 112 foreach ($enrolinstances as $courseenrolinstance) { 113 if ($courseenrolinstance->enrol == "manual") { 114 $instance2 = $courseenrolinstance; 115 break; 116 } 117 } 118 $enrol->enrol_user($instance2, $user->id); 119 120 // Assign capabilities to view forums for forum 2. 121 $cm2 = get_coursemodule_from_id('forum', $forum2->cmid, 0, false, MUST_EXIST); 122 $context2 = context_module::instance($cm2->id); 123 $newrole = create_role('Role 2', 'role2', 'Role 2 description'); 124 $roleid2 = $this->assignUserCapability('mod/forum:viewdiscussion', $context2->id, $newrole); 125 126 // Create what we expect to be returned when querying the two courses. 127 $expectedforums = array(); 128 $expectedforums[$forum1->id] = (array) $forum1; 129 $expectedforums[$forum2->id] = (array) $forum2; 130 131 // Call the external function passing course ids. 132 $forums = mod_forum_external::get_forums_by_courses(array($course1->id, $course2->id)); 133 external_api::clean_returnvalue(mod_forum_external::get_forums_by_courses_returns(), $forums); 134 $this->assertEquals($expectedforums, $forums); 135 136 // Call the external function without passing course id. 137 $forums = mod_forum_external::get_forums_by_courses(); 138 external_api::clean_returnvalue(mod_forum_external::get_forums_by_courses_returns(), $forums); 139 $this->assertEquals($expectedforums, $forums); 140 141 // Unenrol user from second course and alter expected forums. 142 $enrol->unenrol_user($instance2, $user->id); 143 unset($expectedforums[$forum2->id]); 144 145 // Call the external function without passing course id. 146 $forums = mod_forum_external::get_forums_by_courses(); 147 external_api::clean_returnvalue(mod_forum_external::get_forums_by_courses_returns(), $forums); 148 $this->assertEquals($expectedforums, $forums); 149 150 // Call for the second course we unenrolled the user from, ensure exception thrown. 151 try { 152 mod_forum_external::get_forums_by_courses(array($course2->id)); 153 $this->fail('Exception expected due to being unenrolled from the course.'); 154 } catch (moodle_exception $e) { 155 $this->assertEquals('requireloginerror', $e->errorcode); 156 } 157 158 // Call without required capability, ensure exception thrown. 159 $this->unassignUserCapability('mod/forum:viewdiscussion', null, null, $course1->id); 160 try { 161 $forums = mod_forum_external::get_forums_by_courses(array($course1->id)); 162 $this->fail('Exception expected due to missing capability.'); 163 } catch (moodle_exception $e) { 164 $this->assertEquals('nopermissions', $e->errorcode); 165 } 166 } 167 168 /** 169 * Test get forum discussions 170 */ 171 public function test_mod_forum_get_forum_discussions() { 172 global $USER, $CFG, $DB; 173 174 $this->resetAfterTest(true); 175 176 // Set the CFG variable to allow track forums. 177 $CFG->forum_trackreadposts = true; 178 179 // Create a user who can track forums. 180 $record = new stdClass(); 181 $record->trackforums = true; 182 $user1 = self::getDataGenerator()->create_user($record); 183 // Create a bunch of other users to post. 184 $user2 = self::getDataGenerator()->create_user(); 185 $user3 = self::getDataGenerator()->create_user(); 186 $user4 = self::getDataGenerator()->create_user(); 187 188 // Set the first created user to the test user. 189 self::setUser($user1); 190 191 // Create courses to add the modules. 192 $course1 = self::getDataGenerator()->create_course(); 193 $course2 = self::getDataGenerator()->create_course(); 194 195 // First forum with tracking off. 196 $record = new stdClass(); 197 $record->course = $course1->id; 198 $record->trackingtype = FORUM_TRACKING_OFF; 199 $forum1 = self::getDataGenerator()->create_module('forum', $record); 200 201 // Second forum of type 'qanda' with tracking enabled. 202 $record = new stdClass(); 203 $record->course = $course2->id; 204 $record->type = 'qanda'; 205 $record->trackingtype = FORUM_TRACKING_FORCED; 206 $forum2 = self::getDataGenerator()->create_module('forum', $record); 207 208 // Add discussions to the forums. 209 $record = new stdClass(); 210 $record->course = $course1->id; 211 $record->userid = $user1->id; 212 $record->forum = $forum1->id; 213 $discussion1 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record); 214 215 $record = new stdClass(); 216 $record->course = $course2->id; 217 $record->userid = $user2->id; 218 $record->forum = $forum2->id; 219 $discussion2 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record); 220 221 // Add three replies to the discussion 1 from different users. 222 $record = new stdClass(); 223 $record->discussion = $discussion1->id; 224 $record->parent = $discussion1->firstpost; 225 $record->userid = $user2->id; 226 $discussion1reply1 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record); 227 228 $record->parent = $discussion1reply1->id; 229 $record->userid = $user3->id; 230 $discussion1reply2 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record); 231 232 $record->userid = $user4->id; 233 $discussion1reply3 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record); 234 235 // Add two replies to discussion 2 from different users. 236 $record = new stdClass(); 237 $record->discussion = $discussion2->id; 238 $record->parent = $discussion2->firstpost; 239 $record->userid = $user1->id; 240 $discussion2reply1 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record); 241 242 $record->parent = $discussion2reply1->id; 243 $record->userid = $user3->id; 244 $discussion2reply2 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record); 245 246 // Check the forums were correctly created. 247 $this->assertEquals(2, $DB->count_records_select('forum', 'id = :forum1 OR id = :forum2', 248 array('forum1' => $forum1->id, 'forum2' => $forum2->id))); 249 250 // Check the discussions were correctly created. 251 $this->assertEquals(2, $DB->count_records_select('forum_discussions', 'forum = :forum1 OR forum = :forum2', 252 array('forum1' => $forum1->id, 'forum2' => $forum2->id))); 253 254 // Check the posts were correctly created, don't forget each discussion created also creates a post. 255 $this->assertEquals(7, $DB->count_records_select('forum_posts', 'discussion = :discussion1 OR discussion = :discussion2', 256 array('discussion1' => $discussion1->id, 'discussion2' => $discussion2->id))); 257 258 // Enrol the user in the first course. 259 $enrol = enrol_get_plugin('manual'); 260 // Following line enrol and assign default role id to the user. 261 // So the user automatically gets mod/forum:viewdiscussion on all forums of the course. 262 $this->getDataGenerator()->enrol_user($user1->id, $course1->id); 263 264 // Now enrol into the second course. 265 // We don't use the dataGenerator as we need to get the $instance2 to unenrol later. 266 $enrolinstances = enrol_get_instances($course2->id, true); 267 foreach ($enrolinstances as $courseenrolinstance) { 268 if ($courseenrolinstance->enrol == "manual") { 269 $instance2 = $courseenrolinstance; 270 break; 271 } 272 } 273 $enrol->enrol_user($instance2, $user1->id); 274 275 // Assign capabilities to view discussions for forum 2. 276 $cm = get_coursemodule_from_id('forum', $forum2->cmid, 0, false, MUST_EXIST); 277 $context = context_module::instance($cm->id); 278 $newrole = create_role('Role 2', 'role2', 'Role 2 description'); 279 $this->assignUserCapability('mod/forum:viewdiscussion', $context->id, $newrole); 280 281 // Create what we expect to be returned when querying the forums. 282 $expecteddiscussions = array(); 283 $expecteddiscussions[$discussion1->id] = array( 284 'id' => $discussion1->id, 285 'course' => $discussion1->course, 286 'forum' => $discussion1->forum, 287 'name' => $discussion1->name, 288 'firstpost' => $discussion1->firstpost, 289 'userid' => $discussion1->userid, 290 'groupid' => $discussion1->groupid, 291 'assessed' => $discussion1->assessed, 292 'timemodified' => $discussion1reply3->created, 293 'usermodified' => $discussion1reply3->userid, 294 'timestart' => $discussion1->timestart, 295 'timeend' => $discussion1->timeend, 296 'firstuserfullname' => fullname($user1), 297 'firstuserimagealt' => $user1->imagealt, 298 'firstuserpicture' => $user1->picture, 299 'firstuseremail' => $user1->email, 300 'subject' => $discussion1->name, 301 'numreplies' => 3, 302 'numunread' => '', 303 'lastpost' => $discussion1reply3->id, 304 'lastuserid' => $user4->id, 305 'lastuserfullname' => fullname($user4), 306 'lastuserimagealt' => $user4->imagealt, 307 'lastuserpicture' => $user4->picture, 308 'lastuseremail' => $user4->email 309 ); 310 $expecteddiscussions[$discussion2->id] = array( 311 'id' => $discussion2->id, 312 'course' => $discussion2->course, 313 'forum' => $discussion2->forum, 314 'name' => $discussion2->name, 315 'firstpost' => $discussion2->firstpost, 316 'userid' => $discussion2->userid, 317 'groupid' => $discussion2->groupid, 318 'assessed' => $discussion2->assessed, 319 'timemodified' => $discussion2reply2->created, 320 'usermodified' => $discussion2reply2->userid, 321 'timestart' => $discussion2->timestart, 322 'timeend' => $discussion2->timeend, 323 'firstuserfullname' => fullname($user2), 324 'firstuserimagealt' => $user2->imagealt, 325 'firstuserpicture' => $user2->picture, 326 'firstuseremail' => $user2->email, 327 'subject' => $discussion2->name, 328 'numreplies' => 2, 329 'numunread' => 3, 330 'lastpost' => $discussion2reply2->id, 331 'lastuserid' => $user3->id, 332 'lastuserfullname' => fullname($user3), 333 'lastuserimagealt' => $user3->imagealt, 334 'lastuserpicture' => $user3->picture, 335 'lastuseremail' => $user3->email 336 ); 337 338 // Call the external function passing forum ids. 339 $discussions = mod_forum_external::get_forum_discussions(array($forum1->id, $forum2->id)); 340 external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_returns(), $discussions); 341 $this->assertEquals($expecteddiscussions, $discussions); 342 // Some debugging is going to be produced, this is because we switch PAGE contexts in the get_forum_discussions function, 343 // the switch happens when the validate_context function is called inside a foreach loop. 344 // See MDL-41746 for more information. 345 $this->assertDebuggingCalled(); 346 347 // Remove the users post from the qanda forum and ensure they can not return the discussion. 348 $DB->delete_records('forum_posts', array('id' => $discussion2reply1->id)); 349 $discussions = mod_forum_external::get_forum_discussions(array($forum2->id)); 350 $discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_returns(), $discussions); 351 $this->assertEquals(0, count($discussions)); 352 353 // Call without required view discussion capability. 354 $this->unassignUserCapability('mod/forum:viewdiscussion', null, null, $course1->id); 355 try { 356 mod_forum_external::get_forum_discussions(array($forum1->id)); 357 $this->fail('Exception expected due to missing capability.'); 358 } catch (moodle_exception $e) { 359 $this->assertEquals('nopermissions', $e->errorcode); 360 } 361 $this->assertDebuggingCalled(); 362 363 // Unenrol user from second course. 364 $enrol->unenrol_user($instance2, $user1->id); 365 366 // Call for the second course we unenrolled the user from, make sure exception thrown. 367 try { 368 mod_forum_external::get_forum_discussions(array($forum2->id)); 369 $this->fail('Exception expected due to being unenrolled from the course.'); 370 } catch (moodle_exception $e) { 371 $this->assertEquals('requireloginerror', $e->errorcode); 372 } 373 $this->assertDebuggingCalled(); 374 } 375 376 /** 377 * Test get forum posts 378 */ 379 public function test_mod_forum_get_forum_discussion_posts() { 380 global $CFG; 381 382 $this->resetAfterTest(true); 383 384 // Set the CFG variable to allow track forums. 385 $CFG->forum_trackreadposts = true; 386 387 // Create a user who can track forums. 388 $record = new stdClass(); 389 $record->trackforums = true; 390 $user1 = self::getDataGenerator()->create_user($record); 391 // Create a bunch of other users to post. 392 $user2 = self::getDataGenerator()->create_user(); 393 $user3 = self::getDataGenerator()->create_user(); 394 395 // Set the first created user to the test user. 396 self::setUser($user1); 397 398 // Create course to add the module. 399 $course1 = self::getDataGenerator()->create_course(); 400 401 // Forum with tracking off. 402 $record = new stdClass(); 403 $record->course = $course1->id; 404 $record->trackingtype = FORUM_TRACKING_OFF; 405 $forum1 = self::getDataGenerator()->create_module('forum', $record); 406 $forum1context = context_module::instance($forum1->cmid); 407 408 // Add discussions to the forums. 409 $record = new stdClass(); 410 $record->course = $course1->id; 411 $record->userid = $user1->id; 412 $record->forum = $forum1->id; 413 $discussion1 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record); 414 415 $record = new stdClass(); 416 $record->course = $course1->id; 417 $record->userid = $user2->id; 418 $record->forum = $forum1->id; 419 $discussion2 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record); 420 421 // Add 2 replies to the discussion 1 from different users. 422 $record = new stdClass(); 423 $record->discussion = $discussion1->id; 424 $record->parent = $discussion1->firstpost; 425 $record->userid = $user2->id; 426 $discussion1reply1 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record); 427 428 $record->parent = $discussion1reply1->id; 429 $record->userid = $user3->id; 430 $discussion1reply2 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record); 431 432 // Enrol the user in the course. 433 $enrol = enrol_get_plugin('manual'); 434 // Following line enrol and assign default role id to the user. 435 // So the user automatically gets mod/forum:viewdiscussion on all forums of the course. 436 $this->getDataGenerator()->enrol_user($user1->id, $course1->id); 437 $this->getDataGenerator()->enrol_user($user2->id, $course1->id); 438 $this->getDataGenerator()->enrol_user($user3->id, $course1->id); 439 440 // Create what we expect to be returned when querying the discussion. 441 $expectedposts = array( 442 'posts' => array(), 443 'warnings' => array(), 444 ); 445 446 $userpictureurl = moodle_url::make_webservice_pluginfile_url( 447 context_user::instance($discussion1reply2->userid)->id, 'user', 'icon', null, '/', 'f1')->out(false); 448 449 $expectedposts['posts'][] = array( 450 'id' => $discussion1reply2->id, 451 'discussion' => $discussion1reply2->discussion, 452 'parent' => $discussion1reply2->parent, 453 'userid' => (int) $discussion1reply2->userid, 454 'created' => $discussion1reply2->created, 455 'modified' => $discussion1reply2->modified, 456 'mailed' => $discussion1reply2->mailed, 457 'subject' => $discussion1reply2->subject, 458 'message' => file_rewrite_pluginfile_urls($discussion1reply2->message, 'pluginfile.php', 459 $forum1context->id, 'mod_forum', 'post', $discussion1reply2->id), 460 'messageformat' => 1, // This value is usually changed by external_format_text() function. 461 'messagetrust' => $discussion1reply2->messagetrust, 462 'attachment' => $discussion1reply2->attachment, 463 'totalscore' => $discussion1reply2->totalscore, 464 'mailnow' => $discussion1reply2->mailnow, 465 'children' => array(), 466 'canreply' => true, 467 'postread' => false, 468 'userfullname' => fullname($user3), 469 'userpictureurl' => $userpictureurl 470 ); 471 472 $userpictureurl = moodle_url::make_webservice_pluginfile_url( 473 context_user::instance($discussion1reply1->userid)->id, 'user', 'icon', null, '/', 'f1')->out(false); 474 475 $expectedposts['posts'][] = array( 476 'id' => $discussion1reply1->id, 477 'discussion' => $discussion1reply1->discussion, 478 'parent' => $discussion1reply1->parent, 479 'userid' => (int) $discussion1reply1->userid, 480 'created' => $discussion1reply1->created, 481 'modified' => $discussion1reply1->modified, 482 'mailed' => $discussion1reply1->mailed, 483 'subject' => $discussion1reply1->subject, 484 'message' => file_rewrite_pluginfile_urls($discussion1reply1->message, 'pluginfile.php', 485 $forum1context->id, 'mod_forum', 'post', $discussion1reply1->id), 486 'messageformat' => 1, // This value is usually changed by external_format_text() function. 487 'messagetrust' => $discussion1reply1->messagetrust, 488 'attachment' => $discussion1reply1->attachment, 489 'totalscore' => $discussion1reply1->totalscore, 490 'mailnow' => $discussion1reply1->mailnow, 491 'children' => array($discussion1reply2->id), 492 'canreply' => true, 493 'postread' => false, 494 'userfullname' => fullname($user2), 495 'userpictureurl' => $userpictureurl 496 ); 497 498 // Test a discussion with two additional posts (total 3 posts). 499 $posts = mod_forum_external::get_forum_discussion_posts($discussion1->id, 'modified', 'DESC'); 500 $posts = external_api::clean_returnvalue(mod_forum_external::get_forum_discussion_posts_returns(), $posts); 501 $this->assertEquals(3, count($posts['posts'])); 502 503 // Unset the initial discussion post. 504 array_pop($posts['posts']); 505 $this->assertEquals($expectedposts, $posts); 506 507 // Test discussion without additional posts. There should be only one post (the one created by the discussion). 508 $posts = mod_forum_external::get_forum_discussion_posts($discussion2->id, 'modified', 'DESC'); 509 $posts = external_api::clean_returnvalue(mod_forum_external::get_forum_discussion_posts_returns(), $posts); 510 $this->assertEquals(1, count($posts['posts'])); 511 512 } 513 514 /** 515 * Test get forum discussions paginated 516 */ 517 public function test_mod_forum_get_forum_discussions_paginated() { 518 global $USER, $CFG, $DB; 519 520 $this->resetAfterTest(true); 521 522 // Set the CFG variable to allow track forums. 523 $CFG->forum_trackreadposts = true; 524 525 // Create a user who can track forums. 526 $record = new stdClass(); 527 $record->trackforums = true; 528 $user1 = self::getDataGenerator()->create_user($record); 529 // Create a bunch of other users to post. 530 $user2 = self::getDataGenerator()->create_user(); 531 $user3 = self::getDataGenerator()->create_user(); 532 $user4 = self::getDataGenerator()->create_user(); 533 534 // Set the first created user to the test user. 535 self::setUser($user1); 536 537 // Create courses to add the modules. 538 $course1 = self::getDataGenerator()->create_course(); 539 540 // First forum with tracking off. 541 $record = new stdClass(); 542 $record->course = $course1->id; 543 $record->trackingtype = FORUM_TRACKING_OFF; 544 $forum1 = self::getDataGenerator()->create_module('forum', $record); 545 546 // Add discussions to the forums. 547 $record = new stdClass(); 548 $record->course = $course1->id; 549 $record->userid = $user1->id; 550 $record->forum = $forum1->id; 551 $discussion1 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record); 552 553 // Add three replies to the discussion 1 from different users. 554 $record = new stdClass(); 555 $record->discussion = $discussion1->id; 556 $record->parent = $discussion1->firstpost; 557 $record->userid = $user2->id; 558 $discussion1reply1 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record); 559 560 $record->parent = $discussion1reply1->id; 561 $record->userid = $user3->id; 562 $discussion1reply2 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record); 563 564 $record->userid = $user4->id; 565 $discussion1reply3 = self::getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record); 566 567 // Enrol the user in the first course. 568 $enrol = enrol_get_plugin('manual'); 569 570 // We don't use the dataGenerator as we need to get the $instance2 to unenrol later. 571 $enrolinstances = enrol_get_instances($course1->id, true); 572 foreach ($enrolinstances as $courseenrolinstance) { 573 if ($courseenrolinstance->enrol == "manual") { 574 $instance1 = $courseenrolinstance; 575 break; 576 } 577 } 578 $enrol->enrol_user($instance1, $user1->id); 579 580 // Assign capabilities to view discussions for forum 1. 581 $cm = get_coursemodule_from_id('forum', $forum1->cmid, 0, false, MUST_EXIST); 582 $context = context_module::instance($cm->id); 583 $newrole = create_role('Role 2', 'role2', 'Role 2 description'); 584 $this->assignUserCapability('mod/forum:viewdiscussion', $context->id, $newrole); 585 586 // Create what we expect to be returned when querying the forums. 587 588 $post1 = $DB->get_record('forum_posts', array('id' => $discussion1->firstpost), '*', MUST_EXIST); 589 $userpictureurl = moodle_url::make_pluginfile_url( 590 context_user::instance($user1->id)->id, 'user', 'icon', null, '/', 'f1'); 591 $userpictureurl = str_replace("pluginfile.php", "webservice/pluginfile.php", $userpictureurl); 592 593 $usermodifiedpictureurl = moodle_url::make_pluginfile_url( 594 context_user::instance($user4->id)->id, 'user', 'icon', null, '/', 'f1'); 595 $usermodifiedpictureurl = str_replace("pluginfile.php", "webservice/pluginfile.php", $usermodifiedpictureurl); 596 597 $expecteddiscussions = array( 598 'id' => $discussion1->firstpost, 599 'name' => $discussion1->name, 600 'groupid' => $discussion1->groupid, 601 'timemodified' => $discussion1reply3->created, 602 'usermodified' => $discussion1reply3->userid, 603 'timestart' => $discussion1->timestart, 604 'timeend' => $discussion1->timeend, 605 'discussion' => $discussion1->id, 606 'parent' => 0, 607 'userid' => $discussion1->userid, 608 'created' => $post1->created, 609 'modified' => $post1->modified, 610 'mailed' => $post1->mailed, 611 'subject' => $post1->subject, 612 'message' => $post1->message, 613 'messageformat' => $post1->messageformat, 614 'messagetrust' => $post1->messagetrust, 615 'attachment' => $post1->attachment, 616 'totalscore' => $post1->totalscore, 617 'mailnow' => $post1->mailnow, 618 'userfullname' => fullname($user1), 619 'usermodifiedfullname' => fullname($user4), 620 'userpictureurl' => $userpictureurl, 621 'usermodifiedpictureurl' => $usermodifiedpictureurl, 622 'numreplies' => 3, 623 'numunread' => 0 624 ); 625 626 // Call the external function passing forum id. 627 $discussions = mod_forum_external::get_forum_discussions_paginated($forum1->id); 628 $discussions = external_api::clean_returnvalue(mod_forum_external::get_forum_discussions_paginated_returns(), $discussions); 629 $expectedreturn = array( 630 'discussions' => array($expecteddiscussions), 631 'warnings' => array() 632 ); 633 $this->assertEquals($expectedreturn, $discussions); 634 635 // Call without required view discussion capability. 636 $this->unassignUserCapability('mod/forum:viewdiscussion', $context->id, $newrole); 637 try { 638 mod_forum_external::get_forum_discussions_paginated($forum1->id); 639 $this->fail('Exception expected due to missing capability.'); 640 } catch (moodle_exception $e) { 641 $this->assertEquals('noviewdiscussionspermission', $e->errorcode); 642 } 643 644 // Unenrol user from second course. 645 $enrol->unenrol_user($instance1, $user1->id); 646 647 // Call for the second course we unenrolled the user from, make sure exception thrown. 648 try { 649 mod_forum_external::get_forum_discussions_paginated($forum1->id); 650 $this->fail('Exception expected due to being unenrolled from the course.'); 651 } catch (moodle_exception $e) { 652 $this->assertEquals('requireloginerror', $e->errorcode); 653 } 654 } 655 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 20:29:05 2014 | Cross-referenced by PHPXref 0.7.1 |