public function test_course_completion_progress()
 {
     global $CFG, $DB;
     $CFG->enablecompletion = true;
     $DB->update_record('course', (object) ['id' => $this->course->id, 'enablecompletion' => 1]);
     $this->course = $DB->get_record('course', ['id' => $this->course->id]);
     $actual = local::course_completion_progress($this->course);
     $this->assertNull($actual);
     $this->create_extra_users();
     $this->setUser($this->extrasuspendedstudents[0]);
     $actual = local::course_completion_progress($this->course);
     $this->assertNull($actual);
     $this->setUser($this->students[0]);
     $actual = local::course_completion_progress($this->course);
     $this->assertNull($actual);
     // Create an assignment that is enabled for completion.
     $this->setUSer($this->teachers[0]);
     $assign = $this->create_instance(['course' => $this->course->id, 'name' => 'Assign!', 'completion' => COMPLETION_TRACKING_AUTOMATIC]);
     // Should now have something that can be tracked for progress.
     $this->setUser($this->students[0]);
     $actual = local::course_completion_progress($this->course);
     $this->assertInstanceOf('stdClass', $actual);
     $this->assertEquals(0, $actual->complete);
     $this->assertEquals(1, $actual->total);
     $this->assertEquals(0, $actual->progress);
     // Make sure completion updates on grading.
     $DB->set_field('course_modules', 'completiongradeitemnumber', 0, ['id' => $assign->get_course_module()->id]);
     $gradeitem = $assign->get_grade_item();
     grade_object::set_properties($gradeitem, array('gradepass' => 50.0));
     $gradeitem->update();
     $assignrow = $assign->get_instance();
     $grades = array();
     $grades[$this->students[0]->id] = (object) ['rawgrade' => 60, 'userid' => $this->students[0]->id];
     $assignrow->cmidnumber = null;
     assign_grade_item_update($assignrow, $grades);
     $actual = local::course_completion_progress($this->course);
     $this->assertInstanceOf('stdClass', $actual);
     $this->assertEquals(1, $actual->complete);
     $this->assertEquals(1, $actual->total);
     $this->assertEquals(100, $actual->progress);
     // Make sure course completion returns null when disabled at site level.
     $CFG->enablecompletion = false;
     $actual = local::course_completion_progress($this->course);
     $this->assertNull($actual);
     // Make sure course completion returns null when disabled at course level.
     $CFG->enablecompletion = true;
     $DB->update_record('course', (object) ['id' => $this->course->id, 'enablecompletion' => 0]);
     $this->course = $DB->get_record('course', ['id' => $this->course->id]);
     $actual = local::course_completion_progress($this->course);
     $this->assertNull($actual);
 }
 public function test_no_course_completion_progress()
 {
     $actual = local::course_completion_progress($this->course);
     $this->assertNull($actual);
     $this->create_extra_users();
     $this->setUser($this->extrasuspendedstudents[0]);
     $actual = local::course_completion_progress($this->course);
     $this->assertNull($actual);
     $this->setUser($this->students[0]);
     $actual = local::course_completion_progress($this->course);
     $this->assertInstanceOf('stdClass', $actual);
 }