AutorÃa | Ultima modificación | Ver Log |
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Overview table unit tests for block_completion_progress.
*
* @package block_completion_progress
* @copyright 2021 Jonathon Fowler <fowlerj@usq.edu.au>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace block_completion_progress;
defined('MOODLE_INTERNAL') || die();
global $CFG;
require_once($CFG->dirroot . '/mod/assign/locallib.php');
require_once($CFG->dirroot.'/blocks/moodleblock.class.php');
require_once($CFG->dirroot.'/blocks/completion_progress/block_completion_progress.php');
use block_completion_progress\completion_progress;
use block_completion_progress\defaults;
/**
* Overview table unit tests for block_completion_progress.
*
* @package block_completion_progress
* @copyright 2021 Jonathon Fowler <fowlerj@usq.edu.au>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class overview_test extends \advanced_testcase {
/**
* Teacher users.
* @var array
*/
private $teachers = [];
/**
* Student users.
* @var array
*/
private $students = [];
/**
* Groups.
* @var array
*/
private $groups = [];
/**
* Number of students to create.
*/
const STUDENT_COUNT = 4;
/**
* Create a course and add enrol users to it.
*/
protected function setUp(): void {
$this->resetAfterTest(true);
set_config('enablecompletion', 1);
$generator = $this->getDataGenerator();
$this->course = $generator->create_course([
'enablecompletion' => 1,
]);
$this->teachers[0] = $generator->create_and_enrol($this->course, 'teacher');
$this->groups[0] = $generator->create_group(['courseid' => $this->course->id]);
$this->groups[1] = $generator->create_group(['courseid' => $this->course->id]);
for ($i = 0; $i < self::STUDENT_COUNT; $i++) {
$status = $i >= 3 ? ENROL_USER_SUSPENDED : null;
$this->students[$i] = $generator->create_and_enrol($this->course, 'student',
null, 'manual', 0, 0, $status);
// Students are put into even/odd groups.
$generator->create_group_member(['groupid' => $this->groups[$i % 2]->id,
'userid' => $this->students[$i]->id]);
}
}
/**
* Convenience function to create a testable instance of an assignment.
*
* @param array $params Array of parameters to pass to the generator
* @return assign Assign class.
*/
protected function create_assign_instance($params) {
$generator = $this->getDataGenerator()->get_plugin_generator('mod_assign');
$params['course'] = $this->course->id;
$instance = $generator->create_instance($params);
$cm = get_coursemodule_from_instance('assign', $instance->id);
$context = \context_module::instance($cm->id);
return new \assign($context, $cm, $this->course);
}
/**
* Test optional settings' effects on the overview table.
* @covers \block_completion_progress\table\overview
*/
public function test_overview_options() {
global $DB, $PAGE;
$output = $PAGE->get_renderer('block_completion_progress');
// Add a block.
$context = \context_course::instance($this->course->id);
$blockinfo = [
'parentcontextid' => $context->id,
'pagetypepattern' => 'course-view-*',
'showinsubcontexts' => 0,
'defaultweight' => 5,
'timecreated' => time(),
'timemodified' => time(),
'defaultregion' => 'side-post',
'configdata' => base64_encode(serialize((object)[
'orderby' => defaults::ORDERBY,
'longbars' => defaults::LONGBARS,
'progressBarIcons' => 0, // Non-default.
'showpercentage' => defaults::SHOWPERCENTAGE,
'progressTitle' => "",
'activitiesincluded' => defaults::ACTIVITIESINCLUDED,
])),
];
$blockinstance = $this->getDataGenerator()->create_block('completion_progress', $blockinfo);
$assign = $this->create_assign_instance([
'submissiondrafts' => 0,
'completionsubmit' => 1,
'completion' => COMPLETION_TRACKING_AUTOMATIC
]);
$PAGE->set_url('/');
// Test inactive student is hidden and 'last in course' column is hidden.
set_config('showinactive', 0, 'block_completion_progress');
set_config('showlastincourse', 0, 'block_completion_progress');
set_config('forceiconsinbar', 0, 'block_completion_progress');
$progress = (new completion_progress($this->course))->for_overview()->for_block_instance($blockinstance);
$table = new \block_completion_progress\table\overview($progress, [], 0, true);
$table->define_baseurl('/');
ob_start();
$table->out(30, false);
$text = ob_get_clean();
$this->assertStringContainsString('<input id="user'.$this->students[0]->id.'" ', $text);
$this->assertStringNotContainsString('<input id="user'.$this->students[3]->id.'" ', $text);
$this->assertStringNotContainsString('col-timeaccess', $text);
$this->assertStringNotContainsString('barWithIcons', $text);
// Test inactive student is visible and 'last in course' column is shown.
set_config('showinactive', 1, 'block_completion_progress');
set_config('showlastincourse', 1, 'block_completion_progress');
set_config('forceiconsinbar', 1, 'block_completion_progress');
$progress = (new completion_progress($this->course))->for_overview()->for_block_instance($blockinstance);
$table = new \block_completion_progress\table\overview($progress, [], 0, true);
$table->define_baseurl('/');
ob_start();
$table->out(30, false);
$text = ob_get_clean();
$this->assertStringContainsString('<input id="user'.$this->students[0]->id.'" ', $text);
$this->assertStringContainsString('<input id="user'.$this->students[3]->id.'" ', $text);
$this->assertStringContainsString('col-timeaccess', $text);
$this->assertStringContainsString('barWithIcons', $text);
// Test that group filtering works.
$progress = (new completion_progress($this->course))->for_overview()->for_block_instance($blockinstance);
$table = new \block_completion_progress\table\overview($progress, [$this->groups[0]->id], 0, true);
$table->define_baseurl('/');
ob_start();
$table->out(30, false);
$text = ob_get_clean();
$this->assertStringContainsString('<input id="user'.$this->students[0]->id.'" ', $text);
$this->assertStringNotContainsString('<input id="user'.$this->students[1]->id.'" ', $text);
$this->assertStringContainsString('<input id="user'.$this->students[2]->id.'" ', $text);
$this->assertStringNotContainsString('<input id="user'.$this->students[3]->id.'" ', $text);
}
/**
* Test that the overview table correctly sorts by progress.
* @covers \block_completion_progress\table\overview
*/
public function test_overview_percentage_sort() {
global $DB, $PAGE;
$PAGE->set_url('/');
$output = $PAGE->get_renderer('block_completion_progress');
$generator = $this->getDataGenerator();
// Add a block.
$context = \context_course::instance($this->course->id);
$blockinfo = [
'parentcontextid' => $context->id,
'pagetypepattern' => 'course-view-*',
'showinsubcontexts' => 0,
'defaultweight' => 5,
'timecreated' => time(),
'timemodified' => time(),
'defaultregion' => 'side-post',
'configdata' => base64_encode(serialize((object)[
'orderby' => defaults::ORDERBY,
'longbars' => defaults::LONGBARS,
'progressBarIcons' => 0, // Non-default.
'showpercentage' => defaults::SHOWPERCENTAGE,
'progressTitle' => "",
'activitiesincluded' => defaults::ACTIVITIESINCLUDED,
])),
];
$blockinstance = $generator->create_block('completion_progress', $blockinfo);
$page1 = $generator->create_module('page', [
'course' => $this->course->id,
'completion' => COMPLETION_TRACKING_MANUAL
]);
$page1cm = get_coursemodule_from_id('page', $page1->cmid);
$page2 = $generator->create_module('page', [
'course' => $this->course->id,
'completion' => COMPLETION_TRACKING_MANUAL
]);
$page2cm = get_coursemodule_from_id('page', $page2->cmid);
$completion = new \completion_info($this->course);
// Set student 2 as having completed both pages.
$completion->update_state($page1cm, COMPLETION_COMPLETE, $this->students[2]->id);
$completion->update_state($page2cm, COMPLETION_COMPLETE, $this->students[2]->id);
// Set student 0 as having completed one page.
$completion->update_state($page1cm, COMPLETION_COMPLETE, $this->students[0]->id);
$progress = (new completion_progress($this->course))->for_overview()->for_block_instance($blockinstance);
$table = new \block_completion_progress\table\overview($progress, [], 0, true);
$table->set_sortdata([['sortby' => 'progress', 'sortorder' => SORT_DESC]]);
$table->define_baseurl('/');
ob_start();
$table->out(5, false);
$text = ob_get_clean();
// Student 2 then Student 0 then Student 1.
$student0pos = strpos($text, '<input id="user'.$this->students[0]->id.'" ');
$student1pos = strpos($text, '<input id="user'.$this->students[1]->id.'" ');
$student2pos = strpos($text, '<input id="user'.$this->students[2]->id.'" ');
$this->assertGreaterThan($student2pos, $student0pos, 'Student 2 > Student 0');
$this->assertGreaterThan($student0pos, $student1pos, 'Student 0 > Student 1');
}
}