Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 3.9.x will end* 10 May 2021 (12 months).
  • Bug fixes for security issues in 3.9.x will end* 8 May 2023 (36 months).
  • PHP version: minimum PHP 7.2.0 Note: minimum PHP version has increased since Moodle 3.8. PHP 7.3.x and 7.4.x are supported too.

Differences Between: [Versions 39 and 310] [Versions 39 and 311] [Versions 39 and 400] [Versions 39 and 401] [Versions 39 and 402] [Versions 39 and 403]

   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   * Test completion progress API.
  19   *
  20   * @package core_completion
  21   * @category test
  22   * @copyright 2017 Mark Nelson <markn@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   * Test completion progress API.
  30   *
  31   * @package core_completion
  32   * @category test
  33   * @copyright 2017 Mark Nelson <markn@moodle.com>
  34   * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  35   */
  36  class core_completion_progress_testcase extends advanced_testcase {
  37  
  38      /**
  39       * Test setup.
  40       */
  41      public function setUp() {
  42          global $CFG;
  43  
  44          $CFG->enablecompletion = true;
  45          $this->resetAfterTest();
  46      }
  47  
  48      /**
  49       * Tests that the course progress percentage is returned correctly when we have only activity completion.
  50       */
  51      public function test_course_progress_percentage_with_just_activities() {
  52          global $DB;
  53  
  54          // Add a course that supports completion.
  55          $course = $this->getDataGenerator()->create_course(array('enablecompletion' => 1));
  56  
  57          // Enrol a user in the course.
  58          $user = $this->getDataGenerator()->create_user();
  59          $studentrole = $DB->get_record('role', array('shortname' => 'student'));
  60          $this->getDataGenerator()->enrol_user($user->id, $course->id, $studentrole->id);
  61  
  62          // Add four activities that use completion.
  63          $assign = $this->getDataGenerator()->create_module('assign', array('course' => $course->id),
  64              array('completion' => 1));
  65          $data = $this->getDataGenerator()->create_module('data', array('course' => $course->id),
  66              array('completion' => 1));
  67          $this->getDataGenerator()->create_module('forum', array('course' => $course->id),
  68              array('completion' => 1));
  69          $this->getDataGenerator()->create_module('forum', array('course' => $course->id),
  70              array('completion' => 1));
  71  
  72          // Add an activity that does *not* use completion.
  73          $this->getDataGenerator()->create_module('assign', array('course' => $course->id));
  74  
  75          // Mark two of them as completed for a user.
  76          $cmassign = get_coursemodule_from_id('assign', $assign->cmid);
  77          $cmdata = get_coursemodule_from_id('data', $data->cmid);
  78          $completion = new completion_info($course);
  79          $completion->update_state($cmassign, COMPLETION_COMPLETE, $user->id);
  80          $completion->update_state($cmdata, COMPLETION_COMPLETE, $user->id);
  81  
  82          // Check we have received valid data.
  83          // Note - only 4 out of the 5 activities support completion, and the user has completed 2 of those.
  84          $this->assertEquals('50', \core_completion\progress::get_course_progress_percentage($course, $user->id));
  85      }
  86  
  87      /**
  88       * Tests that the course progress percentage is returned correctly when we have a course and activity completion.
  89       */
  90      public function test_course_progress_percentage_with_activities_and_course() {
  91          global $DB;
  92  
  93          // Add a course that supports completion.
  94          $course = $this->getDataGenerator()->create_course(array('enablecompletion' => 1));
  95  
  96          // Enrol a user in the course.
  97          $user = $this->getDataGenerator()->create_user();
  98          $studentrole = $DB->get_record('role', array('shortname' => 'student'));
  99          $this->getDataGenerator()->enrol_user($user->id, $course->id, $studentrole->id);
 100  
 101          // Add four activities that use completion.
 102          $assign = $this->getDataGenerator()->create_module('assign', array('course' => $course->id),
 103              array('completion' => 1));
 104          $data = $this->getDataGenerator()->create_module('data', array('course' => $course->id),
 105              array('completion' => 1));
 106          $this->getDataGenerator()->create_module('forum', array('course' => $course->id),
 107              array('completion' => 1));
 108          $this->getDataGenerator()->create_module('forum', array('course' => $course->id),
 109              array('completion' => 1));
 110  
 111          // Add an activity that does *not* use completion.
 112          $this->getDataGenerator()->create_module('assign', array('course' => $course->id));
 113  
 114          // Mark two of them as completed for a user.
 115          $cmassign = get_coursemodule_from_id('assign', $assign->cmid);
 116          $cmdata = get_coursemodule_from_id('data', $data->cmid);
 117          $completion = new completion_info($course);
 118          $completion->update_state($cmassign, COMPLETION_COMPLETE, $user->id);
 119          $completion->update_state($cmdata, COMPLETION_COMPLETE, $user->id);
 120  
 121          // Now, mark the course as completed.
 122          $ccompletion = new completion_completion(array('course' => $course->id, 'userid' => $user->id));
 123          $ccompletion->mark_complete();
 124  
 125          // Check we have received valid data.
 126          // The course completion takes priority, so should return 100.
 127          $this->assertEquals('100', \core_completion\progress::get_course_progress_percentage($course, $user->id));
 128      }
 129  
 130      /**
 131       * Tests that the course progress returns null when the course does not support it.
 132       */
 133      public function test_course_progress_course_not_using_completion() {
 134          // Create a course that does not use completion.
 135          $course = $this->getDataGenerator()->create_course();
 136  
 137          // Check that the result was null.
 138          $this->assertNull(\core_completion\progress::get_course_progress_percentage($course));
 139      }
 140  
 141      /**
 142       * Tests that the course progress returns null when there are no activities that support it.
 143       */
 144      public function test_course_progress_no_activities_using_completion() {
 145          // Create a course that does support completion.
 146          $course = $this->getDataGenerator()->create_course(array('enablecompletion' => 1));
 147  
 148          // Add an activity that does *not* support completion.
 149          $this->getDataGenerator()->create_module('assign', array('course' => $course->id));
 150  
 151          // Check that the result was null.
 152          $this->assertNull(\core_completion\progress::get_course_progress_percentage($course));
 153      }
 154  
 155      /**
 156       * Tests that the course progress returns null for a not tracked for completion user in a course.
 157       */
 158      public function test_course_progress_not_tracked_user() {
 159          global $DB;
 160  
 161          // Add a course that supports completion.
 162          $course = $this->getDataGenerator()->create_course(array('enablecompletion' => 1));
 163  
 164          // Enrol a user in the course.
 165          $user = $this->getDataGenerator()->create_user();
 166          $studentrole = $DB->get_record('role', array('shortname' => 'student'));
 167  
 168          $this->getDataGenerator()->enrol_user($user->id, $course->id, $studentrole->id);
 169  
 170          // Now, mark the course as completed.
 171          $ccompletion = new completion_completion(array('course' => $course->id, 'userid' => $user->id));
 172          $ccompletion->mark_complete();
 173  
 174          // The course completion should return 100.
 175          $this->assertEquals('100', \core_completion\progress::get_course_progress_percentage($course, $user->id));
 176  
 177          // Now make the user's role to be not tracked for completion.
 178          unassign_capability('moodle/course:isincompletionreports', $studentrole->id);
 179  
 180          // Check that the result is null now.
 181          $this->assertNull(\core_completion\progress::get_course_progress_percentage($course, $user->id));
 182      }
 183  }