Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
// This file is part of Moodle - http://moodle.org/
3
//
4
// Moodle is free software: you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation, either version 3 of the License, or
7
// (at your option) any later version.
8
//
9
// Moodle is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
// GNU General Public License for more details.
13
//
14
// You should have received a copy of the GNU General Public License
15
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16
 
17
/**
18
 * Coursecompleted enrolment plugin tests.
19
 *
20
 * @package   enrol_coursecompleted
21
 * @copyright 2017 eWallah (www.eWallah.net)
22
 * @author    Renaat Debleu <info@eWallah.net>
23
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24
 */
25
 
26
namespace enrol_coursecompleted;
27
 
28
/**
29
 * oursecompleted enrolment plugin tests.
30
 *
31
 * @package   enrol_coursecompleted
32
 * @copyright 2017 eWallah (www.eWallah.net)
33
 * @author    Renaat Debleu <info@eWallah.net>
34
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
35
 * @coversDefaultClass \enrol_coursecompleted_plugin
36
 */
37
final class time_enrolled_test extends \advanced_testcase {
38
    /**
39
     * Tests initial setup.
40
     */
41
    protected function setUp(): void {
42
        global $CFG;
43
        require_once($CFG->dirroot . '/enrol/locallib.php');
44
        $CFG->enablecompletion = true;
45
        $this->resetAfterTest(true);
46
        $enabled = enrol_get_plugins(true);
47
        unset($enabled['guest']);
48
        unset($enabled['self']);
49
        $enabled['coursecompleted'] = true;
50
        set_config('enrol_plugins_enabled', implode(',', array_keys($enabled)));
51
    }
52
 
53
    /**
54
     * Test if user is enrolled for a specific time after completing a course.
55
     * @covers \enrol_coursecompleted_plugin
56
     * @covers \enrol_coursecompleted\observer
57
     */
58
    public function test_time_enrolled(): void {
59
        global $DB, $PAGE;
60
        $generator = $this->getDataGenerator();
61
        $course1 = $generator->create_course();
62
        $course2 = $generator->create_course();
63
        $course3 = $generator->create_course(['enablecompletion' => 1]);
64
        $studentrole = $DB->get_field('role', 'id', ['shortname' => 'student']);
65
        $params = ['customint1' => $course3->id, 'roleid' => $studentrole];
66
        $plugin = enrol_get_plugin('coursecompleted');
67
        $id1 = $plugin->add_instance($course1, $params);
68
        $params = ['customint1' => $course3->id, 'roleid' => $studentrole, 'enrolperiod' => 2];
69
        $id2 = $plugin->add_instance($course2, $params);
70
        $params = ['customint1' => $course3->id, 'roleid' => $studentrole, 'enrolstartdate' => 100, 'enrolenddate' => 200];
71
        $plugin->add_instance($course3, $params);
72
        $student = $generator->create_and_enrol($course3, 'student');
73
        $this->assertFalse(is_enrolled(\context_course::instance($course1->id), $student->id));
74
        $this->assertFalse(is_enrolled(\context_course::instance($course2->id), $student->id));
75
        $this->assertTrue(is_enrolled(\context_course::instance($course3->id), $student->id));
76
        mark_user_dirty($student->id);
77
        rebuild_course_cache($course1->id);
78
        rebuild_course_cache($course2->id);
79
        rebuild_course_cache($course3->id);
80
        $PAGE->set_url('/enrol/editinstance.php');
81
        $manager1 = new \course_enrolment_manager($PAGE, $course1);
82
        $this->assertCount(0, $manager1->get_user_enrolments($student->id));
83
        $manager2 = new \course_enrolment_manager($PAGE, $course2);
84
        $this->assertCount(0, $manager2->get_user_enrolments($student->id));
85
        $manager3 = new \course_enrolment_manager($PAGE, $course3);
86
        $this->assertCount(1, $manager3->get_user_enrolments($student->id));
87
        $compevent = \core\event\course_completed::create(
88
            [
89
                'objectid' => $course1->id,
90
                'relateduserid' => $student->id,
91
                'context' => \context_course::instance($course3->id),
92
                'courseid' => $course3->id,
93
                'other' => ['relateduserid' => $student->id],
94
            ]
95
        );
96
        mark_user_dirty($student->id);
97
        $observer = new \enrol_coursecompleted\observer();
98
        $observer->enroluser($compevent);
99
        mark_user_dirty($student->id);
100
        rebuild_course_cache($course1->id);
101
        rebuild_course_cache($course2->id);
102
        mark_user_dirty($student->id);
103
        $this->assertTrue(is_enrolled(\context_course::instance($course1->id), $student->id));
104
        $this->assertTrue(is_enrolled(\context_course::instance($course2->id), $student->id));
105
        $this->assertCount(1, $manager1->get_user_enrolments($student->id));
106
        $ueinstance = $DB->get_record('user_enrolments', ['enrolid' => $id1, 'userid' => $student->id]);
107
        $this->assertEquals(0, $ueinstance->timestart);
108
        $this->assertEquals(0, $ueinstance->timeend);
109
        $ueinstance = $DB->get_record('user_enrolments', ['enrolid' => $id2, 'userid' => $student->id]);
110
        $this->assertEquals(0, $ueinstance->timestart);
111
        $this->assertGreaterThan(time(), $ueinstance->timeend);
112
        sleep(1);
113
        $trace = new \null_progress_trace();
114
        $plugin->sync($trace);
115
        mark_user_dirty($student->id);
116
        $this->assertTrue(is_enrolled(\context_course::instance($course1->id), $student->id, '', true));
117
        $manager1 = new \course_enrolment_manager($PAGE, $course1);
118
        $this->assertCount(1, $manager1->get_user_enrolments($student->id));
119
        $this->assertTrue(is_enrolled(\context_course::instance($course2->id), $student->id));
120
        $manager2 = new \course_enrolment_manager($PAGE, $course2);
121
        $this->assertCount(1, $manager2->get_user_enrolments($student->id));
122
        $plugin->set_config('expiredaction', ENROL_EXT_REMOVED_UNENROL);
123
        sleep(2);
124
        $plugin->sync($trace);
125
        mark_user_dirty($student->id);
126
        $this->assertFalse(is_enrolled(\context_course::instance($course2->id), $student->id));
127
        $manager2 = new \course_enrolment_manager($PAGE, $course2);
128
        $this->assertCount(0, $manager2->get_user_enrolments($student->id));
129
    }
130
 
131
    /**
132
     * Time provider.
133
     */
134
    public static function enroltime_provider(): array {
135
        $plus = time() + 10000;
136
        $minus = time() - 10000;
137
        return [
138
            'Not set' => [[], true],
139
            'Start date later' => [['enrolstartdate' => $plus], false],
140
            'Start date sooner' => [['enrolstartdate' => $minus], true],
141
            'End date later' => [['enrolenddate' => $plus], false],
142
            'End date sooner' => [['enrolenddate' => $minus], true],
143
            'Duration only' => [['enrolenddate' => $minus, 'enrolperiod' => 300], true],
144
        ];
145
    }
146
 
147
    /**
148
     * Test enrol time variation.
149
     *
150
     * @covers \enrol_coursecompleted_plugin
151
     * @dataProvider enroltime_provider
152
     * @param array $input
153
     * @param bool $isenrolled
154
     */
155
    public function test_enroltime_with_provider(array $input, bool $isenrolled): void {
156
        $generator = $this->getDataGenerator();
157
        $course1 = $generator->create_course();
158
        $course2 = $generator->create_course();
159
        $plugin = enrol_get_plugin('coursecompleted');
160
        $student = $generator->create_and_enrol($course1, 'student');
161
        $input = array_merge($input, ['customint1' => $course1->id, 'roleid' => 5]);
162
        $plugin->add_instance($course2, $input);
163
        $compevent = \core\event\course_completed::create(
164
            [
165
                'objectid' => $course2->id,
166
                'relateduserid' => $student->id,
167
                'context' => \context_course::instance($course1->id),
168
                'courseid' => $course1->id,
169
                'other' => ['relateduserid' => $student->id],
170
            ]
171
        );
172
        $observer = new observer();
173
        $observer->enroluser($compevent);
174
        $this->assertEquals($isenrolled, is_enrolled(\context_course::instance($course2->id), $student->id));
175
    }
176
}