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/>.
/**
* Unit tests for the coursecompleted condition.
*
* @package availability_coursecompleted
* @copyright 2017 iplusacademy (www.iplusacademy.org)
* @author Renaat Debleu <info@eWallah.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace availability_coursecompleted;
use availability_coursecompleted\{condition, frontend};
use completion_info;
use core_availability\{tree, info_module, capability_checker};
use core_completion;
/**
* Unit tests for the coursecompleted condition.
*
* @package availability_coursecompleted
* @copyright 2017 iplusacademy (www.iplusacademy.org)
* @author Renaat Debleu <info@eWallah.net>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @coversDefaultClass \availability_coursecompleted
*/
final class advanced_test extends \advanced_testcase {
/** @var stdClass course. */
private $course;
/** @var stdClass cm. */
private $cm;
/** @var int userid. */
private $userid;
/** @var int compid. */
private $compid;
/** @var int teacherid. */
private $teacherid;
/**
* Create course and page.
*/
public function setUp(): void {
global $CFG, $DB;
require_once($CFG->dirroot . '/completion/criteria/completion_criteria.php');
require_once($CFG->dirroot . '/completion/criteria/completion_criteria_activity.php');
require_once($CFG->dirroot . '/availability/tests/fixtures/mock_info.php');
require_once($CFG->dirroot . '/availability/tests/fixtures/mock_info_module.php');
require_once($CFG->libdir . '/completionlib.php');
$this->resetAfterTest();
$this->setAdminUser();
$CFG->enablecompletion = true;
$CFG->enableavailability = true;
set_config('enableavailability', true);
$dg = $this->getDataGenerator();
$this->course = $dg->create_course(['enablecompletion' => 1]);
$this->userid = $dg->create_user()->id;
$this->compid = $dg->create_user()->id;
$this->teacherid = $dg->create_user()->id;
$role = $DB->get_field('role', 'id', ['shortname' => 'student']);
$dg->enrol_user($this->userid, $this->course->id, $role);
$dg->enrol_user($this->compid, $this->course->id, $role);
$role = $DB->get_field('role', 'id', ['shortname' => 'editingteacher']);
$dg->enrol_user($this->teacherid, $this->course->id, $role);
$feedback = $dg->get_plugin_generator('mod_feedback')->create_instance(['course' => $this->course]);
$this->cm = get_fast_modinfo($this->course)->get_cm($feedback->cmid);
$ccompletion = new \completion_completion(['course' => $this->course->id, 'userid' => $this->compid]);
$ccompletion->mark_complete();
rebuild_course_cache($this->course->id, true);
}
/**
* Tests constructing and using coursecompleted condition as part of tree.
* @covers \availability_coursecompleted\condition
*/
public function test_tree(): void {
$info1 = new \core_availability\mock_info($this->course, $this->userid);
$info2 = new \core_availability\mock_info($this->course, $this->compid);
$structure1 = (object)['op' => '|', 'show' => true, 'c' => [(object)['type' => 'coursecompleted', 'id' => '1']]];
$structure2 = (object)['op' => '|', 'show' => true, 'c' => [(object)['type' => 'coursecompleted', 'id' => '0']]];
$tree1 = new tree($structure1);
$tree2 = new tree($structure2);
$this->setuser($this->compid);
$this->assertTrue($tree1->check_available(false, $info2, true, $this->compid)->is_available());
$this->assertFalse($tree2->check_available(false, $info2, true, $this->compid)->is_available());
$this->setuser($this->userid);
$this->assertFalse($tree1->check_available(false, $info1, true, $this->userid)->is_available());
$this->assertTrue($tree2->check_available(false, $info1, true, $this->userid)->is_available());
}
/**
* Tests the get_description and get_standalone_description functions.
* @covers \availability_coursecompleted\condition
* @covers \availability_coursecompleted\frontend
*/
public function test_get_description(): void {
$nau = 'Not available unless: ';
$sections = get_fast_modinfo($this->course)->get_section_info_all();
$frontend = new frontend();
$name = 'availability_coursecompleted\frontend';
$this->assertFalse(\phpunit_util::call_internal_method($frontend, 'allow_add', [$this->course], $name));
$data = (object) ['id' => $this->course->id, 'criteria_activity' => [$this->cm->id => 1]];
$criterion = new \completion_criteria_activity();
$criterion->update_config($data);
$this->assertTrue(\phpunit_util::call_internal_method($frontend, 'allow_add', [$this->course], $name));
$this->assertTrue(\phpunit_util::call_internal_method($frontend, 'allow_add', [$this->course, null, $sections[0]], $name));
$this->assertTrue(\phpunit_util::call_internal_method($frontend, 'allow_add', [$this->course, null, $sections[1]], $name));
$info = new \core_availability\mock_info_module($this->userid, $this->cm);
$completed = new condition((object)['type' => 'coursecompleted', 'id' => '1']);
$information = $completed->get_description(true, false, $info);
$this->assertEquals($information, get_string('getdescription', 'availability_coursecompleted'));
$information = $completed->get_description(true, true, $info);
$this->assertEquals($information, get_string('getdescriptionnot', 'availability_coursecompleted'));
$information = $completed->get_standalone_description(true, false, $info);
$this->assertEquals($information, $nau . get_string('getdescription', 'availability_coursecompleted'));
$information = $completed->get_standalone_description(true, true, $info);
$this->assertEquals($information, $nau . get_string('getdescriptionnot', 'availability_coursecompleted'));
$completed = new condition((object)['type' => 'coursecompleted', 'id' => '0']);
$information = $completed->get_description(true, false, $info);
$this->assertEquals($information, get_string('getdescriptionnot', 'availability_coursecompleted'));
$information = $completed->get_description(true, true, $info);
$this->assertEquals($information, get_string('getdescription', 'availability_coursecompleted'));
$information = $completed->get_standalone_description(true, false, $info);
$this->assertEquals($information, $nau . get_string('getdescriptionnot', 'availability_coursecompleted'));
$information = $completed->get_standalone_description(true, true, $info);
$this->assertEquals($information, $nau . get_string('getdescription', 'availability_coursecompleted'));
}
/**
* Tests is aplied to user lists.
* @covers \availability_coursecompleted\condition
*/
public function test_is_applied_to_user_lists(): void {
$info = new \core_availability\mock_info_module($this->userid, $this->cm);
$cond = new condition((object)['type' => 'coursecompleted', 'id' => '1']);
$this->assertTrue($cond->is_applied_to_user_lists());
$checker = new \core_availability\capability_checker(\context_course::instance($this->course->id));
$arr = [
$this->userid => \core_user::get_user($this->userid),
$this->compid => \core_user::get_user($this->compid),
$this->teacherid => \core_user::get_user($this->teacherid), ];
$result = $cond->filter_user_list([], true, $info, $checker);
$this->assertEquals([], $result);
$result = $cond->filter_user_list($arr, true, $info, $checker);
$this->assertArrayHasKey($this->userid, $result);
$this->assertArrayNotHasKey($this->compid, $result);
$this->assertArrayHasKey($this->teacherid, $result);
$result = $cond->filter_user_list($arr, false, $info, $checker);
$this->assertArrayHasKey($this->teacherid, $result);
$this->assertArrayHasKey($this->compid, $result);
$this->assertArrayNotHasKey($this->userid, $result);
}
/**
* Tests a page before and after completion.
* @covers \availability_coursecompleted\condition
* @covers \availability_coursecompleted\frontend
*/
public function test_page(): void {
$info = new info_module($this->cm);
$cond = new condition((object)['type' => 'coursecompleted', 'id' => '1']);
$this->assertFalse($cond->is_available(false, $info, true, $this->userid));
$this->assertFalse($cond->is_available(false, $info, false, $this->userid));
$this->assertTrue($cond->is_available(true, $info, false, $this->userid));
$this->assertTrue($cond->is_available(true, $info, true, $this->userid));
$ccompletion = new \completion_completion(['course' => $this->course->id, 'userid' => $this->userid]);
$ccompletion->mark_complete();
$this->assertTrue($cond->is_available(false, $info, true, $this->userid));
$this->assertTrue($cond->is_available(false, $info, false, $this->userid));
$this->assertFalse($cond->is_available(true, $info, false, $this->userid));
$this->assertFalse($cond->is_available(true, $info, true, $this->userid));
// No id.
$cond = new condition((object)['type' => 'coursecompleted']);
$this->assertFalse($cond->is_available(false, $info, false, $this->userid));
$this->assertFalse($cond->is_available_for_all());
$this->assertFalse($cond->update_dependency_id(null, 1, 2));
$this->assertEquals($cond->__toString(), '{coursecompleted:False}');
$this->assertEquals(
$cond->get_standalone_description(true, true, $info),
'Not available unless: You completed this course.'
);
}
}