Search moodle.org's
Developer Documentation

Long Term Support Release

  • Bug fixes for general core bugs in 3.5.x ended May 2019 (12 months).
  • Bug fixes for security issues in 3.5.x will end 10 May 2021 (36 months) - Support has ended.
  • minimum PHP 7.0.0 Note: minimum PHP version has increased since Moodle 3.3. PHP 7.1.x and 7.2.x are supported too. PHP 7.x could have some engine limitations.
  • Differences Between: [Versions 35 and 310] [Versions 35 and 311] [Versions 35 and 38] [Versions 35 and 39]

       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  /**
      18   * Tests for forum events.
      19   *
      20   * @package    mod_forum
      21   * @category   test
      22   * @copyright  2014 Dan Poltawski <dan@moodle.com>
      23   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
      24   */
      25  
      26  defined('MOODLE_INTERNAL') || die();
      27  
      28  /**
      29   * Tests for forum events.
      30   *
      31   * @package    mod_forum
      32   * @category   test
      33   * @copyright  2014 Dan Poltawski <dan@moodle.com>
      34   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
      35   */
      36  class mod_forum_events_testcase extends advanced_testcase {
      37  
      38      /**
      39       * Tests set up.
      40       */
      41      public function setUp() {
      42          // We must clear the subscription caches. This has to be done both before each test, and after in case of other
      43          // tests using these functions.
      44          \mod_forum\subscriptions::reset_forum_cache();
      45  
      46          $this->resetAfterTest();
      47      }
      48  
      49      public function tearDown() {
      50          // We must clear the subscription caches. This has to be done both before each test, and after in case of other
      51          // tests using these functions.
      52          \mod_forum\subscriptions::reset_forum_cache();
      53      }
      54  
      55      /**
      56       * Ensure course_searched event validates that searchterm is set.
      57       *
      58       * @expectedException        coding_exception
      59       * @expectedExceptionMessage The 'searchterm' value must be set in other.
      60       */
      61      public function test_course_searched_searchterm_validation() {
      62          $course = $this->getDataGenerator()->create_course();
      63          $coursectx = context_course::instance($course->id);
      64          $params = array(
      65              'context' => $coursectx,
      66          );
      67  
      68          \mod_forum\event\course_searched::create($params);
      69      }
      70  
      71      /**
      72       * Ensure course_searched event validates that context is the correct level.
      73       *
      74       * @expectedException        coding_exception
      75       * @expectedExceptionMessage Context level must be CONTEXT_COURSE.
      76       */
      77      public function test_course_searched_context_validation() {
      78          $course = $this->getDataGenerator()->create_course();
      79          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
      80          $context = context_module::instance($forum->cmid);
      81          $params = array(
      82              'context' => $context,
      83              'other' => array('searchterm' => 'testing'),
      84          );
      85  
      86          \mod_forum\event\course_searched::create($params);
      87      }
      88  
      89      /**
      90       * Test course_searched event.
      91       */
      92      public function test_course_searched() {
      93  
      94          // Setup test data.
      95          $course = $this->getDataGenerator()->create_course();
      96          $coursectx = context_course::instance($course->id);
      97          $searchterm = 'testing123';
      98  
      99          $params = array(
     100              'context' => $coursectx,
     101              'other' => array('searchterm' => $searchterm),
     102          );
     103  
     104          // Create event.
     105          $event = \mod_forum\event\course_searched::create($params);
     106  
     107          // Trigger and capture the event.
     108          $sink = $this->redirectEvents();
     109          $event->trigger();
     110          $events = $sink->get_events();
     111          $this->assertCount(1, $events);
     112          $event = reset($events);
     113  
     114           // Checking that the event contains the expected values.
     115          $this->assertInstanceOf('\mod_forum\event\course_searched', $event);
     116          $this->assertEquals($coursectx, $event->get_context());
     117          $expected = array($course->id, 'forum', 'search', "search.php?id={$course->id}&amp;search={$searchterm}", $searchterm);
     118          $this->assertEventLegacyLogData($expected, $event);
     119          $this->assertEventContextNotUsed($event);
     120  
     121          $this->assertNotEmpty($event->get_name());
     122      }
     123  
     124      /**
     125       * Ensure discussion_created event validates that forumid is set.
     126       *
     127       * @expectedException        coding_exception
     128       * @expectedExceptionMessage The 'forumid' value must be set in other.
     129       */
     130      public function test_discussion_created_forumid_validation() {
     131          $course = $this->getDataGenerator()->create_course();
     132          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     133          $context = context_module::instance($forum->cmid);
     134  
     135          $params = array(
     136              'context' => $context,
     137          );
     138  
     139          \mod_forum\event\discussion_created::create($params);
     140      }
     141  
     142      /**
     143       * Ensure discussion_created event validates that the context is the correct level.
     144       *
     145       * @expectedException        coding_exception
     146       * @expectedExceptionMessage Context level must be CONTEXT_MODULE.
     147       */
     148      public function test_discussion_created_context_validation() {
     149          $course = $this->getDataGenerator()->create_course();
     150          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     151  
     152          $params = array(
     153              'context' => context_system::instance(),
     154              'other' => array('forumid' => $forum->id),
     155          );
     156  
     157          \mod_forum\event\discussion_created::create($params);
     158      }
     159  
     160      /**
     161       * Test discussion_created event.
     162       */
     163      public function test_discussion_created() {
     164  
     165          // Setup test data.
     166          $course = $this->getDataGenerator()->create_course();
     167          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     168          $user = $this->getDataGenerator()->create_user();
     169  
     170          // Add a discussion.
     171          $record = array();
     172          $record['course'] = $course->id;
     173          $record['forum'] = $forum->id;
     174          $record['userid'] = $user->id;
     175          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
     176  
     177          $context = context_module::instance($forum->cmid);
     178  
     179          $params = array(
     180              'context' => $context,
     181              'objectid' => $discussion->id,
     182              'other' => array('forumid' => $forum->id),
     183          );
     184  
     185          // Create the event.
     186          $event = \mod_forum\event\discussion_created::create($params);
     187  
     188          // Trigger and capturing the event.
     189          $sink = $this->redirectEvents();
     190          $event->trigger();
     191          $events = $sink->get_events();
     192          $this->assertCount(1, $events);
     193          $event = reset($events);
     194  
     195          // Check that the event contains the expected values.
     196          $this->assertInstanceOf('\mod_forum\event\discussion_created', $event);
     197          $this->assertEquals($context, $event->get_context());
     198          $expected = array($course->id, 'forum', 'add discussion', "discuss.php?d={$discussion->id}", $discussion->id, $forum->cmid);
     199          $this->assertEventLegacyLogData($expected, $event);
     200          $this->assertEventContextNotUsed($event);
     201  
     202          $this->assertNotEmpty($event->get_name());
     203      }
     204  
     205      /**
     206       * Ensure discussion_updated event validates that forumid is set.
     207       *
     208       * @expectedException        coding_exception
     209       * @expectedExceptionMessage The 'forumid' value must be set in other.
     210       */
     211      public function test_discussion_updated_forumid_validation() {
     212          $course = $this->getDataGenerator()->create_course();
     213          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     214          $context = context_module::instance($forum->cmid);
     215  
     216          $params = array(
     217              'context' => $context,
     218          );
     219  
     220          \mod_forum\event\discussion_updated::create($params);
     221      }
     222  
     223      /**
     224       * Ensure discussion_created event validates that the context is the correct level.
     225       *
     226       * @expectedException        coding_exception
     227       * @expectedExceptionMessage Context level must be CONTEXT_MODULE.
     228       */
     229      public function test_discussion_updated_context_validation() {
     230          $course = $this->getDataGenerator()->create_course();
     231          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     232  
     233          $params = array(
     234              'context' => context_system::instance(),
     235              'other' => array('forumid' => $forum->id),
     236          );
     237  
     238          \mod_forum\event\discussion_updated::create($params);
     239      }
     240  
     241      /**
     242       * Test discussion_created event.
     243       */
     244      public function test_discussion_updated() {
     245  
     246          // Setup test data.
     247          $course = $this->getDataGenerator()->create_course();
     248          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     249          $user = $this->getDataGenerator()->create_user();
     250  
     251          // Add a discussion.
     252          $record = array();
     253          $record['course'] = $course->id;
     254          $record['forum'] = $forum->id;
     255          $record['userid'] = $user->id;
     256          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
     257  
     258          $context = context_module::instance($forum->cmid);
     259  
     260          $params = array(
     261              'context' => $context,
     262              'objectid' => $discussion->id,
     263              'other' => array('forumid' => $forum->id),
     264          );
     265  
     266          // Create the event.
     267          $event = \mod_forum\event\discussion_updated::create($params);
     268  
     269          // Trigger and capturing the event.
     270          $sink = $this->redirectEvents();
     271          $event->trigger();
     272          $events = $sink->get_events();
     273          $this->assertCount(1, $events);
     274          $event = reset($events);
     275  
     276          // Check that the event contains the expected values.
     277          $this->assertInstanceOf('\mod_forum\event\discussion_updated', $event);
     278          $this->assertEquals($context, $event->get_context());
     279          $this->assertEventContextNotUsed($event);
     280  
     281          $this->assertNotEmpty($event->get_name());
     282      }
     283  
     284      /**
     285       * Ensure discussion_deleted event validates that forumid is set.
     286       *
     287       * @expectedException        coding_exception
     288       * @expectedExceptionMessage The 'forumid' value must be set in other.
     289       */
     290      public function test_discussion_deleted_forumid_validation() {
     291          $course = $this->getDataGenerator()->create_course();
     292          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     293          $context = context_module::instance($forum->cmid);
     294  
     295          $params = array(
     296              'context' => $context,
     297          );
     298  
     299          \mod_forum\event\discussion_deleted::create($params);
     300      }
     301  
     302      /**
     303       * Ensure discussion_deleted event validates that context is of the correct level.
     304       *
     305       * @expectedException        coding_exception
     306       * @expectedExceptionMessage Context level must be CONTEXT_MODULE.
     307       */
     308      public function test_discussion_deleted_context_validation() {
     309          $course = $this->getDataGenerator()->create_course();
     310          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     311  
     312          $params = array(
     313              'context' => context_system::instance(),
     314              'other' => array('forumid' => $forum->id),
     315          );
     316  
     317          \mod_forum\event\discussion_deleted::create($params);
     318      }
     319  
     320      /**
     321       * Test discussion_deleted event.
     322       */
     323      public function test_discussion_deleted() {
     324  
     325          // Setup test data.
     326          $course = $this->getDataGenerator()->create_course();
     327          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     328          $user = $this->getDataGenerator()->create_user();
     329  
     330          // Add a discussion.
     331          $record = array();
     332          $record['course'] = $course->id;
     333          $record['forum'] = $forum->id;
     334          $record['userid'] = $user->id;
     335          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
     336  
     337          $context = context_module::instance($forum->cmid);
     338  
     339          $params = array(
     340              'context' => $context,
     341              'objectid' => $discussion->id,
     342              'other' => array('forumid' => $forum->id),
     343          );
     344  
     345          $event = \mod_forum\event\discussion_deleted::create($params);
     346  
     347          // Trigger and capture the event.
     348          $sink = $this->redirectEvents();
     349          $event->trigger();
     350          $events = $sink->get_events();
     351          $this->assertCount(1, $events);
     352          $event = reset($events);
     353  
     354          // Checking that the event contains the expected values.
     355          $this->assertInstanceOf('\mod_forum\event\discussion_deleted', $event);
     356          $this->assertEquals($context, $event->get_context());
     357          $expected = array($course->id, 'forum', 'delete discussion', "view.php?id={$forum->cmid}", $forum->id, $forum->cmid);
     358          $this->assertEventLegacyLogData($expected, $event);
     359          $this->assertEventContextNotUsed($event);
     360  
     361          $this->assertNotEmpty($event->get_name());
     362      }
     363  
     364      /**
     365       * Ensure discussion_moved event validates that fromforumid is set.
     366       *
     367       * @expectedException        coding_exception
     368       * @expectedExceptionMessage The 'fromforumid' value must be set in other.
     369       */
     370      public function test_discussion_moved_fromforumid_validation() {
     371          $course = $this->getDataGenerator()->create_course();
     372          $toforum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     373  
     374          $context = context_module::instance($toforum->cmid);
     375  
     376          $params = array(
     377              'context' => $context,
     378              'other' => array('toforumid' => $toforum->id)
     379          );
     380  
     381          \mod_forum\event\discussion_moved::create($params);
     382      }
     383  
     384      /**
     385       * Ensure discussion_moved event validates that toforumid is set.
     386       *
     387       * @expectedException        coding_exception
     388       * @expectedExceptionMessage The 'toforumid' value must be set in other.
     389       */
     390      public function test_discussion_moved_toforumid_validation() {
     391          $course = $this->getDataGenerator()->create_course();
     392          $fromforum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     393          $toforum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     394          $context = context_module::instance($toforum->cmid);
     395  
     396          $params = array(
     397              'context' => $context,
     398              'other' => array('fromforumid' => $fromforum->id)
     399          );
     400  
     401          \mod_forum\event\discussion_moved::create($params);
     402      }
     403  
     404      /**
     405       * Ensure discussion_moved event validates that the context level is correct.
     406       *
     407       * @expectedException        coding_exception
     408       * @expectedExceptionMessage Context level must be CONTEXT_MODULE.
     409       */
     410      public function test_discussion_moved_context_validation() {
     411          $course = $this->getDataGenerator()->create_course();
     412          $fromforum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     413          $toforum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     414          $user = $this->getDataGenerator()->create_user();
     415  
     416          // Add a discussion.
     417          $record = array();
     418          $record['course'] = $course->id;
     419          $record['forum'] = $fromforum->id;
     420          $record['userid'] = $user->id;
     421          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
     422  
     423          $params = array(
     424              'context' => context_system::instance(),
     425              'objectid' => $discussion->id,
     426              'other' => array('fromforumid' => $fromforum->id, 'toforumid' => $toforum->id)
     427          );
     428  
     429          \mod_forum\event\discussion_moved::create($params);
     430      }
     431  
     432      /**
     433       * Test discussion_moved event.
     434       */
     435      public function test_discussion_moved() {
     436          // Setup test data.
     437          $course = $this->getDataGenerator()->create_course();
     438          $fromforum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     439          $toforum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     440          $user = $this->getDataGenerator()->create_user();
     441  
     442          // Add a discussion.
     443          $record = array();
     444          $record['course'] = $course->id;
     445          $record['forum'] = $fromforum->id;
     446          $record['userid'] = $user->id;
     447          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
     448  
     449          $context = context_module::instance($toforum->cmid);
     450  
     451          $params = array(
     452              'context' => $context,
     453              'objectid' => $discussion->id,
     454              'other' => array('fromforumid' => $fromforum->id, 'toforumid' => $toforum->id)
     455          );
     456  
     457          $event = \mod_forum\event\discussion_moved::create($params);
     458  
     459          // Trigger and capture the event.
     460          $sink = $this->redirectEvents();
     461          $event->trigger();
     462          $events = $sink->get_events();
     463          $this->assertCount(1, $events);
     464          $event = reset($events);
     465  
     466          // Checking that the event contains the expected values.
     467          $this->assertInstanceOf('\mod_forum\event\discussion_moved', $event);
     468          $this->assertEquals($context, $event->get_context());
     469          $expected = array($course->id, 'forum', 'move discussion', "discuss.php?d={$discussion->id}",
     470              $discussion->id, $toforum->cmid);
     471          $this->assertEventLegacyLogData($expected, $event);
     472          $this->assertEventContextNotUsed($event);
     473  
     474          $this->assertNotEmpty($event->get_name());
     475      }
     476  
     477  
     478      /**
     479       * Ensure discussion_viewed event validates that the contextlevel is correct.
     480       *
     481       * @expectedException        coding_exception
     482       * @expectedExceptionMessage Context level must be CONTEXT_MODULE.
     483       */
     484      public function test_discussion_viewed_context_validation() {
     485          $course = $this->getDataGenerator()->create_course();
     486          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     487          $user = $this->getDataGenerator()->create_user();
     488  
     489          // Add a discussion.
     490          $record = array();
     491          $record['course'] = $course->id;
     492          $record['forum'] = $forum->id;
     493          $record['userid'] = $user->id;
     494          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
     495  
     496          $params = array(
     497              'context' => context_system::instance(),
     498              'objectid' => $discussion->id,
     499          );
     500  
     501          \mod_forum\event\discussion_viewed::create($params);
     502      }
     503  
     504      /**
     505       * Test discussion_viewed event.
     506       */
     507      public function test_discussion_viewed() {
     508          // Setup test data.
     509          $course = $this->getDataGenerator()->create_course();
     510          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     511          $user = $this->getDataGenerator()->create_user();
     512  
     513          // Add a discussion.
     514          $record = array();
     515          $record['course'] = $course->id;
     516          $record['forum'] = $forum->id;
     517          $record['userid'] = $user->id;
     518          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
     519  
     520          $context = context_module::instance($forum->cmid);
     521  
     522          $params = array(
     523              'context' => $context,
     524              'objectid' => $discussion->id,
     525          );
     526  
     527          $event = \mod_forum\event\discussion_viewed::create($params);
     528  
     529          // Trigger and capture the event.
     530          $sink = $this->redirectEvents();
     531          $event->trigger();
     532          $events = $sink->get_events();
     533          $this->assertCount(1, $events);
     534          $event = reset($events);
     535  
     536          // Checking that the event contains the expected values.
     537          $this->assertInstanceOf('\mod_forum\event\discussion_viewed', $event);
     538          $this->assertEquals($context, $event->get_context());
     539          $expected = array($course->id, 'forum', 'view discussion', "discuss.php?d={$discussion->id}",
     540              $discussion->id, $forum->cmid);
     541          $this->assertEventLegacyLogData($expected, $event);
     542          $this->assertEventContextNotUsed($event);
     543  
     544          $this->assertNotEmpty($event->get_name());
     545      }
     546  
     547      /**
     548       * Ensure course_module_viewed event validates that the contextlevel is correct.
     549       *
     550       * @expectedException        coding_exception
     551       * @expectedExceptionMessage Context level must be CONTEXT_MODULE.
     552       */
     553      public function test_course_module_viewed_context_validation() {
     554          $course = $this->getDataGenerator()->create_course();
     555          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     556  
     557          $params = array(
     558              'context' => context_system::instance(),
     559              'objectid' => $forum->id,
     560          );
     561  
     562          \mod_forum\event\course_module_viewed::create($params);
     563      }
     564  
     565      /**
     566       * Test the course_module_viewed event.
     567       */
     568      public function test_course_module_viewed() {
     569          // Setup test data.
     570          $course = $this->getDataGenerator()->create_course();
     571          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     572  
     573          $context = context_module::instance($forum->cmid);
     574  
     575          $params = array(
     576              'context' => $context,
     577              'objectid' => $forum->id,
     578          );
     579  
     580          $event = \mod_forum\event\course_module_viewed::create($params);
     581  
     582          // Trigger and capture the event.
     583          $sink = $this->redirectEvents();
     584          $event->trigger();
     585          $events = $sink->get_events();
     586          $this->assertCount(1, $events);
     587          $event = reset($events);
     588  
     589          // Checking that the event contains the expected values.
     590          $this->assertInstanceOf('\mod_forum\event\course_module_viewed', $event);
     591          $this->assertEquals($context, $event->get_context());
     592          $expected = array($course->id, 'forum', 'view forum', "view.php?f={$forum->id}", $forum->id, $forum->cmid);
     593          $this->assertEventLegacyLogData($expected, $event);
     594          $url = new \moodle_url('/mod/forum/view.php', array('f' => $forum->id));
     595          $this->assertEquals($url, $event->get_url());
     596          $this->assertEventContextNotUsed($event);
     597  
     598          $this->assertNotEmpty($event->get_name());
     599      }
     600  
     601      /**
     602       * Ensure subscription_created event validates that the forumid is set.
     603       *
     604       * @expectedException        coding_exception
     605       * @expectedExceptionMessage The 'forumid' value must be set in other.
     606       */
     607      public function test_subscription_created_forumid_validation() {
     608          $user = $this->getDataGenerator()->create_user();
     609          $course = $this->getDataGenerator()->create_course();
     610          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     611  
     612          $params = array(
     613              'context' => context_module::instance($forum->cmid),
     614              'relateduserid' => $user->id,
     615          );
     616  
     617          \mod_forum\event\subscription_created::create($params);
     618      }
     619  
     620      /**
     621       * Ensure subscription_created event validates that the relateduserid is set.
     622       *
     623       * @expectedException        coding_exception
     624       * @expectedExceptionMessage The 'relateduserid' must be set.
     625       */
     626      public function test_subscription_created_relateduserid_validation() {
     627          $course = $this->getDataGenerator()->create_course();
     628          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     629  
     630          $params = array(
     631              'context' => context_module::instance($forum->cmid),
     632              'objectid' => $forum->id,
     633          );
     634  
     635          \mod_forum\event\subscription_created::create($params);
     636      }
     637  
     638      /**
     639       * Ensure subscription_created event validates that the contextlevel is correct.
     640       *
     641       * @expectedException        coding_exception
     642       * @expectedExceptionMessage Context level must be CONTEXT_MODULE.
     643       */
     644      public function test_subscription_created_contextlevel_validation() {
     645          $user = $this->getDataGenerator()->create_user();
     646          $course = $this->getDataGenerator()->create_course();
     647          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     648  
     649          $params = array(
     650              'context' => context_system::instance(),
     651              'other' => array('forumid' => $forum->id),
     652              'relateduserid' => $user->id,
     653          );
     654  
     655          \mod_forum\event\subscription_created::create($params);
     656      }
     657  
     658      /**
     659       * Test the subscription_created event.
     660       */
     661      public function test_subscription_created() {
     662          // Setup test data.
     663          $user = $this->getDataGenerator()->create_user();
     664          $course = $this->getDataGenerator()->create_course();
     665          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     666          $user = $this->getDataGenerator()->create_user();
     667          $context = context_module::instance($forum->cmid);
     668  
     669          // Add a subscription.
     670          $record = array();
     671          $record['course'] = $course->id;
     672          $record['forum'] = $forum->id;
     673          $record['userid'] = $user->id;
     674          $subscription = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_subscription($record);
     675  
     676          $params = array(
     677              'context' => $context,
     678              'objectid' => $subscription->id,
     679              'other' => array('forumid' => $forum->id),
     680              'relateduserid' => $user->id,
     681          );
     682  
     683          $event = \mod_forum\event\subscription_created::create($params);
     684  
     685          // Trigger and capturing the event.
     686          $sink = $this->redirectEvents();
     687          $event->trigger();
     688          $events = $sink->get_events();
     689          $this->assertCount(1, $events);
     690          $event = reset($events);
     691  
     692          // Checking that the event contains the expected values.
     693          $this->assertInstanceOf('\mod_forum\event\subscription_created', $event);
     694          $this->assertEquals($context, $event->get_context());
     695          $expected = array($course->id, 'forum', 'subscribe', "view.php?f={$forum->id}", $forum->id, $forum->cmid);
     696          $this->assertEventLegacyLogData($expected, $event);
     697          $url = new \moodle_url('/mod/forum/subscribers.php', array('id' => $forum->id));
     698          $this->assertEquals($url, $event->get_url());
     699          $this->assertEventContextNotUsed($event);
     700  
     701          $this->assertNotEmpty($event->get_name());
     702      }
     703  
     704      /**
     705       * Ensure subscription_deleted event validates that the forumid is set.
     706       *
     707       * @expectedException        coding_exception
     708       * @expectedExceptionMessage The 'forumid' value must be set in other.
     709       */
     710      public function test_subscription_deleted_forumid_validation() {
     711          $user = $this->getDataGenerator()->create_user();
     712          $course = $this->getDataGenerator()->create_course();
     713          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     714  
     715          $params = array(
     716              'context' => context_module::instance($forum->cmid),
     717              'relateduserid' => $user->id,
     718          );
     719  
     720          \mod_forum\event\subscription_deleted::create($params);
     721      }
     722  
     723      /**
     724       * Ensure subscription_deleted event validates that the relateduserid is set.
     725       *
     726       * @expectedException        coding_exception
     727       * @expectedExceptionMessage The 'relateduserid' must be set.
     728       */
     729      public function test_subscription_deleted_relateduserid_validation() {
     730          $course = $this->getDataGenerator()->create_course();
     731          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     732  
     733          $params = array(
     734              'context' => context_module::instance($forum->cmid),
     735              'objectid' => $forum->id,
     736          );
     737  
     738          \mod_forum\event\subscription_deleted::create($params);
     739      }
     740  
     741      /**
     742       * Ensure subscription_deleted event validates that the contextlevel is correct.
     743       *
     744       * @expectedException        coding_exception
     745       * @expectedExceptionMessage Context level must be CONTEXT_MODULE.
     746       */
     747      public function test_subscription_deleted_contextlevel_validation() {
     748          $user = $this->getDataGenerator()->create_user();
     749          $course = $this->getDataGenerator()->create_course();
     750          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     751  
     752          $params = array(
     753              'context' => context_system::instance(),
     754              'other' => array('forumid' => $forum->id),
     755              'relateduserid' => $user->id,
     756          );
     757  
     758          \mod_forum\event\subscription_deleted::create($params);
     759      }
     760  
     761      /**
     762       * Test the subscription_deleted event.
     763       */
     764      public function test_subscription_deleted() {
     765          // Setup test data.
     766          $user = $this->getDataGenerator()->create_user();
     767          $course = $this->getDataGenerator()->create_course();
     768          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     769          $user = $this->getDataGenerator()->create_user();
     770          $context = context_module::instance($forum->cmid);
     771  
     772          // Add a subscription.
     773          $record = array();
     774          $record['course'] = $course->id;
     775          $record['forum'] = $forum->id;
     776          $record['userid'] = $user->id;
     777          $subscription = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_subscription($record);
     778  
     779          $params = array(
     780              'context' => $context,
     781              'objectid' => $subscription->id,
     782              'other' => array('forumid' => $forum->id),
     783              'relateduserid' => $user->id,
     784          );
     785  
     786          $event = \mod_forum\event\subscription_deleted::create($params);
     787  
     788          // Trigger and capturing the event.
     789          $sink = $this->redirectEvents();
     790          $event->trigger();
     791          $events = $sink->get_events();
     792          $this->assertCount(1, $events);
     793          $event = reset($events);
     794  
     795          // Checking that the event contains the expected values.
     796          $this->assertInstanceOf('\mod_forum\event\subscription_deleted', $event);
     797          $this->assertEquals($context, $event->get_context());
     798          $expected = array($course->id, 'forum', 'unsubscribe', "view.php?f={$forum->id}", $forum->id, $forum->cmid);
     799          $this->assertEventLegacyLogData($expected, $event);
     800          $url = new \moodle_url('/mod/forum/subscribers.php', array('id' => $forum->id));
     801          $this->assertEquals($url, $event->get_url());
     802          $this->assertEventContextNotUsed($event);
     803  
     804          $this->assertNotEmpty($event->get_name());
     805      }
     806  
     807      /**
     808       * Ensure readtracking_enabled event validates that the forumid is set.
     809       *
     810       * @expectedException        coding_exception
     811       * @expectedExceptionMessage The 'forumid' value must be set in other.
     812       */
     813      public function test_readtracking_enabled_forumid_validation() {
     814          $user = $this->getDataGenerator()->create_user();
     815          $course = $this->getDataGenerator()->create_course();
     816          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     817  
     818          $params = array(
     819              'context' => context_module::instance($forum->cmid),
     820              'relateduserid' => $user->id,
     821          );
     822  
     823          \mod_forum\event\readtracking_enabled::create($params);
     824      }
     825  
     826      /**
     827       * Ensure readtracking_enabled event validates that the relateduserid is set.
     828       *
     829       * @expectedException        coding_exception
     830       * @expectedExceptionMessage The 'relateduserid' must be set.
     831       */
     832      public function test_readtracking_enabled_relateduserid_validation() {
     833          $course = $this->getDataGenerator()->create_course();
     834          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     835  
     836          $params = array(
     837              'context' => context_module::instance($forum->cmid),
     838              'objectid' => $forum->id,
     839          );
     840  
     841          \mod_forum\event\readtracking_enabled::create($params);
     842      }
     843  
     844      /**
     845       * Ensure readtracking_enabled event validates that the contextlevel is correct.
     846       *
     847       * @expectedException        coding_exception
     848       * @expectedExceptionMessage Context level must be CONTEXT_MODULE.
     849       */
     850      public function test_readtracking_enabled_contextlevel_validation() {
     851          $user = $this->getDataGenerator()->create_user();
     852          $course = $this->getDataGenerator()->create_course();
     853          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     854  
     855          $params = array(
     856              'context' => context_system::instance(),
     857              'other' => array('forumid' => $forum->id),
     858              'relateduserid' => $user->id,
     859          );
     860  
     861          \mod_forum\event\readtracking_enabled::create($params);
     862      }
     863  
     864      /**
     865       * Test the readtracking_enabled event.
     866       */
     867      public function test_readtracking_enabled() {
     868          // Setup test data.
     869          $user = $this->getDataGenerator()->create_user();
     870          $course = $this->getDataGenerator()->create_course();
     871          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     872          $context = context_module::instance($forum->cmid);
     873  
     874          $params = array(
     875              'context' => $context,
     876              'other' => array('forumid' => $forum->id),
     877              'relateduserid' => $user->id,
     878          );
     879  
     880          $event = \mod_forum\event\readtracking_enabled::create($params);
     881  
     882          // Trigger and capture the event.
     883          $sink = $this->redirectEvents();
     884          $event->trigger();
     885          $events = $sink->get_events();
     886          $this->assertCount(1, $events);
     887          $event = reset($events);
     888  
     889          // Checking that the event contains the expected values.
     890          $this->assertInstanceOf('\mod_forum\event\readtracking_enabled', $event);
     891          $this->assertEquals($context, $event->get_context());
     892          $expected = array($course->id, 'forum', 'start tracking', "view.php?f={$forum->id}", $forum->id, $forum->cmid);
     893          $this->assertEventLegacyLogData($expected, $event);
     894          $url = new \moodle_url('/mod/forum/view.php', array('f' => $forum->id));
     895          $this->assertEquals($url, $event->get_url());
     896          $this->assertEventContextNotUsed($event);
     897  
     898          $this->assertNotEmpty($event->get_name());
     899      }
     900  
     901      /**
     902       *  Ensure readtracking_disabled event validates that the forumid is set.
     903       *
     904       * @expectedException        coding_exception
     905       * @expectedExceptionMessage The 'forumid' value must be set in other.
     906       */
     907      public function test_readtracking_disabled_forumid_validation() {
     908          $user = $this->getDataGenerator()->create_user();
     909          $course = $this->getDataGenerator()->create_course();
     910          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     911  
     912          $params = array(
     913              'context' => context_module::instance($forum->cmid),
     914              'relateduserid' => $user->id,
     915          );
     916  
     917          \mod_forum\event\readtracking_disabled::create($params);
     918      }
     919  
     920      /**
     921       *  Ensure readtracking_disabled event validates that the relateduserid is set.
     922       *
     923       * @expectedException        coding_exception
     924       * @expectedExceptionMessage The 'relateduserid' must be set.
     925       */
     926      public function test_readtracking_disabled_relateduserid_validation() {
     927          $course = $this->getDataGenerator()->create_course();
     928          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     929  
     930          $params = array(
     931              'context' => context_module::instance($forum->cmid),
     932              'objectid' => $forum->id,
     933          );
     934  
     935          \mod_forum\event\readtracking_disabled::create($params);
     936      }
     937  
     938      /**
     939       *  Ensure readtracking_disabled event validates that the contextlevel is correct
     940       *
     941       * @expectedException        coding_exception
     942       * @expectedExceptionMessage Context level must be CONTEXT_MODULE.
     943       */
     944      public function test_readtracking_disabled_contextlevel_validation() {
     945          $user = $this->getDataGenerator()->create_user();
     946          $course = $this->getDataGenerator()->create_course();
     947          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     948  
     949          $params = array(
     950              'context' => context_system::instance(),
     951              'other' => array('forumid' => $forum->id),
     952              'relateduserid' => $user->id,
     953          );
     954  
     955          \mod_forum\event\readtracking_disabled::create($params);
     956      }
     957  
     958      /**
     959       *  Test the readtracking_disabled event.
     960       */
     961      public function test_readtracking_disabled() {
     962          // Setup test data.
     963          $user = $this->getDataGenerator()->create_user();
     964          $course = $this->getDataGenerator()->create_course();
     965          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
     966          $context = context_module::instance($forum->cmid);
     967  
     968          $params = array(
     969              'context' => $context,
     970              'other' => array('forumid' => $forum->id),
     971              'relateduserid' => $user->id,
     972          );
     973  
     974          $event = \mod_forum\event\readtracking_disabled::create($params);
     975  
     976          // Trigger and capture the event.
     977          $sink = $this->redirectEvents();
     978          $event->trigger();
     979          $events = $sink->get_events();
     980          $this->assertCount(1, $events);
     981          $event = reset($events);
     982  
     983          // Checking that the event contains the expected values.
     984          $this->assertInstanceOf('\mod_forum\event\readtracking_disabled', $event);
     985          $this->assertEquals($context, $event->get_context());
     986          $expected = array($course->id, 'forum', 'stop tracking', "view.php?f={$forum->id}", $forum->id, $forum->cmid);
     987          $this->assertEventLegacyLogData($expected, $event);
     988          $url = new \moodle_url('/mod/forum/view.php', array('f' => $forum->id));
     989          $this->assertEquals($url, $event->get_url());
     990          $this->assertEventContextNotUsed($event);
     991  
     992          $this->assertNotEmpty($event->get_name());
     993      }
     994  
     995      /**
     996       *  Ensure subscribers_viewed event validates that the forumid is set.
     997       *
     998       * @expectedException        coding_exception
     999       * @expectedExceptionMessage The 'forumid' value must be set in other.
    1000       */
    1001      public function test_subscribers_viewed_forumid_validation() {
    1002          $user = $this->getDataGenerator()->create_user();
    1003          $course = $this->getDataGenerator()->create_course();
    1004          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1005  
    1006          $params = array(
    1007              'context' => context_module::instance($forum->cmid),
    1008              'relateduserid' => $user->id,
    1009          );
    1010  
    1011          \mod_forum\event\subscribers_viewed::create($params);
    1012      }
    1013  
    1014      /**
    1015       *  Ensure subscribers_viewed event validates that the contextlevel is correct.
    1016       *
    1017       * @expectedException        coding_exception
    1018       * @expectedExceptionMessage Context level must be CONTEXT_MODULE.
    1019       */
    1020      public function test_subscribers_viewed_contextlevel_validation() {
    1021          $user = $this->getDataGenerator()->create_user();
    1022          $course = $this->getDataGenerator()->create_course();
    1023          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1024  
    1025          $params = array(
    1026              'context' => context_system::instance(),
    1027              'other' => array('forumid' => $forum->id),
    1028              'relateduserid' => $user->id,
    1029          );
    1030  
    1031          \mod_forum\event\subscribers_viewed::create($params);
    1032      }
    1033  
    1034      /**
    1035       *  Test the subscribers_viewed event.
    1036       */
    1037      public function test_subscribers_viewed() {
    1038          // Setup test data.
    1039          $course = $this->getDataGenerator()->create_course();
    1040          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1041          $context = context_module::instance($forum->cmid);
    1042  
    1043          $params = array(
    1044              'context' => $context,
    1045              'other' => array('forumid' => $forum->id),
    1046          );
    1047  
    1048          $event = \mod_forum\event\subscribers_viewed::create($params);
    1049  
    1050          // Trigger and capture the event.
    1051          $sink = $this->redirectEvents();
    1052          $event->trigger();
    1053          $events = $sink->get_events();
    1054          $this->assertCount(1, $events);
    1055          $event = reset($events);
    1056  
    1057          // Checking that the event contains the expected values.
    1058          $this->assertInstanceOf('\mod_forum\event\subscribers_viewed', $event);
    1059          $this->assertEquals($context, $event->get_context());
    1060          $expected = array($course->id, 'forum', 'view subscribers', "subscribers.php?id={$forum->id}", $forum->id, $forum->cmid);
    1061          $this->assertEventLegacyLogData($expected, $event);
    1062          $this->assertEventContextNotUsed($event);
    1063  
    1064          $this->assertNotEmpty($event->get_name());
    1065      }
    1066  
    1067      /**
    1068       * Ensure user_report_viewed event validates that the reportmode is set.
    1069       *
    1070       * @expectedException        coding_exception
    1071       * @expectedExceptionMessage The 'reportmode' value must be set in other.
    1072       */
    1073      public function test_user_report_viewed_reportmode_validation() {
    1074          $user = $this->getDataGenerator()->create_user();
    1075          $course = $this->getDataGenerator()->create_course();
    1076  
    1077          $params = array(
    1078              'context' => context_course::instance($course->id),
    1079              'relateduserid' => $user->id,
    1080          );
    1081  
    1082          \mod_forum\event\user_report_viewed::create($params);
    1083      }
    1084  
    1085      /**
    1086       * Ensure user_report_viewed event validates that the contextlevel is correct.
    1087       *
    1088       * @expectedException        coding_exception
    1089       * @expectedExceptionMessage Context level must be either CONTEXT_SYSTEM, CONTEXT_COURSE or CONTEXT_USER.
    1090       */
    1091      public function test_user_report_viewed_contextlevel_validation() {
    1092          $user = $this->getDataGenerator()->create_user();
    1093          $course = $this->getDataGenerator()->create_course();
    1094          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1095  
    1096          $params = array(
    1097              'context' => context_module::instance($forum->cmid),
    1098              'other' => array('reportmode' => 'posts'),
    1099              'relateduserid' => $user->id,
    1100          );
    1101  
    1102          \mod_forum\event\user_report_viewed::create($params);
    1103      }
    1104  
    1105      /**
    1106       *  Ensure user_report_viewed event validates that the relateduserid is set.
    1107       *
    1108       * @expectedException        coding_exception
    1109       * @expectedExceptionMessage The 'relateduserid' must be set.
    1110       */
    1111      public function test_user_report_viewed_relateduserid_validation() {
    1112  
    1113          $params = array(
    1114              'context' => context_system::instance(),
    1115              'other' => array('reportmode' => 'posts'),
    1116          );
    1117  
    1118          \mod_forum\event\user_report_viewed::create($params);
    1119      }
    1120  
    1121      /**
    1122       * Test the user_report_viewed event.
    1123       */
    1124      public function test_user_report_viewed() {
    1125          // Setup test data.
    1126          $user = $this->getDataGenerator()->create_user();
    1127          $course = $this->getDataGenerator()->create_course();
    1128          $context = context_course::instance($course->id);
    1129  
    1130          $params = array(
    1131              'context' => $context,
    1132              'relateduserid' => $user->id,
    1133              'other' => array('reportmode' => 'discussions'),
    1134          );
    1135  
    1136          $event = \mod_forum\event\user_report_viewed::create($params);
    1137  
    1138          // Trigger and capture the event.
    1139          $sink = $this->redirectEvents();
    1140          $event->trigger();
    1141          $events = $sink->get_events();
    1142          $this->assertCount(1, $events);
    1143          $event = reset($events);
    1144  
    1145          // Checking that the event contains the expected values.
    1146          $this->assertInstanceOf('\mod_forum\event\user_report_viewed', $event);
    1147          $this->assertEquals($context, $event->get_context());
    1148          $expected = array($course->id, 'forum', 'user report',
    1149              "user.php?id={$user->id}&amp;mode=discussions&amp;course={$course->id}", $user->id);
    1150          $this->assertEventLegacyLogData($expected, $event);
    1151          $this->assertEventContextNotUsed($event);
    1152  
    1153          $this->assertNotEmpty($event->get_name());
    1154      }
    1155  
    1156      /**
    1157       *  Ensure post_created event validates that the postid is set.
    1158       */
    1159      public function test_post_created_postid_validation() {
    1160          $course = $this->getDataGenerator()->create_course();
    1161          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1162          $user = $this->getDataGenerator()->create_user();
    1163  
    1164          // Add a discussion.
    1165          $record = array();
    1166          $record['course'] = $course->id;
    1167          $record['forum'] = $forum->id;
    1168          $record['userid'] = $user->id;
    1169          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1170  
    1171          $params = array(
    1172              'context' => context_module::instance($forum->cmid),
    1173              'other' => array('forumid' => $forum->id, 'forumtype' => $forum->type, 'discussionid' => $discussion->id)
    1174          );
    1175  
    1176          \mod_forum\event\post_created::create($params);
    1177      }
    1178  
    1179      /**
    1180       * Ensure post_created event validates that the discussionid is set.
    1181       *
    1182       * @expectedException        coding_exception
    1183       * @expectedExceptionMessage The 'discussionid' value must be set in other.
    1184       */
    1185      public function test_post_created_discussionid_validation() {
    1186          $course = $this->getDataGenerator()->create_course();
    1187          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1188          $user = $this->getDataGenerator()->create_user();
    1189  
    1190          // Add a discussion.
    1191          $record = array();
    1192          $record['course'] = $course->id;
    1193          $record['forum'] = $forum->id;
    1194          $record['userid'] = $user->id;
    1195          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1196  
    1197          // Add a post.
    1198          $record = array();
    1199          $record['discussion'] = $discussion->id;
    1200          $record['userid'] = $user->id;
    1201          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    1202  
    1203          $params = array(
    1204              'context' => context_module::instance($forum->cmid),
    1205              'objectid' => $post->id,
    1206              'other' => array('forumid' => $forum->id, 'forumtype' => $forum->type)
    1207          );
    1208  
    1209          \mod_forum\event\post_created::create($params);
    1210      }
    1211  
    1212      /**
    1213       *  Ensure post_created event validates that the forumid is set.
    1214       *
    1215       * @expectedException        coding_exception
    1216       * @expectedExceptionMessage The 'forumid' value must be set in other.
    1217       */
    1218      public function test_post_created_forumid_validation() {
    1219          $course = $this->getDataGenerator()->create_course();
    1220          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1221          $user = $this->getDataGenerator()->create_user();
    1222  
    1223          // Add a discussion.
    1224          $record = array();
    1225          $record['course'] = $course->id;
    1226          $record['forum'] = $forum->id;
    1227          $record['userid'] = $user->id;
    1228          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1229  
    1230          // Add a post.
    1231          $record = array();
    1232          $record['discussion'] = $discussion->id;
    1233          $record['userid'] = $user->id;
    1234          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    1235  
    1236          $params = array(
    1237              'context' => context_module::instance($forum->cmid),
    1238              'objectid' => $post->id,
    1239              'other' => array('discussionid' => $discussion->id, 'forumtype' => $forum->type)
    1240          );
    1241  
    1242          \mod_forum\event\post_created::create($params);
    1243      }
    1244  
    1245      /**
    1246       * Ensure post_created event validates that the forumtype is set.
    1247       *
    1248       * @expectedException        coding_exception
    1249       * @expectedExceptionMessage The 'forumtype' value must be set in other.
    1250       */
    1251      public function test_post_created_forumtype_validation() {
    1252          $course = $this->getDataGenerator()->create_course();
    1253          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1254          $user = $this->getDataGenerator()->create_user();
    1255  
    1256          // Add a discussion.
    1257          $record = array();
    1258          $record['course'] = $course->id;
    1259          $record['forum'] = $forum->id;
    1260          $record['userid'] = $user->id;
    1261          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1262  
    1263          // Add a post.
    1264          $record = array();
    1265          $record['discussion'] = $discussion->id;
    1266          $record['userid'] = $user->id;
    1267          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    1268  
    1269          $params = array(
    1270              'context' => context_module::instance($forum->cmid),
    1271              'objectid' => $post->id,
    1272              'other' => array('discussionid' => $discussion->id, 'forumid' => $forum->id)
    1273          );
    1274  
    1275          \mod_forum\event\post_created::create($params);
    1276      }
    1277  
    1278      /**
    1279       *  Ensure post_created event validates that the contextlevel is correct.
    1280       *
    1281       * @expectedException        coding_exception
    1282       * @expectedExceptionMessage Context level must be CONTEXT_MODULE.
    1283       */
    1284      public function test_post_created_context_validation() {
    1285          $course = $this->getDataGenerator()->create_course();
    1286          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1287          $user = $this->getDataGenerator()->create_user();
    1288  
    1289          // Add a discussion.
    1290          $record = array();
    1291          $record['course'] = $course->id;
    1292          $record['forum'] = $forum->id;
    1293          $record['userid'] = $user->id;
    1294          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1295  
    1296          // Add a post.
    1297          $record = array();
    1298          $record['discussion'] = $discussion->id;
    1299          $record['userid'] = $user->id;
    1300          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    1301  
    1302          $params = array(
    1303              'context' => context_system::instance(),
    1304              'objectid' => $post->id,
    1305              'other' => array('discussionid' => $discussion->id, 'forumid' => $forum->id, 'forumtype' => $forum->type)
    1306          );
    1307  
    1308          \mod_forum\event\post_created::create($params);
    1309      }
    1310  
    1311      /**
    1312       * Test the post_created event.
    1313       */
    1314      public function test_post_created() {
    1315          // Setup test data.
    1316          $course = $this->getDataGenerator()->create_course();
    1317          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1318          $user = $this->getDataGenerator()->create_user();
    1319  
    1320          // Add a discussion.
    1321          $record = array();
    1322          $record['course'] = $course->id;
    1323          $record['forum'] = $forum->id;
    1324          $record['userid'] = $user->id;
    1325          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1326  
    1327          // Add a post.
    1328          $record = array();
    1329          $record['discussion'] = $discussion->id;
    1330          $record['userid'] = $user->id;
    1331          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    1332  
    1333          $context = context_module::instance($forum->cmid);
    1334  
    1335          $params = array(
    1336              'context' => $context,
    1337              'objectid' => $post->id,
    1338              'other' => array('discussionid' => $discussion->id, 'forumid' => $forum->id, 'forumtype' => $forum->type)
    1339          );
    1340  
    1341          $event = \mod_forum\event\post_created::create($params);
    1342  
    1343          // Trigger and capturing the event.
    1344          $sink = $this->redirectEvents();
    1345          $event->trigger();
    1346          $events = $sink->get_events();
    1347          $this->assertCount(1, $events);
    1348          $event = reset($events);
    1349  
    1350          // Checking that the event contains the expected values.
    1351          $this->assertInstanceOf('\mod_forum\event\post_created', $event);
    1352          $this->assertEquals($context, $event->get_context());
    1353          $expected = array($course->id, 'forum', 'add post', "discuss.php?d={$discussion->id}#p{$post->id}",
    1354              $forum->id, $forum->cmid);
    1355          $this->assertEventLegacyLogData($expected, $event);
    1356          $url = new \moodle_url('/mod/forum/discuss.php', array('d' => $discussion->id));
    1357          $url->set_anchor('p'.$event->objectid);
    1358          $this->assertEquals($url, $event->get_url());
    1359          $this->assertEventContextNotUsed($event);
    1360  
    1361          $this->assertNotEmpty($event->get_name());
    1362      }
    1363  
    1364      /**
    1365       * Test the post_created event for a single discussion forum.
    1366       */
    1367      public function test_post_created_single() {
    1368          // Setup test data.
    1369          $course = $this->getDataGenerator()->create_course();
    1370          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id, 'type' => 'single'));
    1371          $user = $this->getDataGenerator()->create_user();
    1372  
    1373          // Add a discussion.
    1374          $record = array();
    1375          $record['course'] = $course->id;
    1376          $record['forum'] = $forum->id;
    1377          $record['userid'] = $user->id;
    1378          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1379  
    1380          // Add a post.
    1381          $record = array();
    1382          $record['discussion'] = $discussion->id;
    1383          $record['userid'] = $user->id;
    1384          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    1385  
    1386          $context = context_module::instance($forum->cmid);
    1387  
    1388          $params = array(
    1389              'context' => $context,
    1390              'objectid' => $post->id,
    1391              'other' => array('discussionid' => $discussion->id, 'forumid' => $forum->id, 'forumtype' => $forum->type)
    1392          );
    1393  
    1394          $event = \mod_forum\event\post_created::create($params);
    1395  
    1396          // Trigger and capturing the event.
    1397          $sink = $this->redirectEvents();
    1398          $event->trigger();
    1399          $events = $sink->get_events();
    1400          $this->assertCount(1, $events);
    1401          $event = reset($events);
    1402  
    1403          // Checking that the event contains the expected values.
    1404          $this->assertInstanceOf('\mod_forum\event\post_created', $event);
    1405          $this->assertEquals($context, $event->get_context());
    1406          $expected = array($course->id, 'forum', 'add post', "view.php?f={$forum->id}#p{$post->id}",
    1407              $forum->id, $forum->cmid);
    1408          $this->assertEventLegacyLogData($expected, $event);
    1409          $url = new \moodle_url('/mod/forum/view.php', array('f' => $forum->id));
    1410          $url->set_anchor('p'.$event->objectid);
    1411          $this->assertEquals($url, $event->get_url());
    1412          $this->assertEventContextNotUsed($event);
    1413  
    1414          $this->assertNotEmpty($event->get_name());
    1415      }
    1416  
    1417      /**
    1418       *  Ensure post_deleted event validates that the postid is set.
    1419       */
    1420      public function test_post_deleted_postid_validation() {
    1421          $course = $this->getDataGenerator()->create_course();
    1422          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1423          $user = $this->getDataGenerator()->create_user();
    1424  
    1425          // Add a discussion.
    1426          $record = array();
    1427          $record['course'] = $course->id;
    1428          $record['forum'] = $forum->id;
    1429          $record['userid'] = $user->id;
    1430          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1431  
    1432          $params = array(
    1433              'context' => context_module::instance($forum->cmid),
    1434              'other' => array('forumid' => $forum->id, 'forumtype' => $forum->type, 'discussionid' => $discussion->id)
    1435          );
    1436  
    1437          \mod_forum\event\post_deleted::create($params);
    1438      }
    1439  
    1440      /**
    1441       * Ensure post_deleted event validates that the discussionid is set.
    1442       *
    1443       * @expectedException        coding_exception
    1444       * @expectedExceptionMessage The 'discussionid' value must be set in other.
    1445       */
    1446      public function test_post_deleted_discussionid_validation() {
    1447          $course = $this->getDataGenerator()->create_course();
    1448          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1449          $user = $this->getDataGenerator()->create_user();
    1450  
    1451          // Add a discussion.
    1452          $record = array();
    1453          $record['course'] = $course->id;
    1454          $record['forum'] = $forum->id;
    1455          $record['userid'] = $user->id;
    1456          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1457  
    1458          // Add a post.
    1459          $record = array();
    1460          $record['discussion'] = $discussion->id;
    1461          $record['userid'] = $user->id;
    1462          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    1463  
    1464          $params = array(
    1465              'context' => context_module::instance($forum->cmid),
    1466              'objectid' => $post->id,
    1467              'other' => array('forumid' => $forum->id, 'forumtype' => $forum->type)
    1468          );
    1469  
    1470          \mod_forum\event\post_deleted::create($params);
    1471      }
    1472  
    1473      /**
    1474       *  Ensure post_deleted event validates that the forumid is set.
    1475       *
    1476       * @expectedException        coding_exception
    1477       * @expectedExceptionMessage The 'forumid' value must be set in other.
    1478       */
    1479      public function test_post_deleted_forumid_validation() {
    1480          $course = $this->getDataGenerator()->create_course();
    1481          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1482          $user = $this->getDataGenerator()->create_user();
    1483  
    1484          // Add a discussion.
    1485          $record = array();
    1486          $record['course'] = $course->id;
    1487          $record['forum'] = $forum->id;
    1488          $record['userid'] = $user->id;
    1489          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1490  
    1491          // Add a post.
    1492          $record = array();
    1493          $record['discussion'] = $discussion->id;
    1494          $record['userid'] = $user->id;
    1495          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    1496  
    1497          $params = array(
    1498              'context' => context_module::instance($forum->cmid),
    1499              'objectid' => $post->id,
    1500              'other' => array('discussionid' => $discussion->id, 'forumtype' => $forum->type)
    1501          );
    1502  
    1503          \mod_forum\event\post_deleted::create($params);
    1504      }
    1505  
    1506      /**
    1507       * Ensure post_deleted event validates that the forumtype is set.
    1508       *
    1509       * @expectedException        coding_exception
    1510       * @expectedExceptionMessage The 'forumtype' value must be set in other.
    1511       */
    1512      public function test_post_deleted_forumtype_validation() {
    1513          $course = $this->getDataGenerator()->create_course();
    1514          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1515          $user = $this->getDataGenerator()->create_user();
    1516  
    1517          // Add a discussion.
    1518          $record = array();
    1519          $record['course'] = $course->id;
    1520          $record['forum'] = $forum->id;
    1521          $record['userid'] = $user->id;
    1522          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1523  
    1524          // Add a post.
    1525          $record = array();
    1526          $record['discussion'] = $discussion->id;
    1527          $record['userid'] = $user->id;
    1528          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    1529  
    1530          $params = array(
    1531              'context' => context_module::instance($forum->cmid),
    1532              'objectid' => $post->id,
    1533              'other' => array('discussionid' => $discussion->id, 'forumid' => $forum->id)
    1534          );
    1535  
    1536          \mod_forum\event\post_deleted::create($params);
    1537      }
    1538  
    1539      /**
    1540       *  Ensure post_deleted event validates that the contextlevel is correct.
    1541       *
    1542       * @expectedException        coding_exception
    1543       * @expectedExceptionMessage Context level must be CONTEXT_MODULE.
    1544       */
    1545      public function test_post_deleted_context_validation() {
    1546          $course = $this->getDataGenerator()->create_course();
    1547          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1548          $user = $this->getDataGenerator()->create_user();
    1549  
    1550          // Add a discussion.
    1551          $record = array();
    1552          $record['course'] = $course->id;
    1553          $record['forum'] = $forum->id;
    1554          $record['userid'] = $user->id;
    1555          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1556  
    1557          // Add a post.
    1558          $record = array();
    1559          $record['discussion'] = $discussion->id;
    1560          $record['userid'] = $user->id;
    1561          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    1562  
    1563          $params = array(
    1564              'context' => context_system::instance(),
    1565              'objectid' => $post->id,
    1566              'other' => array('discussionid' => $discussion->id, 'forumid' => $forum->id, 'forumtype' => $forum->type)
    1567          );
    1568  
    1569          \mod_forum\event\post_deleted::create($params);
    1570      }
    1571  
    1572      /**
    1573       * Test post_deleted event.
    1574       */
    1575      public function test_post_deleted() {
    1576          global $DB;
    1577  
    1578          // Setup test data.
    1579          $course = $this->getDataGenerator()->create_course();
    1580          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1581          $user = $this->getDataGenerator()->create_user();
    1582          $cm = get_coursemodule_from_instance('forum', $forum->id, $forum->course);
    1583  
    1584          // Add a discussion.
    1585          $record = array();
    1586          $record['course'] = $course->id;
    1587          $record['forum'] = $forum->id;
    1588          $record['userid'] = $user->id;
    1589          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1590  
    1591          // When creating a discussion we also create a post, so get the post.
    1592          $discussionpost = $DB->get_records('forum_posts');
    1593          // Will only be one here.
    1594          $discussionpost = reset($discussionpost);
    1595  
    1596          // Add a few posts.
    1597          $record = array();
    1598          $record['discussion'] = $discussion->id;
    1599          $record['userid'] = $user->id;
    1600          $posts = array();
    1601          $posts[$discussionpost->id] = $discussionpost;
    1602          for ($i = 0; $i < 3; $i++) {
    1603              $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    1604              $posts[$post->id] = $post;
    1605          }
    1606  
    1607          // Delete the last post and capture the event.
    1608          $lastpost = end($posts);
    1609          $sink = $this->redirectEvents();
    1610          forum_delete_post($lastpost, true, $course, $cm, $forum);
    1611          $events = $sink->get_events();
    1612          $this->assertCount(1, $events);
    1613          $event = reset($events);
    1614  
    1615          // Check that the events contain the expected values.
    1616          $this->assertInstanceOf('\mod_forum\event\post_deleted', $event);
    1617          $this->assertEquals(context_module::instance($forum->cmid), $event->get_context());
    1618          $expected = array($course->id, 'forum', 'delete post', "discuss.php?d={$discussion->id}", $lastpost->id, $forum->cmid);
    1619          $this->assertEventLegacyLogData($expected, $event);
    1620          $url = new \moodle_url('/mod/forum/discuss.php', array('d' => $discussion->id));
    1621          $this->assertEquals($url, $event->get_url());
    1622          $this->assertEventContextNotUsed($event);
    1623          $this->assertNotEmpty($event->get_name());
    1624  
    1625          // Delete the whole discussion and capture the events.
    1626          $sink = $this->redirectEvents();
    1627          forum_delete_discussion($discussion, true, $course, $cm, $forum);
    1628          $events = $sink->get_events();
    1629          // We will have 3 events. One for the discussion (creating a discussion creates a post), and two for the posts.
    1630          $this->assertCount(3, $events);
    1631  
    1632          // Loop through the events and check they are valid.
    1633          foreach ($events as $event) {
    1634              $post = $posts[$event->objectid];
    1635  
    1636              // Check that the event contains the expected values.
    1637              $this->assertInstanceOf('\mod_forum\event\post_deleted', $event);
    1638              $this->assertEquals(context_module::instance($forum->cmid), $event->get_context());
    1639              $expected = array($course->id, 'forum', 'delete post', "discuss.php?d={$discussion->id}", $post->id, $forum->cmid);
    1640              $this->assertEventLegacyLogData($expected, $event);
    1641              $url = new \moodle_url('/mod/forum/discuss.php', array('d' => $discussion->id));
    1642              $this->assertEquals($url, $event->get_url());
    1643              $this->assertEventContextNotUsed($event);
    1644              $this->assertNotEmpty($event->get_name());
    1645          }
    1646      }
    1647  
    1648      /**
    1649       * Test post_deleted event for a single discussion forum.
    1650       */
    1651      public function test_post_deleted_single() {
    1652          // Setup test data.
    1653          $course = $this->getDataGenerator()->create_course();
    1654          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id, 'type' => 'single'));
    1655          $user = $this->getDataGenerator()->create_user();
    1656  
    1657          // Add a discussion.
    1658          $record = array();
    1659          $record['course'] = $course->id;
    1660          $record['forum'] = $forum->id;
    1661          $record['userid'] = $user->id;
    1662          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1663  
    1664          // Add a post.
    1665          $record = array();
    1666          $record['discussion'] = $discussion->id;
    1667          $record['userid'] = $user->id;
    1668          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    1669  
    1670          $context = context_module::instance($forum->cmid);
    1671  
    1672          $params = array(
    1673              'context' => $context,
    1674              'objectid' => $post->id,
    1675              'other' => array('discussionid' => $discussion->id, 'forumid' => $forum->id, 'forumtype' => $forum->type)
    1676          );
    1677  
    1678          $event = \mod_forum\event\post_deleted::create($params);
    1679  
    1680          // Trigger and capture the event.
    1681          $sink = $this->redirectEvents();
    1682          $event->trigger();
    1683          $events = $sink->get_events();
    1684          $this->assertCount(1, $events);
    1685          $event = reset($events);
    1686  
    1687          // Checking that the event contains the expected values.
    1688          $this->assertInstanceOf('\mod_forum\event\post_deleted', $event);
    1689          $this->assertEquals($context, $event->get_context());
    1690          $expected = array($course->id, 'forum', 'delete post', "view.php?f={$forum->id}", $post->id, $forum->cmid);
    1691          $this->assertEventLegacyLogData($expected, $event);
    1692          $url = new \moodle_url('/mod/forum/view.php', array('f' => $forum->id));
    1693          $this->assertEquals($url, $event->get_url());
    1694          $this->assertEventContextNotUsed($event);
    1695  
    1696          $this->assertNotEmpty($event->get_name());
    1697      }
    1698  
    1699      /**
    1700       * Ensure post_updated event validates that the discussionid is set.
    1701       *
    1702       * @expectedException        coding_exception
    1703       * @expectedExceptionMessage The 'discussionid' value must be set in other.
    1704       */
    1705      public function test_post_updated_discussionid_validation() {
    1706          $course = $this->getDataGenerator()->create_course();
    1707          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1708          $user = $this->getDataGenerator()->create_user();
    1709  
    1710          // Add a discussion.
    1711          $record = array();
    1712          $record['course'] = $course->id;
    1713          $record['forum'] = $forum->id;
    1714          $record['userid'] = $user->id;
    1715          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1716  
    1717          // Add a post.
    1718          $record = array();
    1719          $record['discussion'] = $discussion->id;
    1720          $record['userid'] = $user->id;
    1721          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    1722  
    1723          $params = array(
    1724              'context' => context_module::instance($forum->cmid),
    1725              'objectid' => $post->id,
    1726              'other' => array('forumid' => $forum->id, 'forumtype' => $forum->type)
    1727          );
    1728  
    1729          \mod_forum\event\post_updated::create($params);
    1730      }
    1731  
    1732      /**
    1733       * Ensure post_updated event validates that the forumid is set.
    1734       *
    1735       * @expectedException        coding_exception
    1736       * @expectedExceptionMessage The 'forumid' value must be set in other.
    1737       */
    1738      public function test_post_updated_forumid_validation() {
    1739          $course = $this->getDataGenerator()->create_course();
    1740          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1741          $user = $this->getDataGenerator()->create_user();
    1742  
    1743          // Add a discussion.
    1744          $record = array();
    1745          $record['course'] = $course->id;
    1746          $record['forum'] = $forum->id;
    1747          $record['userid'] = $user->id;
    1748          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1749  
    1750          // Add a post.
    1751          $record = array();
    1752          $record['discussion'] = $discussion->id;
    1753          $record['userid'] = $user->id;
    1754          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    1755  
    1756          $params = array(
    1757              'context' => context_module::instance($forum->cmid),
    1758              'objectid' => $post->id,
    1759              'other' => array('discussionid' => $discussion->id, 'forumtype' => $forum->type)
    1760          );
    1761  
    1762          \mod_forum\event\post_updated::create($params);
    1763      }
    1764  
    1765      /**
    1766       * Ensure post_updated event validates that the forumtype is set.
    1767       *
    1768       * @expectedException        coding_exception
    1769       * @expectedExceptionMessage The 'forumtype' value must be set in other.
    1770       */
    1771      public function test_post_updated_forumtype_validation() {
    1772          $course = $this->getDataGenerator()->create_course();
    1773          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1774          $user = $this->getDataGenerator()->create_user();
    1775  
    1776          // Add a discussion.
    1777          $record = array();
    1778          $record['course'] = $course->id;
    1779          $record['forum'] = $forum->id;
    1780          $record['userid'] = $user->id;
    1781          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1782  
    1783          // Add a post.
    1784          $record = array();
    1785          $record['discussion'] = $discussion->id;
    1786          $record['userid'] = $user->id;
    1787          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    1788  
    1789          $params = array(
    1790              'context' => context_module::instance($forum->cmid),
    1791              'objectid' => $post->id,
    1792              'other' => array('discussionid' => $discussion->id, 'forumid' => $forum->id)
    1793          );
    1794  
    1795          \mod_forum\event\post_updated::create($params);
    1796      }
    1797  
    1798      /**
    1799       *  Ensure post_updated event validates that the contextlevel is correct.
    1800       *
    1801       * @expectedException        coding_exception
    1802       * @expectedExceptionMessage Context level must be CONTEXT_MODULE.
    1803       */
    1804      public function test_post_updated_context_validation() {
    1805          $course = $this->getDataGenerator()->create_course();
    1806          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1807          $user = $this->getDataGenerator()->create_user();
    1808  
    1809          // Add a discussion.
    1810          $record = array();
    1811          $record['course'] = $course->id;
    1812          $record['forum'] = $forum->id;
    1813          $record['userid'] = $user->id;
    1814          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1815  
    1816          // Add a post.
    1817          $record = array();
    1818          $record['discussion'] = $discussion->id;
    1819          $record['userid'] = $user->id;
    1820          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    1821  
    1822          $params = array(
    1823              'context' => context_system::instance(),
    1824              'objectid' => $post->id,
    1825              'other' => array('discussionid' => $discussion->id, 'forumid' => $forum->id, 'forumtype' => $forum->type)
    1826          );
    1827  
    1828          \mod_forum\event\post_updated::create($params);
    1829      }
    1830  
    1831      /**
    1832       * Test post_updated event.
    1833       */
    1834      public function test_post_updated() {
    1835          // Setup test data.
    1836          $course = $this->getDataGenerator()->create_course();
    1837          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id));
    1838          $user = $this->getDataGenerator()->create_user();
    1839  
    1840          // Add a discussion.
    1841          $record = array();
    1842          $record['course'] = $course->id;
    1843          $record['forum'] = $forum->id;
    1844          $record['userid'] = $user->id;
    1845          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1846  
    1847          // Add a post.
    1848          $record = array();
    1849          $record['discussion'] = $discussion->id;
    1850          $record['userid'] = $user->id;
    1851          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    1852  
    1853          $context = context_module::instance($forum->cmid);
    1854  
    1855          $params = array(
    1856              'context' => $context,
    1857              'objectid' => $post->id,
    1858              'other' => array('discussionid' => $discussion->id, 'forumid' => $forum->id, 'forumtype' => $forum->type)
    1859          );
    1860  
    1861          $event = \mod_forum\event\post_updated::create($params);
    1862  
    1863          // Trigger and capturing the event.
    1864          $sink = $this->redirectEvents();
    1865          $event->trigger();
    1866          $events = $sink->get_events();
    1867          $this->assertCount(1, $events);
    1868          $event = reset($events);
    1869  
    1870          // Checking that the event contains the expected values.
    1871          $this->assertInstanceOf('\mod_forum\event\post_updated', $event);
    1872          $this->assertEquals($context, $event->get_context());
    1873          $expected = array($course->id, 'forum', 'update post', "discuss.php?d={$discussion->id}#p{$post->id}",
    1874              $post->id, $forum->cmid);
    1875          $this->assertEventLegacyLogData($expected, $event);
    1876          $url = new \moodle_url('/mod/forum/discuss.php', array('d' => $discussion->id));
    1877          $url->set_anchor('p'.$event->objectid);
    1878          $this->assertEquals($url, $event->get_url());
    1879          $this->assertEventContextNotUsed($event);
    1880  
    1881          $this->assertNotEmpty($event->get_name());
    1882      }
    1883  
    1884      /**
    1885       * Test post_updated event.
    1886       */
    1887      public function test_post_updated_single() {
    1888          // Setup test data.
    1889          $course = $this->getDataGenerator()->create_course();
    1890          $forum = $this->getDataGenerator()->create_module('forum', array('course' => $course->id, 'type' => 'single'));
    1891          $user = $this->getDataGenerator()->create_user();
    1892  
    1893          // Add a discussion.
    1894          $record = array();
    1895          $record['course'] = $course->id;
    1896          $record['forum'] = $forum->id;
    1897          $record['userid'] = $user->id;
    1898          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1899  
    1900          // Add a post.
    1901          $record = array();
    1902          $record['discussion'] = $discussion->id;
    1903          $record['userid'] = $user->id;
    1904          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    1905  
    1906          $context = context_module::instance($forum->cmid);
    1907  
    1908          $params = array(
    1909              'context' => $context,
    1910              'objectid' => $post->id,
    1911              'other' => array('discussionid' => $discussion->id, 'forumid' => $forum->id, 'forumtype' => $forum->type)
    1912          );
    1913  
    1914          $event = \mod_forum\event\post_updated::create($params);
    1915  
    1916          // Trigger and capturing the event.
    1917          $sink = $this->redirectEvents();
    1918          $event->trigger();
    1919          $events = $sink->get_events();
    1920          $this->assertCount(1, $events);
    1921          $event = reset($events);
    1922  
    1923          // Checking that the event contains the expected values.
    1924          $this->assertInstanceOf('\mod_forum\event\post_updated', $event);
    1925          $this->assertEquals($context, $event->get_context());
    1926          $expected = array($course->id, 'forum', 'update post', "view.php?f={$forum->id}#p{$post->id}",
    1927              $post->id, $forum->cmid);
    1928          $this->assertEventLegacyLogData($expected, $event);
    1929          $url = new \moodle_url('/mod/forum/view.php', array('f' => $forum->id));
    1930          $url->set_anchor('p'.$post->id);
    1931          $this->assertEquals($url, $event->get_url());
    1932          $this->assertEventContextNotUsed($event);
    1933  
    1934          $this->assertNotEmpty($event->get_name());
    1935      }
    1936  
    1937      /**
    1938       * Test discussion_subscription_created event.
    1939       */
    1940      public function test_discussion_subscription_created() {
    1941          global $CFG;
    1942          require_once($CFG->dirroot . '/mod/forum/lib.php');
    1943  
    1944          // Setup test data.
    1945          $course = $this->getDataGenerator()->create_course();
    1946          $user = $this->getDataGenerator()->create_user();
    1947          $this->getDataGenerator()->enrol_user($user->id, $course->id);
    1948  
    1949          $options = array('course' => $course->id, 'forcesubscribe' => FORUM_CHOOSESUBSCRIBE);
    1950          $forum = $this->getDataGenerator()->create_module('forum', $options);
    1951  
    1952          // Add a discussion.
    1953          $record = array();
    1954          $record['course'] = $course->id;
    1955          $record['forum'] = $forum->id;
    1956          $record['userid'] = $user->id;
    1957          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    1958  
    1959          // Add a post.
    1960          $record = array();
    1961          $record['discussion'] = $discussion->id;
    1962          $record['userid'] = $user->id;
    1963          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    1964  
    1965          // Trigger and capturing the event.
    1966          $sink = $this->redirectEvents();
    1967  
    1968          // Trigger the event by subscribing the user to the forum discussion.
    1969          \mod_forum\subscriptions::subscribe_user_to_discussion($user->id, $discussion);
    1970  
    1971          $events = $sink->get_events();
    1972          $this->assertCount(1, $events);
    1973          $event = reset($events);
    1974  
    1975          // Checking that the event contains the expected values.
    1976          $this->assertInstanceOf('\mod_forum\event\discussion_subscription_created', $event);
    1977  
    1978  
    1979          $cm = get_coursemodule_from_instance('forum', $discussion->forum);
    1980          $context = \context_module::instance($cm->id);
    1981          $this->assertEquals($context, $event->get_context());
    1982  
    1983          $url = new \moodle_url('/mod/forum/subscribe.php', array(
    1984              'id' => $forum->id,
    1985              'd' => $discussion->id
    1986          ));
    1987  
    1988          $this->assertEquals($url, $event->get_url());
    1989          $this->assertEventContextNotUsed($event);
    1990          $this->assertNotEmpty($event->get_name());
    1991      }
    1992  
    1993      /**
    1994       * Test validation of discussion_subscription_created event.
    1995       */
    1996      public function test_discussion_subscription_created_validation() {
    1997          global $CFG, $DB;
    1998          require_once($CFG->dirroot . '/mod/forum/lib.php');
    1999  
    2000          // Setup test data.
    2001          $course = $this->getDataGenerator()->create_course();
    2002          $user = $this->getDataGenerator()->create_user();
    2003          $this->getDataGenerator()->enrol_user($user->id, $course->id);
    2004  
    2005          $options = array('course' => $course->id, 'forcesubscribe' => FORUM_CHOOSESUBSCRIBE);
    2006          $forum = $this->getDataGenerator()->create_module('forum', $options);
    2007  
    2008          // Add a discussion.
    2009          $record = array();
    2010          $record['course'] = $course->id;
    2011          $record['forum'] = $forum->id;
    2012          $record['userid'] = $user->id;
    2013          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    2014  
    2015          // Add a post.
    2016          $record = array();
    2017          $record['discussion'] = $discussion->id;
    2018          $record['userid'] = $user->id;
    2019          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    2020  
    2021          // The user is not subscribed to the forum. Insert a new discussion subscription.
    2022          $subscription = new \stdClass();
    2023          $subscription->userid  = $user->id;
    2024          $subscription->forum = $forum->id;
    2025          $subscription->discussion = $discussion->id;
    2026          $subscription->preference = time();
    2027  
    2028          $subscription->id = $DB->insert_record('forum_discussion_subs', $subscription);
    2029  
    2030          $context = context_module::instance($forum->cmid);
    2031  
    2032          $params = array(
    2033              'context' => $context,
    2034              'objectid' => $subscription->id,
    2035              'relateduserid' => $user->id,
    2036              'other' => array(
    2037                  'forumid' => $forum->id,
    2038                  'discussion' => $discussion->id,
    2039              )
    2040          );
    2041  
    2042          $event = \mod_forum\event\discussion_subscription_created::create($params);
    2043  
    2044          // Trigger and capturing the event.
    2045          $sink = $this->redirectEvents();
    2046          $event->trigger();
    2047          $events = $sink->get_events();
    2048          $this->assertCount(1, $events);
    2049          $event = reset($events);
    2050      }
    2051  
    2052      /**
    2053       * Test contextlevel validation of discussion_subscription_created event.
    2054       *
    2055       * @expectedException        coding_exception
    2056       * @expectedExceptionMessage Context level must be CONTEXT_MODULE.
    2057       */
    2058      public function test_discussion_subscription_created_validation_contextlevel() {
    2059          global $CFG, $DB;
    2060          require_once($CFG->dirroot . '/mod/forum/lib.php');
    2061  
    2062          // Setup test data.
    2063          $course = $this->getDataGenerator()->create_course();
    2064          $user = $this->getDataGenerator()->create_user();
    2065          $this->getDataGenerator()->enrol_user($user->id, $course->id);
    2066  
    2067          $options = array('course' => $course->id, 'forcesubscribe' => FORUM_CHOOSESUBSCRIBE);
    2068          $forum = $this->getDataGenerator()->create_module('forum', $options);
    2069  
    2070          // Add a discussion.
    2071          $record = array();
    2072          $record['course'] = $course->id;
    2073          $record['forum'] = $forum->id;
    2074          $record['userid'] = $user->id;
    2075          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    2076  
    2077          // Add a post.
    2078          $record = array();
    2079          $record['discussion'] = $discussion->id;
    2080          $record['userid'] = $user->id;
    2081          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    2082  
    2083          // The user is not subscribed to the forum. Insert a new discussion subscription.
    2084          $subscription = new \stdClass();
    2085          $subscription->userid  = $user->id;
    2086          $subscription->forum = $forum->id;
    2087          $subscription->discussion = $discussion->id;
    2088          $subscription->preference = time();
    2089  
    2090          $subscription->id = $DB->insert_record('forum_discussion_subs', $subscription);
    2091  
    2092          $context = context_module::instance($forum->cmid);
    2093  
    2094          $params = array(
    2095              'context' => \context_course::instance($course->id),
    2096              'objectid' => $subscription->id,
    2097              'relateduserid' => $user->id,
    2098              'other' => array(
    2099                  'forumid' => $forum->id,
    2100                  'discussion' => $discussion->id,
    2101              )
    2102          );
    2103  
    2104          // Without an invalid context.
    2105          \mod_forum\event\discussion_subscription_created::create($params);
    2106      }
    2107  
    2108      /**
    2109       * Test discussion validation of discussion_subscription_created event.
    2110       *
    2111       * @expectedException        coding_exception
    2112       * @expectedExceptionMessage The 'discussion' value must be set in other.
    2113       */
    2114      public function test_discussion_subscription_created_validation_discussion() {
    2115          global $CFG, $DB;
    2116          require_once($CFG->dirroot . '/mod/forum/lib.php');
    2117  
    2118          // Setup test data.
    2119          $course = $this->getDataGenerator()->create_course();
    2120          $user = $this->getDataGenerator()->create_user();
    2121          $this->getDataGenerator()->enrol_user($user->id, $course->id);
    2122  
    2123          $options = array('course' => $course->id, 'forcesubscribe' => FORUM_CHOOSESUBSCRIBE);
    2124          $forum = $this->getDataGenerator()->create_module('forum', $options);
    2125  
    2126          // Add a discussion.
    2127          $record = array();
    2128          $record['course'] = $course->id;
    2129          $record['forum'] = $forum->id;
    2130          $record['userid'] = $user->id;
    2131          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    2132  
    2133          // Add a post.
    2134          $record = array();
    2135          $record['discussion'] = $discussion->id;
    2136          $record['userid'] = $user->id;
    2137          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    2138  
    2139          // The user is not subscribed to the forum. Insert a new discussion subscription.
    2140          $subscription = new \stdClass();
    2141          $subscription->userid  = $user->id;
    2142          $subscription->forum = $forum->id;
    2143          $subscription->discussion = $discussion->id;
    2144          $subscription->preference = time();
    2145  
    2146          $subscription->id = $DB->insert_record('forum_discussion_subs', $subscription);
    2147  
    2148          // Without the discussion.
    2149          $params = array(
    2150              'context' => context_module::instance($forum->cmid),
    2151              'objectid' => $subscription->id,
    2152              'relateduserid' => $user->id,
    2153              'other' => array(
    2154                  'forumid' => $forum->id,
    2155              )
    2156          );
    2157  
    2158          \mod_forum\event\discussion_subscription_created::create($params);
    2159      }
    2160  
    2161      /**
    2162       * Test forumid validation of discussion_subscription_created event.
    2163       *
    2164       * @expectedException        coding_exception
    2165       * @expectedExceptionMessage The 'forumid' value must be set in other.
    2166       */
    2167      public function test_discussion_subscription_created_validation_forumid() {
    2168          global $CFG, $DB;
    2169          require_once($CFG->dirroot . '/mod/forum/lib.php');
    2170  
    2171          // Setup test data.
    2172          $course = $this->getDataGenerator()->create_course();
    2173          $user = $this->getDataGenerator()->create_user();
    2174          $this->getDataGenerator()->enrol_user($user->id, $course->id);
    2175  
    2176          $options = array('course' => $course->id, 'forcesubscribe' => FORUM_CHOOSESUBSCRIBE);
    2177          $forum = $this->getDataGenerator()->create_module('forum', $options);
    2178  
    2179          // Add a discussion.
    2180          $record = array();
    2181          $record['course'] = $course->id;
    2182          $record['forum'] = $forum->id;
    2183          $record['userid'] = $user->id;
    2184          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    2185  
    2186          // Add a post.
    2187          $record = array();
    2188          $record['discussion'] = $discussion->id;
    2189          $record['userid'] = $user->id;
    2190          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    2191  
    2192          // The user is not subscribed to the forum. Insert a new discussion subscription.
    2193          $subscription = new \stdClass();
    2194          $subscription->userid  = $user->id;
    2195          $subscription->forum = $forum->id;
    2196          $subscription->discussion = $discussion->id;
    2197          $subscription->preference = time();
    2198  
    2199          $subscription->id = $DB->insert_record('forum_discussion_subs', $subscription);
    2200  
    2201          // Without the forumid.
    2202          $params = array(
    2203              'context' => context_module::instance($forum->cmid),
    2204              'objectid' => $subscription->id,
    2205              'relateduserid' => $user->id,
    2206              'other' => array(
    2207                  'discussion' => $discussion->id,
    2208              )
    2209          );
    2210  
    2211          \mod_forum\event\discussion_subscription_created::create($params);
    2212      }
    2213  
    2214      /**
    2215       * Test relateduserid validation of discussion_subscription_created event.
    2216       *
    2217       * @expectedException        coding_exception
    2218       * @expectedExceptionMessage The 'relateduserid' must be set.
    2219       */
    2220      public function test_discussion_subscription_created_validation_relateduserid() {
    2221          global $CFG, $DB;
    2222          require_once($CFG->dirroot . '/mod/forum/lib.php');
    2223  
    2224          // Setup test data.
    2225          $course = $this->getDataGenerator()->create_course();
    2226          $user = $this->getDataGenerator()->create_user();
    2227          $this->getDataGenerator()->enrol_user($user->id, $course->id);
    2228  
    2229          $options = array('course' => $course->id, 'forcesubscribe' => FORUM_CHOOSESUBSCRIBE);
    2230          $forum = $this->getDataGenerator()->create_module('forum', $options);
    2231  
    2232          // Add a discussion.
    2233          $record = array();
    2234          $record['course'] = $course->id;
    2235          $record['forum'] = $forum->id;
    2236          $record['userid'] = $user->id;
    2237          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    2238  
    2239          // Add a post.
    2240          $record = array();
    2241          $record['discussion'] = $discussion->id;
    2242          $record['userid'] = $user->id;
    2243          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    2244  
    2245          // The user is not subscribed to the forum. Insert a new discussion subscription.
    2246          $subscription = new \stdClass();
    2247          $subscription->userid  = $user->id;
    2248          $subscription->forum = $forum->id;
    2249          $subscription->discussion = $discussion->id;
    2250          $subscription->preference = time();
    2251  
    2252          $subscription->id = $DB->insert_record('forum_discussion_subs', $subscription);
    2253  
    2254          $context = context_module::instance($forum->cmid);
    2255  
    2256          // Without the relateduserid.
    2257          $params = array(
    2258              'context' => context_module::instance($forum->cmid),
    2259              'objectid' => $subscription->id,
    2260              'other' => array(
    2261                  'forumid' => $forum->id,
    2262                  'discussion' => $discussion->id,
    2263              )
    2264          );
    2265  
    2266          \mod_forum\event\discussion_subscription_created::create($params);
    2267      }
    2268  
    2269      /**
    2270       * Test discussion_subscription_deleted event.
    2271       */
    2272      public function test_discussion_subscription_deleted() {
    2273          global $CFG;
    2274          require_once($CFG->dirroot . '/mod/forum/lib.php');
    2275  
    2276          // Setup test data.
    2277          $course = $this->getDataGenerator()->create_course();
    2278          $user = $this->getDataGenerator()->create_user();
    2279          $this->getDataGenerator()->enrol_user($user->id, $course->id);
    2280  
    2281          $options = array('course' => $course->id, 'forcesubscribe' => FORUM_INITIALSUBSCRIBE);
    2282          $forum = $this->getDataGenerator()->create_module('forum', $options);
    2283  
    2284          // Add a discussion.
    2285          $record = array();
    2286          $record['course'] = $course->id;
    2287          $record['forum'] = $forum->id;
    2288          $record['userid'] = $user->id;
    2289          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    2290  
    2291          // Add a post.
    2292          $record = array();
    2293          $record['discussion'] = $discussion->id;
    2294          $record['userid'] = $user->id;
    2295          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    2296  
    2297          // Trigger and capturing the event.
    2298          $sink = $this->redirectEvents();
    2299  
    2300          // Trigger the event by unsubscribing the user to the forum discussion.
    2301          \mod_forum\subscriptions::unsubscribe_user_from_discussion($user->id, $discussion);
    2302  
    2303          $events = $sink->get_events();
    2304          $this->assertCount(1, $events);
    2305          $event = reset($events);
    2306  
    2307          // Checking that the event contains the expected values.
    2308          $this->assertInstanceOf('\mod_forum\event\discussion_subscription_deleted', $event);
    2309  
    2310  
    2311          $cm = get_coursemodule_from_instance('forum', $discussion->forum);
    2312          $context = \context_module::instance($cm->id);
    2313          $this->assertEquals($context, $event->get_context());
    2314  
    2315          $url = new \moodle_url('/mod/forum/subscribe.php', array(
    2316              'id' => $forum->id,
    2317              'd' => $discussion->id
    2318          ));
    2319  
    2320          $this->assertEquals($url, $event->get_url());
    2321          $this->assertEventContextNotUsed($event);
    2322          $this->assertNotEmpty($event->get_name());
    2323      }
    2324  
    2325      /**
    2326       * Test validation of discussion_subscription_deleted event.
    2327       */
    2328      public function test_discussion_subscription_deleted_validation() {
    2329          global $CFG, $DB;
    2330          require_once($CFG->dirroot . '/mod/forum/lib.php');
    2331  
    2332          // Setup test data.
    2333          $course = $this->getDataGenerator()->create_course();
    2334          $user = $this->getDataGenerator()->create_user();
    2335          $this->getDataGenerator()->enrol_user($user->id, $course->id);
    2336  
    2337          $options = array('course' => $course->id, 'forcesubscribe' => FORUM_INITIALSUBSCRIBE);
    2338          $forum = $this->getDataGenerator()->create_module('forum', $options);
    2339  
    2340          // Add a discussion.
    2341          $record = array();
    2342          $record['course'] = $course->id;
    2343          $record['forum'] = $forum->id;
    2344          $record['userid'] = $user->id;
    2345          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    2346  
    2347          // Add a post.
    2348          $record = array();
    2349          $record['discussion'] = $discussion->id;
    2350          $record['userid'] = $user->id;
    2351          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    2352  
    2353          // The user is not subscribed to the forum. Insert a new discussion subscription.
    2354          $subscription = new \stdClass();
    2355          $subscription->userid  = $user->id;
    2356          $subscription->forum = $forum->id;
    2357          $subscription->discussion = $discussion->id;
    2358          $subscription->preference = \mod_forum\subscriptions::FORUM_DISCUSSION_UNSUBSCRIBED;
    2359  
    2360          $subscription->id = $DB->insert_record('forum_discussion_subs', $subscription);
    2361  
    2362          $context = context_module::instance($forum->cmid);
    2363  
    2364          $params = array(
    2365              'context' => $context,
    2366              'objectid' => $subscription->id,
    2367              'relateduserid' => $user->id,
    2368              'other' => array(
    2369                  'forumid' => $forum->id,
    2370                  'discussion' => $discussion->id,
    2371              )
    2372          );
    2373  
    2374          $event = \mod_forum\event\discussion_subscription_deleted::create($params);
    2375  
    2376          // Trigger and capturing the event.
    2377          $sink = $this->redirectEvents();
    2378          $event->trigger();
    2379          $events = $sink->get_events();
    2380          $this->assertCount(1, $events);
    2381          $event = reset($events);
    2382  
    2383          // Without an invalid context.
    2384          $params['context'] = \context_course::instance($course->id);
    2385          $this->expectException('coding_exception');
    2386          $this->expectExceptionMessage('Context level must be CONTEXT_MODULE.');
    2387          \mod_forum\event\discussion_deleted::create($params);
    2388  
    2389          // Without the discussion.
    2390          unset($params['discussion']);
    2391          $this->expectException('coding_exception');
    2392          $this->expectExceptionMessage('The \'discussion\' value must be set in other.');
    2393          \mod_forum\event\discussion_deleted::create($params);
    2394  
    2395          // Without the forumid.
    2396          unset($params['forumid']);
    2397          $this->expectException('coding_exception');
    2398          $this->expectExceptionMessage('The \'forumid\' value must be set in other.');
    2399          \mod_forum\event\discussion_deleted::create($params);
    2400  
    2401          // Without the relateduserid.
    2402          unset($params['relateduserid']);
    2403          $this->expectException('coding_exception');
    2404          $this->expectExceptionMessage('The \'relateduserid\' value must be set in other.');
    2405          \mod_forum\event\discussion_deleted::create($params);
    2406      }
    2407  
    2408      /**
    2409       * Test contextlevel validation of discussion_subscription_deleted event.
    2410       *
    2411       * @expectedException        coding_exception
    2412       * @expectedExceptionMessage Context level must be CONTEXT_MODULE.
    2413       */
    2414      public function test_discussion_subscription_deleted_validation_contextlevel() {
    2415          global $CFG, $DB;
    2416          require_once($CFG->dirroot . '/mod/forum/lib.php');
    2417  
    2418          // Setup test data.
    2419          $course = $this->getDataGenerator()->create_course();
    2420          $user = $this->getDataGenerator()->create_user();
    2421          $this->getDataGenerator()->enrol_user($user->id, $course->id);
    2422  
    2423          $options = array('course' => $course->id, 'forcesubscribe' => FORUM_CHOOSESUBSCRIBE);
    2424          $forum = $this->getDataGenerator()->create_module('forum', $options);
    2425  
    2426          // Add a discussion.
    2427          $record = array();
    2428          $record['course'] = $course->id;
    2429          $record['forum'] = $forum->id;
    2430          $record['userid'] = $user->id;
    2431          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    2432  
    2433          // Add a post.
    2434          $record = array();
    2435          $record['discussion'] = $discussion->id;
    2436          $record['userid'] = $user->id;
    2437          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    2438  
    2439          // The user is not subscribed to the forum. Insert a new discussion subscription.
    2440          $subscription = new \stdClass();
    2441          $subscription->userid  = $user->id;
    2442          $subscription->forum = $forum->id;
    2443          $subscription->discussion = $discussion->id;
    2444          $subscription->preference = time();
    2445  
    2446          $subscription->id = $DB->insert_record('forum_discussion_subs', $subscription);
    2447  
    2448          $context = context_module::instance($forum->cmid);
    2449  
    2450          $params = array(
    2451              'context' => \context_course::instance($course->id),
    2452              'objectid' => $subscription->id,
    2453              'relateduserid' => $user->id,
    2454              'other' => array(
    2455                  'forumid' => $forum->id,
    2456                  'discussion' => $discussion->id,
    2457              )
    2458          );
    2459  
    2460          // Without an invalid context.
    2461          \mod_forum\event\discussion_subscription_deleted::create($params);
    2462      }
    2463  
    2464      /**
    2465       * Test discussion validation of discussion_subscription_deleted event.
    2466       *
    2467       * @expectedException        coding_exception
    2468       * @expectedExceptionMessage The 'discussion' value must be set in other.
    2469       */
    2470      public function test_discussion_subscription_deleted_validation_discussion() {
    2471          global $CFG, $DB;
    2472          require_once($CFG->dirroot . '/mod/forum/lib.php');
    2473  
    2474          // Setup test data.
    2475          $course = $this->getDataGenerator()->create_course();
    2476          $user = $this->getDataGenerator()->create_user();
    2477          $this->getDataGenerator()->enrol_user($user->id, $course->id);
    2478  
    2479          $options = array('course' => $course->id, 'forcesubscribe' => FORUM_CHOOSESUBSCRIBE);
    2480          $forum = $this->getDataGenerator()->create_module('forum', $options);
    2481  
    2482          // Add a discussion.
    2483          $record = array();
    2484          $record['course'] = $course->id;
    2485          $record['forum'] = $forum->id;
    2486          $record['userid'] = $user->id;
    2487          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    2488  
    2489          // Add a post.
    2490          $record = array();
    2491          $record['discussion'] = $discussion->id;
    2492          $record['userid'] = $user->id;
    2493          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    2494  
    2495          // The user is not subscribed to the forum. Insert a new discussion subscription.
    2496          $subscription = new \stdClass();
    2497          $subscription->userid  = $user->id;
    2498          $subscription->forum = $forum->id;
    2499          $subscription->discussion = $discussion->id;
    2500          $subscription->preference = time();
    2501  
    2502          $subscription->id = $DB->insert_record('forum_discussion_subs', $subscription);
    2503  
    2504          // Without the discussion.
    2505          $params = array(
    2506              'context' => context_module::instance($forum->cmid),
    2507              'objectid' => $subscription->id,
    2508              'relateduserid' => $user->id,
    2509              'other' => array(
    2510                  'forumid' => $forum->id,
    2511              )
    2512          );
    2513  
    2514          \mod_forum\event\discussion_subscription_deleted::create($params);
    2515      }
    2516  
    2517      /**
    2518       * Test forumid validation of discussion_subscription_deleted event.
    2519       *
    2520       * @expectedException        coding_exception
    2521       * @expectedExceptionMessage The 'forumid' value must be set in other.
    2522       */
    2523      public function test_discussion_subscription_deleted_validation_forumid() {
    2524          global $CFG, $DB;
    2525          require_once($CFG->dirroot . '/mod/forum/lib.php');
    2526  
    2527          // Setup test data.
    2528          $course = $this->getDataGenerator()->create_course();
    2529          $user = $this->getDataGenerator()->create_user();
    2530          $this->getDataGenerator()->enrol_user($user->id, $course->id);
    2531  
    2532          $options = array('course' => $course->id, 'forcesubscribe' => FORUM_CHOOSESUBSCRIBE);
    2533          $forum = $this->getDataGenerator()->create_module('forum', $options);
    2534  
    2535          // Add a discussion.
    2536          $record = array();
    2537          $record['course'] = $course->id;
    2538          $record['forum'] = $forum->id;
    2539          $record['userid'] = $user->id;
    2540          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    2541  
    2542          // Add a post.
    2543          $record = array();
    2544          $record['discussion'] = $discussion->id;
    2545          $record['userid'] = $user->id;
    2546          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    2547  
    2548          // The user is not subscribed to the forum. Insert a new discussion subscription.
    2549          $subscription = new \stdClass();
    2550          $subscription->userid  = $user->id;
    2551          $subscription->forum = $forum->id;
    2552          $subscription->discussion = $discussion->id;
    2553          $subscription->preference = time();
    2554  
    2555          $subscription->id = $DB->insert_record('forum_discussion_subs', $subscription);
    2556  
    2557          // Without the forumid.
    2558          $params = array(
    2559              'context' => context_module::instance($forum->cmid),
    2560              'objectid' => $subscription->id,
    2561              'relateduserid' => $user->id,
    2562              'other' => array(
    2563                  'discussion' => $discussion->id,
    2564              )
    2565          );
    2566  
    2567          \mod_forum\event\discussion_subscription_deleted::create($params);
    2568      }
    2569  
    2570      /**
    2571       * Test relateduserid validation of discussion_subscription_deleted event.
    2572       *
    2573       * @expectedException        coding_exception
    2574       * @expectedExceptionMessage The 'relateduserid' must be set.
    2575       */
    2576      public function test_discussion_subscription_deleted_validation_relateduserid() {
    2577          global $CFG, $DB;
    2578          require_once($CFG->dirroot . '/mod/forum/lib.php');
    2579  
    2580          // Setup test data.
    2581          $course = $this->getDataGenerator()->create_course();
    2582          $user = $this->getDataGenerator()->create_user();
    2583          $this->getDataGenerator()->enrol_user($user->id, $course->id);
    2584  
    2585          $options = array('course' => $course->id, 'forcesubscribe' => FORUM_CHOOSESUBSCRIBE);
    2586          $forum = $this->getDataGenerator()->create_module('forum', $options);
    2587  
    2588          // Add a discussion.
    2589          $record = array();
    2590          $record['course'] = $course->id;
    2591          $record['forum'] = $forum->id;
    2592          $record['userid'] = $user->id;
    2593          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    2594  
    2595          // Add a post.
    2596          $record = array();
    2597          $record['discussion'] = $discussion->id;
    2598          $record['userid'] = $user->id;
    2599          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    2600  
    2601          // The user is not subscribed to the forum. Insert a new discussion subscription.
    2602          $subscription = new \stdClass();
    2603          $subscription->userid  = $user->id;
    2604          $subscription->forum = $forum->id;
    2605          $subscription->discussion = $discussion->id;
    2606          $subscription->preference = time();
    2607  
    2608          $subscription->id = $DB->insert_record('forum_discussion_subs', $subscription);
    2609  
    2610          $context = context_module::instance($forum->cmid);
    2611  
    2612          // Without the relateduserid.
    2613          $params = array(
    2614              'context' => context_module::instance($forum->cmid),
    2615              'objectid' => $subscription->id,
    2616              'other' => array(
    2617                  'forumid' => $forum->id,
    2618                  'discussion' => $discussion->id,
    2619              )
    2620          );
    2621  
    2622          \mod_forum\event\discussion_subscription_deleted::create($params);
    2623      }
    2624  
    2625      /**
    2626       * Test that the correct context is used in the events when subscribing
    2627       * users.
    2628       */
    2629      public function test_forum_subscription_page_context_valid() {
    2630          global $CFG, $PAGE;
    2631          require_once($CFG->dirroot . '/mod/forum/lib.php');
    2632  
    2633          // Setup test data.
    2634          $course = $this->getDataGenerator()->create_course();
    2635          $user = $this->getDataGenerator()->create_user();
    2636          $this->getDataGenerator()->enrol_user($user->id, $course->id);
    2637  
    2638          $options = array('course' => $course->id, 'forcesubscribe' => FORUM_CHOOSESUBSCRIBE);
    2639          $forum = $this->getDataGenerator()->create_module('forum', $options);
    2640          $quiz = $this->getDataGenerator()->create_module('quiz', $options);
    2641  
    2642          // Add a discussion.
    2643          $record = array();
    2644          $record['course'] = $course->id;
    2645          $record['forum'] = $forum->id;
    2646          $record['userid'] = $user->id;
    2647          $discussion = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_discussion($record);
    2648  
    2649          // Add a post.
    2650          $record = array();
    2651          $record['discussion'] = $discussion->id;
    2652          $record['userid'] = $user->id;
    2653          $post = $this->getDataGenerator()->get_plugin_generator('mod_forum')->create_post($record);
    2654  
    2655          // Set up the default page event to use this forum.
    2656          $PAGE = new moodle_page();
    2657          $cm = get_coursemodule_from_instance('forum', $discussion->forum);
    2658          $context = \context_module::instance($cm->id);
    2659          $PAGE->set_context($context);
    2660          $PAGE->set_cm($cm, $course, $forum);
    2661  
    2662          // Trigger and capturing the event.
    2663          $sink = $this->redirectEvents();
    2664  
    2665          // Trigger the event by subscribing the user to the forum.
    2666          \mod_forum\subscriptions::subscribe_user($user->id, $forum);
    2667  
    2668          $events = $sink->get_events();
    2669          $sink->clear();
    2670          $this->assertCount(1, $events);
    2671          $event = reset($events);
    2672  
    2673          // Checking that the event contains the expected values.
    2674          $this->assertInstanceOf('\mod_forum\event\subscription_created', $event);
    2675          $this->assertEquals($context, $event->get_context());
    2676  
    2677          // Trigger the event by unsubscribing the user to the forum.
    2678          \mod_forum\subscriptions::unsubscribe_user($user->id, $forum);
    2679  
    2680          $events = $sink->get_events();
    2681          $sink->clear();
    2682          $this->assertCount(1, $events);
    2683          $event = reset($events);
    2684  
    2685          // Checking that the event contains the expected values.
    2686          $this->assertInstanceOf('\mod_forum\event\subscription_deleted', $event);
    2687          $this->assertEquals($context, $event->get_context());
    2688  
    2689          // Trigger the event by subscribing the user to the discussion.
    2690          \mod_forum\subscriptions::subscribe_user_to_discussion($user->id, $discussion);
    2691  
    2692          $events = $sink->get_events();
    2693          $sink->clear();
    2694          $this->assertCount(1, $events);
    2695          $event = reset($events);
    2696  
    2697          // Checking that the event contains the expected values.
    2698          $this->assertInstanceOf('\mod_forum\event\discussion_subscription_created', $event);
    2699          $this->assertEquals($context, $event->get_context());
    2700  
    2701          // Trigger the event by unsubscribing the user from the discussion.
    2702          \mod_forum\subscriptions::unsubscribe_user_from_discussion($user->id, $discussion);
    2703  
    2704          $events = $sink->get_events();
    2705          $sink->clear();
    2706          $this->assertCount(1, $events);
    2707          $event = reset($events);
    2708  
    2709          // Checking that the event contains the expected values.
    2710          $this->assertInstanceOf('\mod_forum\event\discussion_subscription_deleted', $event);
    2711          $this->assertEquals($context, $event->get_context());
    2712  
    2713          // Now try with the context for a different module (quiz).
    2714          $PAGE = new moodle_page();
    2715          $cm = get_coursemodule_from_instance('quiz', $quiz->id);
    2716          $quizcontext = \context_module::instance($cm->id);
    2717          $PAGE->set_context($quizcontext);
    2718          $PAGE->set_cm($cm, $course, $quiz);
    2719  
    2720          // Trigger and capturing the event.
    2721          $sink = $this->redirectEvents();
    2722  
    2723          // Trigger the event by subscribing the user to the forum.
    2724          \mod_forum\subscriptions::subscribe_user($user->id, $forum);
    2725  
    2726          $events = $sink->get_events();
    2727          $sink->clear();
    2728          $this->assertCount(1, $events);
    2729          $event = reset($events);
    2730  
    2731          // Checking that the event contains the expected values.
    2732          $this->assertInstanceOf('\mod_forum\event\subscription_created', $event);
    2733          $this->assertEquals($context, $event->get_context());
    2734  
    2735          // Trigger the event by unsubscribing the user to the forum.
    2736          \mod_forum\subscriptions::unsubscribe_user($user->id, $forum);
    2737  
    2738          $events = $sink->get_events();
    2739          $sink->clear();
    2740          $this->assertCount(1, $events);
    2741          $event = reset($events);
    2742  
    2743          // Checking that the event contains the expected values.
    2744          $this->assertInstanceOf('\mod_forum\event\subscription_deleted', $event);
    2745          $this->assertEquals($context, $event->get_context());
    2746  
    2747          // Trigger the event by subscribing the user to the discussion.
    2748          \mod_forum\subscriptions::subscribe_user_to_discussion($user->id, $discussion);
    2749  
    2750          $events = $sink->get_events();
    2751          $sink->clear();
    2752          $this->assertCount(1, $events);
    2753          $event = reset($events);
    2754  
    2755          // Checking that the event contains the expected values.
    2756          $this->assertInstanceOf('\mod_forum\event\discussion_subscription_created', $event);
    2757          $this->assertEquals($context, $event->get_context());
    2758  
    2759          // Trigger the event by unsubscribing the user from the discussion.
    2760          \mod_forum\subscriptions::unsubscribe_user_from_discussion($user->id, $discussion);
    2761  
    2762          $events = $sink->get_events();
    2763          $sink->clear();
    2764          $this->assertCount(1, $events);
    2765          $event = reset($events);
    2766  
    2767          // Checking that the event contains the expected values.
    2768          $this->assertInstanceOf('\mod_forum\event\discussion_subscription_deleted', $event);
    2769          $this->assertEquals($context, $event->get_context());
    2770  
    2771          // Now try with the course context - the module context should still be used.
    2772          $PAGE = new moodle_page();
    2773          $coursecontext = \context_course::instance($course->id);
    2774          $PAGE->set_context($coursecontext);
    2775  
    2776          // Trigger the event by subscribing the user to the forum.
    2777          \mod_forum\subscriptions::subscribe_user($user->id, $forum);
    2778  
    2779          $events = $sink->get_events();
    2780          $sink->clear();
    2781          $this->assertCount(1, $events);
    2782          $event = reset($events);
    2783  
    2784          // Checking that the event contains the expected values.
    2785          $this->assertInstanceOf('\mod_forum\event\subscription_created', $event);
    2786          $this->assertEquals($context, $event->get_context());
    2787  
    2788          // Trigger the event by unsubscribing the user to the forum.
    2789          \mod_forum\subscriptions::unsubscribe_user($user->id, $forum);
    2790  
    2791          $events = $sink->get_events();
    2792          $sink->clear();
    2793          $this->assertCount(1, $events);
    2794          $event = reset($events);
    2795  
    2796          // Checking that the event contains the expected values.
    2797          $this->assertInstanceOf('\mod_forum\event\subscription_deleted', $event);
    2798          $this->assertEquals($context, $event->get_context());
    2799  
    2800          // Trigger the event by subscribing the user to the discussion.
    2801          \mod_forum\subscriptions::subscribe_user_to_discussion($user->id, $discussion);
    2802  
    2803          $events = $sink->get_events();
    2804          $sink->clear();
    2805          $this->assertCount(1, $events);
    2806          $event = reset($events);
    2807  
    2808          // Checking that the event contains the expected values.
    2809          $this->assertInstanceOf('\mod_forum\event\discussion_subscription_created', $event);
    2810          $this->assertEquals($context, $event->get_context());
    2811  
    2812          // Trigger the event by unsubscribing the user from the discussion.
    2813          \mod_forum\subscriptions::unsubscribe_user_from_discussion($user->id, $discussion);
    2814  
    2815          $events = $sink->get_events();
    2816          $sink->clear();
    2817          $this->assertCount(1, $events);
    2818          $event = reset($events);
    2819  
    2820          // Checking that the event contains the expected values.
    2821          $this->assertInstanceOf('\mod_forum\event\discussion_subscription_deleted', $event);
    2822          $this->assertEquals($context, $event->get_context());
    2823  
    2824      }
    2825  
    2826      /**
    2827       * Test mod_forum_observer methods.
    2828       */
    2829      public function test_observers() {
    2830          global $DB, $CFG;
    2831  
    2832          require_once($CFG->dirroot . '/mod/forum/lib.php');
    2833  
    2834          $forumgen = $this->getDataGenerator()->get_plugin_generator('mod_forum');
    2835  
    2836          $course = $this->getDataGenerator()->create_course();
    2837          $trackedrecord = array('course' => $course->id, 'type' => 'general', 'forcesubscribe' => FORUM_INITIALSUBSCRIBE);
    2838          $untrackedrecord = array('course' => $course->id, 'type' => 'general');
    2839          $trackedforum = $this->getDataGenerator()->create_module('forum', $trackedrecord);
    2840          $untrackedforum = $this->getDataGenerator()->create_module('forum', $untrackedrecord);
    2841  
    2842          // Used functions don't require these settings; adding
    2843          // them just in case there are APIs changes in future.
    2844          $user = $this->getDataGenerator()->create_user(array(
    2845              'maildigest' => 1,
    2846              'trackforums' => 1
    2847          ));
    2848  
    2849          $manplugin = enrol_get_plugin('manual');
    2850          $manualenrol = $DB->get_record('enrol', array('courseid' => $course->id, 'enrol' => 'manual'));
    2851          $student = $DB->get_record('role', array('shortname' => 'student'));
    2852  
    2853          // The role_assign observer does it's job adding the forum_subscriptions record.
    2854          $manplugin->enrol_user($manualenrol, $user->id, $student->id);
    2855  
    2856          // They are not required, but in a real environment they are supposed to be required;
    2857          // adding them just in case there are APIs changes in future.
    2858          set_config('forum_trackingtype', 1);
    2859          set_config('forum_trackreadposts', 1);
    2860  
    2861          $record = array();
    2862          $record['course'] = $course->id;
    2863          $record['forum'] = $trackedforum->id;
    2864          $record['userid'] = $user->id;
    2865          $discussion = $forumgen->create_discussion($record);
    2866  
    2867          $record = array();
    2868          $record['discussion'] = $discussion->id;
    2869          $record['userid'] = $user->id;
    2870          $post = $forumgen->create_post($record);
    2871  
    2872          forum_tp_add_read_record($user->id, $post->id);
    2873          forum_set_user_maildigest($trackedforum, 2, $user);
    2874          forum_tp_stop_tracking($untrackedforum->id, $user->id);
    2875  
    2876          $this->assertEquals(1, $DB->count_records('forum_subscriptions'));
    2877          $this->assertEquals(1, $DB->count_records('forum_digests'));
    2878          $this->assertEquals(1, $DB->count_records('forum_track_prefs'));
    2879          $this->assertEquals(1, $DB->count_records('forum_read'));
    2880  
    2881          // The course_module_created observer does it's job adding a subscription.
    2882          $forumrecord = array('course' => $course->id, 'type' => 'general', 'forcesubscribe' => FORUM_INITIALSUBSCRIBE);
    2883          $extraforum = $this->getDataGenerator()->create_module('forum', $forumrecord);
    2884          $this->assertEquals(2, $DB->count_records('forum_subscriptions'));
    2885  
    2886          $manplugin->unenrol_user(