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/>./*** coursecompleted enrolment plugin other tests.** @package enrol_coursecompleted* @copyright 2017 eWallah (www.eWallah.net)* @author Renaat Debleu <info@eWallah.net>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later*/namespace enrol_coursecompleted;defined('MOODLE_INTERNAL') || die();global $CFG;require_once($CFG->libdir . '/formslib.php');require_once($CFG->libdir . '/grouplib.php');require_once($CFG->dirroot . '/group/lib.php');/*** coursecompleted enrolment plugin other tests.** @package enrol_coursecompleted* @copyright 2017 eWallah (www.eWallah.net)* @author Renaat Debleu <info@eWallah.net>* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later* @coversDefaultClass \enrol_coursecompleted_plugin*/final class other_test extends \advanced_testcase {/*** Tests initial setup.*/protected function setUp(): void {global $CFG;$CFG->enablecompletion = true;$this->resetAfterTest(true);$enabled = enrol_get_plugins(true);$enabled['coursecompleted'] = true;set_config('enrol_plugins_enabled', implode(',', array_keys($enabled)));}/*** Basic test.* @covers \enrol_coursecompleted_plugin*/public function test_basics(): void {$this->assertTrue(enrol_is_enabled('coursecompleted'));$this->assertEquals(ENROL_EXT_REMOVED_SUSPENDNOROLES, get_config('enrol_coursecompleted', 'expiredaction'));$plugin = enrol_get_plugin('coursecompleted');$this->assertNotEmpty($plugin);$this->assertInstanceOf('\enrol_coursecompleted_plugin', $plugin);}/*** Test other files.* @covers \enrol_coursecompleted_plugin*/public function test_files(): void {global $CFG;include($CFG->dirroot . '/enrol/coursecompleted/db/tasks.php');include($CFG->dirroot . '/enrol/coursecompleted/db/access.php');include($CFG->dirroot . '/enrol/coursecompleted/db/events.php');}/*** Test invalid instance.* @covers \enrol_coursecompleted_plugin*/public function test_invalid_instance(): void {$plugin = enrol_get_plugin('coursecompleted');$tst = new \stdClass();$tst->enrol = 'wrong';$this->expectException('moodle_exception');$this->expectExceptionMessage('invalid enrol instance!');$this->assertCount(0, $plugin->get_action_icons($tst));}/*** Test disabled.* @covers \enrol_coursecompleted_plugin* @covers \enrol_coursecompleted\observer*/public function test_disabled(): void {global $CFG;require_once($CFG->libdir . '/completionlib.php');$generator = $this->getDataGenerator();$course1 = $generator->create_course(['enablecompletion' => 1]);$course2 = $generator->create_course(['enablecompletion' => 1]);$plugin = enrol_get_plugin('coursecompleted');$this->setAdminUser();$student1 = $generator->create_and_enrol($course1, 'student')->id;$student2 = $generator->create_and_enrol($course1, 'student')->id;$plugin->add_instance($course1, ['customint1' => $course2->id, 'roleid' => 5, 'enrolstartdate' => time() + 66666666]);$compevent = \core\event\course_completed::create(['objectid' => $course2->id,'relateduserid' => $student1,'context' => \context_course::instance($course2->id),'courseid' => $course2->id,'other' => ['relateduserid' => $student1],]);$observer = new observer();$observer->enroluser($compevent);$plugin->add_instance($course1, ['customint1' => $course2->id, 'roleid' => 5, 'enrolenddate' => time() - 66666666]);$compevent = \core\event\course_completed::create(['objectid' => $course2->id,'relateduserid' => $student2,'context' => \context_course::instance($course2->id),'courseid' => $course2->id,'other' => ['relateduserid' => $student2],]);$observer = new observer();$observer->enroluser($compevent);}/*** Test static enrol from past.* @covers \enrol_coursecompleted_plugin*/public function test_static_past(): void {global $CFG;require_once($CFG->libdir . '/completionlib.php');$generator = $this->getDataGenerator();$course1 = $generator->create_course(['enablecompletion' => 1]);$course2 = $generator->create_course(['enablecompletion' => 1]);$studentid = $generator->create_and_enrol($course1, 'student')->id;$plugin = enrol_get_plugin('coursecompleted');$this->setAdminUser();$ccompletion = new \completion_completion(['course' => $course1->id, 'userid' => $studentid]);$ccompletion->mark_complete(time());$ccompletion = new \completion_completion(['course' => $course2->id, 'userid' => $studentid]);$ccompletion->mark_complete(time());mark_user_dirty($studentid);$plugin->add_instance($course1, ['customint1' => $course2->id, 'roleid' => 5, 'enrolperiod' => 300000]);\enrol_coursecompleted_plugin::enrol_past($course1->id);\enrol_coursecompleted_plugin::enrol_past($course2->id);}/*** Test invalid role.* @covers \enrol_coursecompleted_plugin* @covers \enrol_coursecompleted\observer*/public function test_invalid_role(): void {global $DB;$generator = $this->getDataGenerator();$plugin = enrol_get_plugin('coursecompleted');$course1 = $generator->create_course(['shortname' => 'B1', 'enablecompletion' => 1]);$course2 = $generator->create_course(['shortname' => 'B2', 'enablecompletion' => 1]);$this->setAdminUser();$plugin->add_instance($course1, ['customint1' => $course2->id, 'roleid' => 9999]);$instance = $DB->get_record('enrol', ['courseid' => $course1->id, 'enrol' => 'coursecompleted'], '*', MUST_EXIST);$this->assertCount(2, $plugin->build_course_path($instance));$studentid = $generator->create_and_enrol($course2, 'student')->id;$compevent = \core\event\course_completed::create(['objectid' => $course2->id,'relateduserid' => $studentid,'context' => \context_course::instance($course2->id),'courseid' => $course2->id,'other' => ['relateduserid' => $studentid],]);$observer = new observer();$observer->enroluser($compevent);$this->assertDebuggingCalled('Role does not exist');}/*** Test group member.* @covers \enrol_coursecompleted\observer* @covers \enrol_coursecompleted_plugin*/public function test_groups_child(): void {global $DB;$generator = $this->getDataGenerator();$plugin = enrol_get_plugin('coursecompleted');$course1 = $generator->create_course(['shortname' => 'B1', 'enablecompletion' => 1]);$data = new \stdClass();$data->courseid = $course1->id;$data->idnumber = $course1->id . 'A';$data->name = 'A group';$data->description = '';$data->descriptionformat = FORMAT_HTML;$groupid1 = groups_create_group($data);rebuild_course_cache($course1->id, true);$course2 = $generator->create_course(['shortname' => 'B2', 'enablecompletion' => 1]);$data->courseid = $course2->id;$data->idnumber = $course2->id . 'A';$groupid2 = groups_create_group($data);$studentrole = $DB->get_record('role', ['shortname' => 'student']);$this->setAdminUser();$plugin->add_instance($course1, ['customint1' => $course2->id, 'roleid' => $studentrole->id]);$instance = $DB->get_record('enrol', ['courseid' => $course1->id, 'enrol' => 'coursecompleted'], '*', MUST_EXIST);$this->assertCount(2, $plugin->build_course_path($instance));$studentid = $generator->create_and_enrol($course2)->id;groups_add_member($groupid2, $studentid);rebuild_course_cache($course2->id, true);$compevent = \core\event\course_completed::create(['objectid' => $course2->id,'relateduserid' => $studentid,'context' => \context_course::instance($course2->id),'courseid' => $course2->id,'other' => ['relateduserid' => $studentid],]);$observer = new observer();$observer->enroluser($compevent);$this->assertTrue(groups_is_member($groupid2, $studentid));rebuild_course_cache($course1->id, true);rebuild_course_cache($course2->id, true);$this->assertTrue(groups_is_member($groupid1, $studentid));}/*** Test expiration task.* @covers \enrol_coursecompleted\task\process_expirations*/public function test_task(): void {$task = new \enrol_coursecompleted\task\process_expirations();$this->assertEquals('Course completed enrolment expiry task', $task->get_name());ob_start();$task->execute();$output = ob_get_contents();ob_end_clean();$this->assertStringContainsString('No expired enrol_coursecompleted enrolments detected', $output);}/*** Test adhoc sending of welcome messages.* @covers \enrol_coursecompleted\task\send_welcome*/public function test_adhoc_email_welcome_message(): void {global $DB;$generator = $this->getDataGenerator();$sink = $this->redirectEmails();$plugin = enrol_get_plugin('coursecompleted');$studentid = $generator->create_user()->id;$course = $generator->create_course(['shortname' => 'B0', 'enablecompletion' => 1]);$courseid1 = $generator->create_course(['shortname' => 'B1', 'enablecompletion' => 1])->id;$courseid2 = $generator->create_course(['shortname' => 'B2', 'enablecompletion' => 1])->id;$courseid3 = $generator->create_course(['shortname' => 'B3', 'enablecompletion' => 1])->id;$courseid4 = $generator->create_course(['shortname' => 'B4', 'enablecompletion' => 1])->id;$plugin->add_instance($course, ['customint1' => $courseid1, 'roleid' => 5, 'customint2' => 0]);$i2 = $plugin->add_instance($course, ['customint1' => $courseid2, 'roleid' => 5, 'customint2' => 1]);$i3 = $plugin->add_instance($course, ['customint1' => $courseid3, 'customtext1' => 'boe', 'customint2' => 1]);$i4 = $plugin->add_instance($course,['customint1' => $courseid4, 'customtext1' => '{$a->fullname} <b>boe</b><a>another line</a>', 'customint2' => 1]);$compevent = \core\event\course_completed::create(['objectid' => $courseid1,'relateduserid' => $studentid,'context' => \context_course::instance($courseid1),'courseid' => $courseid1,'other' => ['relateduserid' => $studentid],]);$observer = new observer();$observer->enroluser($compevent);$adhock = new \enrol_coursecompleted\task\send_welcome();$adhock->set_custom_data(['userid' => $studentid, 'enrolid' => $i2, 'courseid' => $course->id, 'completedid' => $courseid2]);$adhock->set_component('enrol_coursecompleted');$adhock->execute();\core\task\manager::queue_adhoc_task($adhock);$adhock->set_custom_data(['userid' => $studentid, 'enrolid' => $i3, 'courseid' => $course->id, 'completedid' => $courseid3]);\core\task\manager::queue_adhoc_task($adhock);$adhock->set_custom_data(['userid' => $studentid, 'enrolid' => $i4, 'courseid' => $course->id, 'completedid' => $courseid4]);\core\task\manager::queue_adhoc_task($adhock);$this->assertCount(3, $DB->get_records('task_adhoc', ['component' => 'enrol_coursecompleted']));\phpunit_util::run_all_adhoc_tasks();$messages = $sink->get_messages();$this->assertCount(4, $messages);$sink->close();foreach ($messages as $message) {$this->assertStringNotContainsString('{a->', $message->header);$this->assertStringNotContainsString('{a->', $message->body);}$this->assertCount(0, $DB->get_records('task_adhoc', ['component' => 'enrol_coursecompleted']));}/*** Test access.* @covers \enrol_coursecompleted_plugin*/public function test_access(): void {global $CFG;$CFG->enablecompletion = true;$this->resetAfterTest(true);$enabled = enrol_get_plugins(true);$enabled['coursecompleted'] = true;set_config('enrol_plugins_enabled', implode(',', array_keys($enabled)));$generator = $this->getDataGenerator();$course = $generator->create_course(['enablecompletion' => 1]);$student = $generator->create_and_enrol($course, 'student');$editor = $generator->create_and_enrol($course, 'editingteacher');$this->setAdminUser();$context = \context_course::instance($course->id);$this->assertTrue(has_capability('enrol/coursecompleted:config', $context));$this->assertTrue(has_capability('enrol/coursecompleted:enrolpast', $context));$this->assertTrue(has_capability('enrol/coursecompleted:manage', $context));$this->assertTrue(has_capability('enrol/coursecompleted:unenrol', $context));$this->assertTrue(has_capability('enrol/coursecompleted:unenrolself', $context));$this->setUser($student);$this->assertFalse(has_capability('enrol/coursecompleted:config', $context));$this->assertFalse(has_capability('enrol/coursecompleted:enrolpast', $context));$this->assertFalse(has_capability('enrol/coursecompleted:manage', $context));$this->assertFalse(has_capability('enrol/coursecompleted:unenrol', $context));$this->assertFalse(has_capability('enrol/coursecompleted:unenrolself', $context));$this->setUser($editor);$this->assertTrue(has_capability('enrol/coursecompleted:config', $context));$this->assertFalse(has_capability('enrol/coursecompleted:enrolpast', $context));$this->assertTrue(has_capability('enrol/coursecompleted:manage', $context));$this->assertTrue(has_capability('enrol/coursecompleted:unenrol', $context));$this->assertFalse(has_capability('enrol/coursecompleted:unenrolself', $context));}}