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 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;/*** oursecompleted enrolment plugin 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 time_enrolled_test extends \advanced_testcase {/*** Tests initial setup.*/protected function setUp(): void {global $CFG;require_once($CFG->dirroot . '/enrol/locallib.php');$CFG->enablecompletion = true;$this->resetAfterTest(true);$enabled = enrol_get_plugins(true);unset($enabled['guest']);unset($enabled['self']);$enabled['coursecompleted'] = true;set_config('enrol_plugins_enabled', implode(',', array_keys($enabled)));}/*** Test if user is enrolled for a specific time after completing a course.* @covers \enrol_coursecompleted_plugin* @covers \enrol_coursecompleted\observer*/public function test_time_enrolled(): void {global $DB, $PAGE;$generator = $this->getDataGenerator();$course1 = $generator->create_course();$course2 = $generator->create_course();$course3 = $generator->create_course(['enablecompletion' => 1]);$studentrole = $DB->get_field('role', 'id', ['shortname' => 'student']);$params = ['customint1' => $course3->id, 'roleid' => $studentrole];$plugin = enrol_get_plugin('coursecompleted');$id1 = $plugin->add_instance($course1, $params);$params = ['customint1' => $course3->id, 'roleid' => $studentrole, 'enrolperiod' => 2];$id2 = $plugin->add_instance($course2, $params);$params = ['customint1' => $course3->id, 'roleid' => $studentrole, 'enrolstartdate' => 100, 'enrolenddate' => 200];$plugin->add_instance($course3, $params);$student = $generator->create_and_enrol($course3, 'student');$this->assertFalse(is_enrolled(\context_course::instance($course1->id), $student->id));$this->assertFalse(is_enrolled(\context_course::instance($course2->id), $student->id));$this->assertTrue(is_enrolled(\context_course::instance($course3->id), $student->id));mark_user_dirty($student->id);rebuild_course_cache($course1->id);rebuild_course_cache($course2->id);rebuild_course_cache($course3->id);$PAGE->set_url('/enrol/editinstance.php');$manager1 = new \course_enrolment_manager($PAGE, $course1);$this->assertCount(0, $manager1->get_user_enrolments($student->id));$manager2 = new \course_enrolment_manager($PAGE, $course2);$this->assertCount(0, $manager2->get_user_enrolments($student->id));$manager3 = new \course_enrolment_manager($PAGE, $course3);$this->assertCount(1, $manager3->get_user_enrolments($student->id));$compevent = \core\event\course_completed::create(['objectid' => $course1->id,'relateduserid' => $student->id,'context' => \context_course::instance($course3->id),'courseid' => $course3->id,'other' => ['relateduserid' => $student->id],]);mark_user_dirty($student->id);$observer = new \enrol_coursecompleted\observer();$observer->enroluser($compevent);mark_user_dirty($student->id);rebuild_course_cache($course1->id);rebuild_course_cache($course2->id);mark_user_dirty($student->id);$this->assertTrue(is_enrolled(\context_course::instance($course1->id), $student->id));$this->assertTrue(is_enrolled(\context_course::instance($course2->id), $student->id));$this->assertCount(1, $manager1->get_user_enrolments($student->id));$ueinstance = $DB->get_record('user_enrolments', ['enrolid' => $id1, 'userid' => $student->id]);$this->assertEquals(0, $ueinstance->timestart);$this->assertEquals(0, $ueinstance->timeend);$ueinstance = $DB->get_record('user_enrolments', ['enrolid' => $id2, 'userid' => $student->id]);$this->assertEquals(0, $ueinstance->timestart);$this->assertGreaterThan(time(), $ueinstance->timeend);sleep(1);$trace = new \null_progress_trace();$plugin->sync($trace);mark_user_dirty($student->id);$this->assertTrue(is_enrolled(\context_course::instance($course1->id), $student->id, '', true));$manager1 = new \course_enrolment_manager($PAGE, $course1);$this->assertCount(1, $manager1->get_user_enrolments($student->id));$this->assertTrue(is_enrolled(\context_course::instance($course2->id), $student->id));$manager2 = new \course_enrolment_manager($PAGE, $course2);$this->assertCount(1, $manager2->get_user_enrolments($student->id));$plugin->set_config('expiredaction', ENROL_EXT_REMOVED_UNENROL);sleep(2);$plugin->sync($trace);mark_user_dirty($student->id);$this->assertFalse(is_enrolled(\context_course::instance($course2->id), $student->id));$manager2 = new \course_enrolment_manager($PAGE, $course2);$this->assertCount(0, $manager2->get_user_enrolments($student->id));}/*** Time provider.*/public static function enroltime_provider(): array {$plus = time() + 10000;$minus = time() - 10000;return ['Not set' => [[], true],'Start date later' => [['enrolstartdate' => $plus], false],'Start date sooner' => [['enrolstartdate' => $minus], true],'End date later' => [['enrolenddate' => $plus], false],'End date sooner' => [['enrolenddate' => $minus], true],'Duration only' => [['enrolenddate' => $minus, 'enrolperiod' => 300], true],];}/*** Test enrol time variation.** @covers \enrol_coursecompleted_plugin* @dataProvider enroltime_provider* @param array $input* @param bool $isenrolled*/public function test_enroltime_with_provider(array $input, bool $isenrolled): void {$generator = $this->getDataGenerator();$course1 = $generator->create_course();$course2 = $generator->create_course();$plugin = enrol_get_plugin('coursecompleted');$student = $generator->create_and_enrol($course1, 'student');$input = array_merge($input, ['customint1' => $course1->id, 'roleid' => 5]);$plugin->add_instance($course2, $input);$compevent = \core\event\course_completed::create(['objectid' => $course2->id,'relateduserid' => $student->id,'context' => \context_course::instance($course1->id),'courseid' => $course1->id,'other' => ['relateduserid' => $student->id],]);$observer = new observer();$observer->enroluser($compevent);$this->assertEquals($isenrolled, is_enrolled(\context_course::instance($course2->id), $student->id));}}