Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.

Differences Between: [Versions 310 and 401] [Versions 39 and 401]

   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   * Unit tests for (some of) mod/imscp/lib.php.
  19   *
  20   * @package    mod_imscp
  21   * @category   test
  22   * @copyright  2015 Juan Leyva <juan@moodle.com>
  23   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  24   */
  25  namespace mod_imscp;
  26  
  27  defined('MOODLE_INTERNAL') || die();
  28  
  29  global $CFG;
  30  require_once($CFG->dirroot . '/mod/imscp/lib.php');
  31  
  32  /**
  33   * Unit tests for (some of) mod/imscp/lib.php.
  34   *
  35   * @package    mod_imscp
  36   * @category   test
  37   * @copyright  2015 Juan Leyva <juan@moodle.com>
  38   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  39   */
  40  class lib_test extends \advanced_testcase {
  41  
  42      public function test_export_contents() {
  43          global $DB, $USER;
  44  
  45          $this->resetAfterTest(true);
  46  
  47          $user = $this->getDataGenerator()->create_user();
  48          $course = $this->getDataGenerator()->create_course();
  49          $studentrole = $DB->get_record('role', array('shortname' => 'student'));
  50          $this->getDataGenerator()->enrol_user($user->id, $course->id, $studentrole->id);
  51  
  52          $this->setAdminUser();
  53          $imscp = $this->getDataGenerator()->create_module('imscp', array('course' => $course->id));
  54          $cm = get_coursemodule_from_id('imscp', $imscp->cmid);
  55  
  56          $this->setUser($user);
  57          $contents = imscp_export_contents($cm, '');
  58  
  59          // The test package contains 47 files.
  60          $this->assertCount(47, $contents);
  61          // The structure is present.
  62          $this->assertEquals('structure', $contents[0]['filename']);
  63          // The structure is returned and it maches the expected one.
  64          $this->assertEquals(json_encode(unserialize($imscp->structure)), $contents[0]['content']);
  65  
  66      }
  67  
  68      /**
  69       * Test imscp_view
  70       * @return void
  71       */
  72      public function test_imscp_view() {
  73          global $CFG;
  74  
  75          $CFG->enablecompletion = 1;
  76          $this->resetAfterTest();
  77  
  78          $this->setAdminUser();
  79          // Setup test data.
  80          $course = $this->getDataGenerator()->create_course(array('enablecompletion' => 1));
  81          $imscp = $this->getDataGenerator()->create_module('imscp', array('course' => $course->id),
  82                                                              array('completion' => 2, 'completionview' => 1));
  83          $context = \context_module::instance($imscp->cmid);
  84          $cm = get_coursemodule_from_instance('imscp', $imscp->id);
  85  
  86          // Trigger and capture the event.
  87          $sink = $this->redirectEvents();
  88  
  89          imscp_view($imscp, $course, $cm, $context);
  90  
  91          $events = $sink->get_events();
  92          // 2 additional events thanks to completion.
  93          $this->assertCount(3, $events);
  94          $event = array_shift($events);
  95  
  96          // Checking that the event contains the expected values.
  97          $this->assertInstanceOf('\mod_imscp\event\course_module_viewed', $event);
  98          $this->assertEquals($context, $event->get_context());
  99          $moodleurl = new \moodle_url('/mod/imscp/view.php', array('id' => $cm->id));
 100          $this->assertEquals($moodleurl, $event->get_url());
 101          $this->assertEventContextNotUsed($event);
 102          $this->assertNotEmpty($event->get_name());
 103  
 104          // Check completion status.
 105          $completion = new \completion_info($course);
 106          $completiondata = $completion->get_data($cm);
 107          $this->assertEquals(1, $completiondata->completionstate);
 108      }
 109  
 110      public function test_imscp_core_calendar_provide_event_action() {
 111          $this->resetAfterTest();
 112          $this->setAdminUser();
 113  
 114          // Create the activity.
 115          $course = $this->getDataGenerator()->create_course();
 116          $imscp = $this->getDataGenerator()->create_module('imscp', array('course' => $course->id));
 117  
 118          // Create a calendar event.
 119          $event = $this->create_action_event($course->id, $imscp->id,
 120              \core_completion\api::COMPLETION_EVENT_TYPE_DATE_COMPLETION_EXPECTED);
 121  
 122          // Create an action factory.
 123          $factory = new \core_calendar\action_factory();
 124  
 125          // Decorate action event.
 126          $actionevent = mod_imscp_core_calendar_provide_event_action($event, $factory);
 127  
 128          // Confirm the event was decorated.
 129          $this->assertInstanceOf('\core_calendar\local\event\value_objects\action', $actionevent);
 130          $this->assertEquals(get_string('view'), $actionevent->get_name());
 131          $this->assertInstanceOf('moodle_url', $actionevent->get_url());
 132          $this->assertEquals(1, $actionevent->get_item_count());
 133          $this->assertTrue($actionevent->is_actionable());
 134      }
 135  
 136      public function test_imscp_core_calendar_provide_event_action_for_user() {
 137          global $CFG;
 138  
 139          $this->resetAfterTest();
 140          $this->setAdminUser();
 141  
 142          // Create a course.
 143          $course = $this->getDataGenerator()->create_course();
 144  
 145          // Create a student.
 146          $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
 147  
 148          // Create the activity.
 149          $imscp = $this->getDataGenerator()->create_module('imscp', array('course' => $course->id));
 150  
 151          // Create a calendar event.
 152          $event = $this->create_action_event($course->id, $imscp->id,
 153              \core_completion\api::COMPLETION_EVENT_TYPE_DATE_COMPLETION_EXPECTED);
 154  
 155          // Now log out.
 156          $CFG->forcelogin = true; // We don't want to be logged in as guest, as guest users might still have some capabilities.
 157          $this->setUser();
 158  
 159          // Create an action factory.
 160          $factory = new \core_calendar\action_factory();
 161  
 162          // Decorate action event for the student.
 163          $actionevent = mod_imscp_core_calendar_provide_event_action($event, $factory, $student->id);
 164  
 165          // Confirm the event was decorated.
 166          $this->assertInstanceOf('\core_calendar\local\event\value_objects\action', $actionevent);
 167          $this->assertEquals(get_string('view'), $actionevent->get_name());
 168          $this->assertInstanceOf('moodle_url', $actionevent->get_url());
 169          $this->assertEquals(1, $actionevent->get_item_count());
 170          $this->assertTrue($actionevent->is_actionable());
 171      }
 172  
 173      public function test_imscp_core_calendar_provide_event_action_as_non_user() {
 174          global $CFG;
 175  
 176          $this->resetAfterTest();
 177          $this->setAdminUser();
 178  
 179          // Create the activity.
 180          $course = $this->getDataGenerator()->create_course();
 181          $imscp = $this->getDataGenerator()->create_module('imscp', array('course' => $course->id));
 182  
 183          // Create a calendar event.
 184          $event = $this->create_action_event($course->id, $imscp->id,
 185                  \core_completion\api::COMPLETION_EVENT_TYPE_DATE_COMPLETION_EXPECTED);
 186  
 187          // Now log out.
 188          $CFG->forcelogin = true; // We don't want to be logged in as guest, as guest users might still have some capabilities.
 189          $this->setUser();
 190  
 191          // Create an action factory.
 192          $factory = new \core_calendar\action_factory();
 193  
 194          // Decorate action event.
 195          $actionevent = mod_imscp_core_calendar_provide_event_action($event, $factory);
 196  
 197          // Confirm the event is not shown at all.
 198          $this->assertNull($actionevent);
 199      }
 200  
 201      public function test_imscp_core_calendar_provide_event_action_in_hidden_section() {
 202          global $CFG;
 203  
 204          $this->resetAfterTest();
 205          $this->setAdminUser();
 206  
 207          // Create a course.
 208          $course = $this->getDataGenerator()->create_course();
 209  
 210          // Create a student.
 211          $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
 212  
 213          // Create the activity.
 214          $imscp = $this->getDataGenerator()->create_module('imscp', array('course' => $course->id));
 215  
 216          // Create a calendar event.
 217          $event = $this->create_action_event($course->id, $imscp->id,
 218                  \core_completion\api::COMPLETION_EVENT_TYPE_DATE_COMPLETION_EXPECTED);
 219  
 220          // Set sections 0 as hidden.
 221          set_section_visible($course->id, 0, 0);
 222  
 223          // Now log out.
 224          $CFG->forcelogin = true; // We don't want to be logged in as guest, as guest users might still have some capabilities.
 225          $this->setUser();
 226  
 227          // Create an action factory.
 228          $factory = new \core_calendar\action_factory();
 229  
 230          // Decorate action event for the student.
 231          $actionevent = mod_imscp_core_calendar_provide_event_action($event, $factory, $student->id);
 232  
 233          // Confirm the event is not shown at all.
 234          $this->assertNull($actionevent);
 235      }
 236  
 237      public function test_imscp_core_calendar_provide_event_action_already_completed() {
 238          global $CFG;
 239  
 240          $this->resetAfterTest();
 241          $this->setAdminUser();
 242  
 243          $CFG->enablecompletion = 1;
 244  
 245          // Create the activity.
 246          $course = $this->getDataGenerator()->create_course(array('enablecompletion' => 1));
 247          $imscp = $this->getDataGenerator()->create_module('imscp', array('course' => $course->id),
 248              array('completion' => 2, 'completionview' => 1, 'completionexpected' => time() + DAYSECS));
 249  
 250          // Get some additional data.
 251          $cm = get_coursemodule_from_instance('imscp', $imscp->id);
 252  
 253          // Create a calendar event.
 254          $event = $this->create_action_event($course->id, $imscp->id,
 255              \core_completion\api::COMPLETION_EVENT_TYPE_DATE_COMPLETION_EXPECTED);
 256  
 257          // Mark the activity as completed.
 258          $completion = new \completion_info($course);
 259          $completion->set_module_viewed($cm);
 260  
 261          // Create an action factory.
 262          $factory = new \core_calendar\action_factory();
 263  
 264          // Decorate action event.
 265          $actionevent = mod_imscp_core_calendar_provide_event_action($event, $factory);
 266  
 267          // Ensure result was null.
 268          $this->assertNull($actionevent);
 269      }
 270  
 271      public function test_imscp_core_calendar_provide_event_action_already_completed_for_user() {
 272          global $CFG;
 273  
 274          $this->resetAfterTest();
 275          $this->setAdminUser();
 276  
 277          $CFG->enablecompletion = 1;
 278  
 279          // Create a course.
 280          $course = $this->getDataGenerator()->create_course(array('enablecompletion' => 1));
 281  
 282          // Create a student.
 283          $student = $this->getDataGenerator()->create_and_enrol($course, 'student');
 284  
 285          // Create the activity.
 286          $imscp = $this->getDataGenerator()->create_module('imscp', array('course' => $course->id),
 287              array('completion' => 2, 'completionview' => 1, 'completionexpected' => time() + DAYSECS));
 288  
 289          // Get some additional data.
 290          $cm = get_coursemodule_from_instance('imscp', $imscp->id);
 291  
 292          // Create a calendar event.
 293          $event = $this->create_action_event($course->id, $imscp->id,
 294              \core_completion\api::COMPLETION_EVENT_TYPE_DATE_COMPLETION_EXPECTED);
 295  
 296          // Mark the activity as completed.
 297          $completion = new \completion_info($course);
 298          $completion->set_module_viewed($cm, $student->id);
 299  
 300          // Create an action factory.
 301          $factory = new \core_calendar\action_factory();
 302  
 303          // Decorate action event for the student.
 304          $actionevent = mod_imscp_core_calendar_provide_event_action($event, $factory, $student->id);
 305  
 306          // Ensure result was null.
 307          $this->assertNull($actionevent);
 308      }
 309  
 310      /**
 311       * Creates an action event.
 312       *
 313       * @param int $courseid The course id.
 314       * @param int $instanceid The instance id.
 315       * @param string $eventtype The event type.
 316       * @return bool|calendar_event
 317       */
 318      private function create_action_event($courseid, $instanceid, $eventtype) {
 319          $event = new \stdClass();
 320          $event->name = 'Calendar event';
 321          $event->modulename  = 'imscp';
 322          $event->courseid = $courseid;
 323          $event->instance = $instanceid;
 324          $event->type = CALENDAR_EVENT_TYPE_ACTION;
 325          $event->eventtype = $eventtype;
 326          $event->timestart = time();
 327  
 328          return \calendar_event::create($event);
 329      }
 330  }