[ Index ]

PHP Cross Reference of moodle-2.8

title

Body

[close]

/mod/forum/tests/ -> externallib_test.php (source)

   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  }


Generated: Fri Nov 28 20:29:05 2014 Cross-referenced by PHPXref 0.7.1