MDL-51861 enrol: new unit test to verify all conditions and filters
[moodle.git] / enrol / tests / externallib_test.php
blob9f0ee98d5a7a8966d3e915665b0503125654c620
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.
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/>.
17 defined('MOODLE_INTERNAL') || die();
19 global $CFG;
21 require_once($CFG->dirroot . '/webservice/tests/helpers.php');
22 require_once($CFG->dirroot . '/enrol/externallib.php');
24 /**
25 * Enrol external PHPunit tests
27 * @package core_enrol
28 * @category external
29 * @copyright 2012 Jerome Mouneyrac
30 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
31 * @since Moodle 2.4
33 class core_enrol_externallib_testcase extends externallib_advanced_testcase {
35 /**
36 * dataProvider for test_get_enrolled_users_visibility().
38 public function get_enrolled_users_visibility_provider() {
39 return array(
40 'Course without groups, default behavior (not filtering by cap, group, active)' =>
41 array(
42 'settings' => array(
43 'coursegroupmode' => NOGROUPS,
44 'withcapability' => null,
45 'groupid' => null,
46 'onlyactive' => false,
47 'allowedcaps' => array(),
49 'results' => array( // Everybody can view everybody.
50 'user0' => array('canview' => array('user0', 'user1', 'user2', 'user2su', 'user31', 'user32', 'userall')),
51 'user1' => array('canview' => array('user0', 'user1', 'user2', 'user2su', 'user31', 'user32', 'userall')),
52 'user2' => array('canview' => array('user0', 'user1', 'user2', 'user2su', 'user31', 'user32', 'userall')),
53 'user31' => array('canview' => array('user0', 'user1', 'user2', 'user2su', 'user31', 'user32', 'userall')),
54 'userall' => array('canview' => array('user0', 'user1', 'user2', 'user2su', 'user31', 'user32', 'userall')),
58 'Course with visible groups, default behavior (not filtering by cap, group, active)' =>
59 array(
60 'settings' => array(
61 'coursegroupmode' => VISIBLEGROUPS,
62 'withcapability' => null,
63 'groupid' => null,
64 'onlyactive' => false,
65 'allowedcaps' => array(),
67 'results' => array( // Everybody can view everybody.
68 'user0' => array('canview' => array('user0', 'user1', 'user2', 'user2su', 'user31', 'user32', 'userall')),
69 'user1' => array('canview' => array('user0', 'user1', 'user2', 'user2su', 'user31', 'user32', 'userall')),
70 'user2' => array('canview' => array('user0', 'user1', 'user2', 'user2su', 'user31', 'user32', 'userall')),
71 'user31' => array('canview' => array('user0', 'user1', 'user2', 'user2su', 'user31', 'user32', 'userall')),
72 'userall' => array('canview' => array('user0', 'user1', 'user2', 'user2su', 'user31', 'user32', 'userall')),
76 'Course with separate groups, default behavior (not filtering by cap, group, active)' =>
77 array(
78 'settings' => array(
79 'coursegroupmode' => SEPARATEGROUPS,
80 'withcapability' => null,
81 'groupid' => null,
82 'onlyactive' => false,
83 'allowedcaps' => array(),
85 'results' => array( // Only users from own groups are visible.
86 'user0' => array('canview' => array()), // Poor guy, cannot see anybody, himself included.
87 'user1' => array('canview' => array('user1', 'userall')),
88 'user2' => array('canview' => array('user2', 'user2su', 'userall')),
89 'user31' => array('canview' => array('user31', 'user32', 'userall')),
90 'userall' => array('canview' => array('user1', 'user2', 'user2su', 'user31', 'user32', 'userall')),
94 'Course with separate groups, default behavior (not filtering but having moodle/site:accessallgroups)' =>
95 array(
96 'settings' => array(
97 'coursegroupmode' => VISIBLEGROUPS,
98 'withcapability' => null,
99 'groupid' => null,
100 'onlyactive' => false,
101 'allowedcaps' => array('moodle/site:accessallgroups'),
103 'results' => array( // Everybody can view everybody.
104 'user0' => array('canview' => array('user0', 'user1', 'user2', 'user2su', 'user31', 'user32', 'userall')),
105 'user1' => array('canview' => array('user0', 'user1', 'user2', 'user2su', 'user31', 'user32', 'userall')),
106 'user2' => array('canview' => array('user0', 'user1', 'user2', 'user2su', 'user31', 'user32', 'userall')),
107 'user31' => array('canview' => array('user0', 'user1', 'user2', 'user2su', 'user31', 'user32', 'userall')),
108 'userall' => array('canview' => array('user0', 'user1', 'user2', 'user2su', 'user31', 'user32', 'userall')),
112 'Course with separate groups, filtering onlyactive (missing moodle/course:enrolreview)' =>
113 array(
114 'settings' => array(
115 'coursegroupmode' => SEPARATEGROUPS,
116 'withcapability' => null,
117 'groupid' => null,
118 'onlyactive' => true,
119 'allowedcaps' => array(),
121 'results' => array( // returns exception, cannot view anybody without the cap.
122 'user2' => array('exception' => array(
123 'type' => 'required_capability_exception',
124 'message' => 'Review course enrolments')),
125 'userall' => array('exception' => array(
126 'type' => 'required_capability_exception',
127 'message' => 'Review course enrolments')),
131 'Course with separate groups, filtering onlyactive (having moodle/course:enrolreview)' =>
132 array(
133 'settings' => array(
134 'coursegroupmode' => SEPARATEGROUPS,
135 'withcapability' => null,
136 'groupid' => null,
137 'onlyactive' => true,
138 'allowedcaps' => array('moodle/course:enrolreview'),
140 'results' => array( // Suspended are not returned.
141 'user2' => array('canview' => array('user2', 'userall')),
142 'user31' => array('canview' => array('user31', 'user32', 'userall')),
143 'userall' => array('canview' => array('user1', 'user2', 'user31', 'user32', 'userall')),
147 'Course with separate groups, filtering by groupid (not having moodle/site:accessallgroups)' =>
148 array(
149 'settings' => array(
150 'coursegroupmode' => SEPARATEGROUPS,
151 'withcapability' => null,
152 'groupid' => 'group2',
153 'onlyactive' => false,
154 'allowedcaps' => array(),
156 'results' => array( // Only group 2 members and only for members. Exception for non-members.
157 'user0' => array('exception' => array(
158 'type' => 'required_capability_exception',
159 'message' => 'Access all groups')),
160 'user1' => array('exception' => array(
161 'type' => 'required_capability_exception',
162 'message' => 'Access all groups')),
163 'user2' => array('canview' => array('user2', 'user2su', 'userall')),
164 'userall' => array('canview' => array('user2', 'user2su', 'userall')),
168 'Course with separate groups, filtering by groupid (having moodle/site:accessallgroups)' =>
169 array(
170 'settings' => array(
171 'coursegroupmode' => SEPARATEGROUPS,
172 'withcapability' => null,
173 'groupid' => 'group2',
174 'onlyactive' => false,
175 'allowedcaps' => array('moodle/site:accessallgroups'),
177 'results' => array( // All users with 'moodle/site:accessallgroups' can view group 2
178 'user0' => array('canview' => array('user2', 'user2su', 'userall')),
179 'user1' => array('canview' => array('user2', 'user2su', 'userall')),
180 'user2' => array('canview' => array('user2', 'user2su', 'userall')),
181 'userall' => array('canview' => array('user2', 'user2su', 'userall')),
185 'Course with separate groups, filtering by withcapability (not having moodle/role:review)' =>
186 array(
187 'settings' => array(
188 'coursegroupmode' => SEPARATEGROUPS,
189 'withcapability' => 'moodle/course:bulkmessaging',
190 'groupid' => null,
191 'onlyactive' => false,
192 'allowedcaps' => array(),
194 'results' => array( // No user has 'moodle/role:review' so exception.
195 'user0' => array('exception' => array(
196 'type' => 'required_capability_exception',
197 'message' => 'Review permissions for others')),
198 'user1' => array('exception' => array(
199 'type' => 'required_capability_exception',
200 'message' => 'Review permissions for others')),
201 'user2' => array('exception' => array(
202 'type' => 'required_capability_exception',
203 'message' => 'Review permissions for others')),
204 'userall' => array('exception' => array(
205 'type' => 'required_capability_exception',
206 'message' => 'Review permissions for others')),
210 'Course with separate groups, filtering by withcapability (having moodle/role:review)' =>
211 array(
212 'settings' => array(
213 'coursegroupmode' => SEPARATEGROUPS,
214 'withcapability' => 'moodle/course:bulkmessaging',
215 'groupid' => null,
216 'onlyactive' => false,
217 'allowedcaps' => array('moodle/role:review'),
219 'results' => array( // No user has withcapability, but all have 'moodle/role:review'. Empties.
220 'user0' => array('canview' => array()),
221 'user1' => array('canview' => array()),
222 'user2' => array('canview' => array()),
223 'userall' => array('canview' => array()),
227 'Course with separate groups, filtering by withcapability (having moodle/role:review)' =>
228 array(
229 'settings' => array(
230 'coursegroupmode' => SEPARATEGROUPS,
231 'withcapability' => 'moodle/course:bulkmessaging',
232 'groupid' => null,
233 'onlyactive' => false,
234 'allowedcaps' => array('moodle/role:review', 'moodle/course:bulkmessaging'),
236 'results' => array( // Users (previous) have withcapability, and all have 'moodle/role:review'.
237 'user0' => array('canview' => array()),
238 'user1' => array('canview' => array('user1')),
239 'user2' => array('canview' => array('user2')),
240 'userall' => array('canview' => array('user1', 'user2', 'userall')),
248 * Verify get_enrolled_users() returned users are the expected in every situation.
250 * @dataProvider get_enrolled_users_visibility_provider
252 public function test_get_enrolled_users_visibility($settings, $results) {
254 global $USER;
256 $this->resetAfterTest();
258 // Create the course and the users.
259 $course = $this->getDataGenerator()->create_course(array('groupmode' => $settings['coursegroupmode']));
260 $coursecontext = context_course::instance($course->id);
261 $user0 = $this->getDataGenerator()->create_user(array('username' => 'user0')); // A user without group.
262 $user1 = $this->getDataGenerator()->create_user(array('username' => 'user1')); // User for group 1.
263 $user2 = $this->getDataGenerator()->create_user(array('username' => 'user2')); // Two users for group 2.
264 $user2su = $this->getDataGenerator()->create_user(array('username' => 'user2su')); // (one suspended).
265 $user31 = $this->getDataGenerator()->create_user(array('username' => 'user31')); // Two users for group 3.
266 $user32 = $this->getDataGenerator()->create_user(array('username' => 'user32')); // (both enabled).
267 $userall = $this->getDataGenerator()->create_user(array('username' => 'userall')); // A user in all groups.
269 // Create utility array of created users, to produce better assertion messages.
270 $createdusers = array();
271 foreach (array($user0, $user1, $user2, $user2su, $user31, $user32, $userall) as $createduser) {
272 $createdusers[$createduser->id] = $createduser->username;
275 // Enrol the users in the course.
276 $this->getDataGenerator()->enrol_user($user0->id, $course->id);
277 $this->getDataGenerator()->enrol_user($user1->id, $course->id);
278 $this->getDataGenerator()->enrol_user($user2->id, $course->id);
279 $this->getDataGenerator()->enrol_user($user2su->id, $course->id, null, 'manual', 0, 0, ENROL_USER_SUSPENDED);
280 $this->getDataGenerator()->enrol_user($user31->id, $course->id);
281 $this->getDataGenerator()->enrol_user($user32->id, $course->id);
282 $this->getDataGenerator()->enrol_user($userall->id, $course->id);
284 // Create 3 groups.
285 $group1 = $this->getDataGenerator()->create_group(array('courseid' => $course->id));
286 $group2 = $this->getDataGenerator()->create_group(array('courseid' => $course->id));
287 $group3 = $this->getDataGenerator()->create_group(array('courseid' => $course->id));
289 // Add the users to the groups.
290 $this->getDataGenerator()->create_group_member(array('groupid' => $group1->id, 'userid' => $user1->id));
291 $this->getDataGenerator()->create_group_member(array('groupid' => $group2->id, 'userid' => $user2->id));
292 $this->getDataGenerator()->create_group_member(array('groupid' => $group2->id, 'userid' => $user2su->id));
293 $this->getDataGenerator()->create_group_member(array('groupid' => $group3->id, 'userid' => $user31->id));
294 $this->getDataGenerator()->create_group_member(array('groupid' => $group3->id, 'userid' => $user32->id));
295 $this->getDataGenerator()->create_group_member(array('groupid' => $group1->id, 'userid' => $userall->id));
296 $this->getDataGenerator()->create_group_member(array('groupid' => $group2->id, 'userid' => $userall->id));
297 $this->getDataGenerator()->create_group_member(array('groupid' => $group3->id, 'userid' => $userall->id));
299 // Create a role to add the allowedcaps. Users will have this role assigned.
300 $roleid = $this->getDataGenerator()->create_role();
301 // Allow the specified capabilities.
302 if (!empty($settings['allowedcaps'])) {
303 foreach ($settings['allowedcaps'] as $capability) {
304 assign_capability($capability, CAP_ALLOW, $roleid, $coursecontext);
308 // For each of the users, configure everything, perform the call, and assert results.
309 foreach ($results as $user => $expectations) {
310 // Convert canview expectations into a nice array of ids for easier handling.
311 $canview = array();
312 $exception = null;
313 // Analyse the expectations.
314 if (isset($expectations['canview'])) {
315 foreach ($expectations['canview'] as $canviewuser) {
316 $canview[] = $createdusers[${$canviewuser}->id];
318 } else if (isset($expectations['exception'])) {
319 $exception = $expectations['exception'];
320 $this->setExpectedException($exception['type'], $exception['message']);
321 } else {
322 // Failed, only canview and exception are supported.
323 $this->markTestIncomplete('Incomplete, only canview and exception are supported');
325 // Switch to the user and assign the role.
326 $this->setUser(${$user});
327 role_assign($roleid, $USER->id, $coursecontext);
329 // Convert groupid to proper id.
330 $groupid = 0;
331 if (isset($settings['groupid'])) {
332 $groupid = ${$settings['groupid']}->id;
335 // Call to the function.
336 $options = array(
337 array('name' => 'withcapability', 'value' => $settings['withcapability']),
338 array('name' => 'groupid', 'value' => $groupid),
339 array('name' => 'onlyactive', 'value' => $settings['onlyactive']),
340 array('name' => 'userfields', 'value' => 'id')
342 $enrolledusers = core_enrol_external::get_enrolled_users($course->id, $options);
344 // We are only interested in ids to check visibility.
345 $viewed = array();
346 // Verify the user canview the expected users.
347 foreach ($enrolledusers as $enrolleduser) {
348 $viewed[] = $createdusers[$enrolleduser['id']];
350 // Verify viewed matches canview expectation (using canonicalize to ignore ordering).
351 $this->assertEquals($canview, $viewed, "Problem checking visible users for '{$createdusers[$USER->id]}'", 0, 1, true);
356 * Test get_enrolled_users
358 public function test_get_enrolled_users() {
359 global $USER;
361 $this->resetAfterTest(true);
363 $course = self::getDataGenerator()->create_course();
364 $user1 = self::getDataGenerator()->create_user();
365 $user2 = self::getDataGenerator()->create_user();
366 $user3 = self::getDataGenerator()->create_user();
367 $this->setUser($user3);
369 // Set the required capabilities by the external function.
370 $context = context_course::instance($course->id);
371 $roleid = $this->assignUserCapability('moodle/course:viewparticipants', $context->id);
372 $this->assignUserCapability('moodle/user:viewdetails', $context->id, $roleid);
374 // Enrol the users in the course.
375 $this->getDataGenerator()->enrol_user($user1->id, $course->id, $roleid, 'manual');
376 $this->getDataGenerator()->enrol_user($user2->id, $course->id, $roleid, 'manual');
377 $this->getDataGenerator()->enrol_user($user3->id, $course->id, $roleid, 'manual');
379 // Call the external function.
380 $enrolledusers = core_enrol_external::get_enrolled_users($course->id);
382 // We need to execute the return values cleaning process to simulate the web service server.
383 $enrolledusers = external_api::clean_returnvalue(core_enrol_external::get_enrolled_users_returns(), $enrolledusers);
385 // Check the result set.
386 $this->assertEquals(3, count($enrolledusers));
387 $this->assertArrayHasKey('email', $enrolledusers[0]);
389 // Call the function with some parameters set.
390 $enrolledusers = core_enrol_external::get_enrolled_users($course->id, array(
391 array('name' => 'limitfrom', 'value' => 2),
392 array('name' => 'limitnumber', 'value' => 1),
393 array('name' => 'userfields', 'value' => 'id')
396 // We need to execute the return values cleaning process to simulate the web service server.
397 $enrolledusers = external_api::clean_returnvalue(core_enrol_external::get_enrolled_users_returns(), $enrolledusers);
399 // Check the result set, we should only get the 3rd result, which is $user3.
400 $this->assertCount(1, $enrolledusers);
401 $this->assertEquals($user3->id, $enrolledusers[0]['id']);
402 $this->assertArrayHasKey('id', $enrolledusers[0]);
403 $this->assertArrayNotHasKey('email', $enrolledusers[0]);
405 // Call without required capability.
406 $this->unassignUserCapability('moodle/course:viewparticipants', $context->id, $roleid);
407 $this->setExpectedException('moodle_exception');
408 $categories = core_enrol_external::get_enrolled_users($course->id);
412 * Test get_users_courses
414 public function test_get_users_courses() {
415 global $USER;
417 $this->resetAfterTest(true);
419 $coursedata1 = array(
420 'summary' => 'Lightwork Course 1 description',
421 'summaryformat' => FORMAT_MOODLE,
422 'lang' => 'en',
423 'enablecompletion' => true,
424 'showgrades' => true
427 $course1 = self::getDataGenerator()->create_course($coursedata1);
428 $course2 = self::getDataGenerator()->create_course();
429 $courses = array($course1, $course2);
431 // Enrol $USER in the courses.
432 // We use the manual plugin.
433 $roleid = null;
434 $contexts = array();
435 foreach ($courses as $course) {
436 $contexts[$course->id] = context_course::instance($course->id);
437 $roleid = $this->assignUserCapability('moodle/course:viewparticipants',
438 $contexts[$course->id]->id, $roleid);
440 $this->getDataGenerator()->enrol_user($USER->id, $course->id, $roleid, 'manual');
443 // Call the external function.
444 $enrolledincourses = core_enrol_external::get_users_courses($USER->id);
446 // We need to execute the return values cleaning process to simulate the web service server.
447 $enrolledincourses = external_api::clean_returnvalue(core_enrol_external::get_users_courses_returns(), $enrolledincourses);
449 // Check we retrieve the good total number of enrolled users.
450 $this->assertEquals(2, count($enrolledincourses));
452 // We need to format summary and summaryformat before to compare them with those values returned by the webservice.
453 list($course1->summary, $course1->summaryformat) =
454 external_format_text($course1->summary, $course1->summaryformat, $contexts[$course1->id]->id, 'course', 'summary', 0);
456 // Check there are no differences between $course1 properties and course values returned by the webservice
457 // only for those fields listed in the $coursedata1 array.
458 foreach ($enrolledincourses as $courseenrol) {
459 if ($courseenrol['id'] == $course1->id) {
460 foreach ($coursedata1 as $fieldname => $value) {
461 $this->assertEquals($courseenrol[$fieldname], $course1->$fieldname);
468 * Test get_enrolled_users_with_capability
470 public function test_get_enrolled_users_with_capability () {
471 global $DB, $USER;
473 $this->resetAfterTest(true);
475 $user1 = $this->getDataGenerator()->create_user();
477 $coursedata['idnumber'] = 'idnumbercourse1';
478 $coursedata['fullname'] = 'Lightwork Course 1';
479 $coursedata['summary'] = 'Lightwork Course 1 description';
480 $coursedata['summaryformat'] = FORMAT_MOODLE;
481 $course1 = self::getDataGenerator()->create_course($coursedata);
483 // Create a manual enrolment record.
484 $manual_enrol_data['enrol'] = 'manual';
485 $manual_enrol_data['status'] = 0;
486 $manual_enrol_data['courseid'] = $course1->id;
487 $enrolid = $DB->insert_record('enrol', $manual_enrol_data);
489 // Create the users and give them capabilities in the course context.
490 $context = context_course::instance($course1->id);
491 $roleid = $this->assignUserCapability('moodle/course:viewparticipants', $context->id, 3);
493 // Create 2 students.
494 $student1 = self::getDataGenerator()->create_user();
495 $student2 = self::getDataGenerator()->create_user();
497 // Give the capability to student2.
498 assign_capability('moodle/course:viewparticipants', CAP_ALLOW, 3, $context->id);
499 role_assign(3, $student2->id, $context->id);
500 accesslib_clear_all_caches_for_unit_testing();
502 // Enrol both the user and the students in the course.
503 $user_enrolment_data['status'] = 0;
504 $user_enrolment_data['enrolid'] = $enrolid;
505 $user_enrolment_data['userid'] = $USER->id;
506 $DB->insert_record('user_enrolments', $user_enrolment_data);
508 $user_enrolment_data['status'] = 0;
509 $user_enrolment_data['enrolid'] = $enrolid;
510 $user_enrolment_data['userid'] = $student1->id;
511 $DB->insert_record('user_enrolments', $user_enrolment_data);
513 $user_enrolment_data['status'] = 0;
514 $user_enrolment_data['enrolid'] = $enrolid;
515 $user_enrolment_data['userid'] = $student2->id;
516 $DB->insert_record('user_enrolments', $user_enrolment_data);
518 $params = array("coursecapabilities" => array('courseid' => $course1->id,
519 'capabilities' => array('moodle/course:viewparticipants')));
520 $options = array();
521 $result = core_enrol_external::get_enrolled_users_with_capability($params, $options);
523 // We need to execute the return values cleaning process to simulate the web service server.
524 $result = external_api::clean_returnvalue(core_enrol_external::get_enrolled_users_with_capability_returns(), $result);
526 // Check an array containing the expected user for the course capability is returned.
527 $expecteduserlist = $result[0];
528 $this->assertEquals($course1->id, $expecteduserlist['courseid']);
529 $this->assertEquals('moodle/course:viewparticipants', $expecteduserlist['capability']);
530 $this->assertEquals(2, count($expecteduserlist['users']));
532 // Now doing the query again with options.
533 $params = array(
534 "coursecapabilities" => array(
535 'courseid' => $course1->id,
536 'capabilities' => array('moodle/course:viewparticipants')
539 $options = array(
540 array('name' => 'limitfrom', 'value' => 1),
541 array('name' => 'limitnumber', 'value' => 1),
542 array('name' => 'userfields', 'value' => 'id')
545 $result = core_enrol_external::get_enrolled_users_with_capability($params, $options);
547 // We need to execute the return values cleaning process to simulate the web service server.
548 $result = external_api::clean_returnvalue(core_enrol_external::get_enrolled_users_with_capability_returns(), $result);
550 // Check an array containing the expected user for the course capability is returned.
551 $expecteduserlist = $result[0]['users'];
552 $expecteduser = reset($expecteduserlist);
553 $this->assertEquals(1, count($expecteduserlist));
554 $this->assertEquals($student2->id, $expecteduser['id']);
558 * Test get_course_enrolment_methods
560 public function test_get_course_enrolment_methods() {
561 global $DB;
563 $this->resetAfterTest(true);
565 // Get enrolment plugins.
566 $selfplugin = enrol_get_plugin('self');
567 $this->assertNotEmpty($selfplugin);
568 $manualplugin = enrol_get_plugin('manual');
569 $this->assertNotEmpty($manualplugin);
571 $studentrole = $DB->get_record('role', array('shortname'=>'student'));
572 $this->assertNotEmpty($studentrole);
574 $course1 = self::getDataGenerator()->create_course();
575 $course2 = self::getDataGenerator()->create_course();
577 // Add enrolment methods for course.
578 $instanceid1 = $selfplugin->add_instance($course1, array('status' => ENROL_INSTANCE_ENABLED,
579 'name' => 'Test instance 1',
580 'customint6' => 1,
581 'roleid' => $studentrole->id));
582 $instanceid2 = $selfplugin->add_instance($course1, array('status' => ENROL_INSTANCE_DISABLED,
583 'name' => 'Test instance 2',
584 'roleid' => $studentrole->id));
586 $instanceid3 = $manualplugin->add_instance($course1, array('status' => ENROL_INSTANCE_ENABLED,
587 'name' => 'Test instance 3'));
589 $enrolmentmethods = $DB->get_records('enrol', array('courseid' => $course1->id, 'status' => ENROL_INSTANCE_ENABLED));
590 $this->assertCount(2, $enrolmentmethods);
592 // Check if information is returned.
593 $enrolmentmethods = core_enrol_external::get_course_enrolment_methods($course1->id);
594 $enrolmentmethods = external_api::clean_returnvalue(core_enrol_external::get_course_enrolment_methods_returns(),
595 $enrolmentmethods);
596 // Enrolment information is currently returned by self enrolment plugin, so count == 1.
597 // This should be changed as we implement get_enrol_info() for other enrolment plugins.
598 $this->assertCount(1, $enrolmentmethods);
600 $enrolmentmethod = $enrolmentmethods[0];
601 $this->assertEquals($course1->id, $enrolmentmethod['courseid']);
602 $this->assertEquals('self', $enrolmentmethod['type']);
603 $this->assertTrue($enrolmentmethod['status']);
604 $this->assertFalse(isset($enrolmentmethod['wsfunction']));
606 $instanceid4 = $selfplugin->add_instance($course2, array('status' => ENROL_INSTANCE_ENABLED,
607 'name' => 'Test instance 4',
608 'roleid' => $studentrole->id,
609 'customint6' => 1,
610 'password' => 'test'));
611 $enrolmentmethods = core_enrol_external::get_course_enrolment_methods($course2->id);
612 $enrolmentmethods = external_api::clean_returnvalue(core_enrol_external::get_course_enrolment_methods_returns(),
613 $enrolmentmethods);
614 $this->assertCount(1, $enrolmentmethods);
616 $enrolmentmethod = $enrolmentmethods[0];
617 $this->assertEquals($course2->id, $enrolmentmethod['courseid']);
618 $this->assertEquals('self', $enrolmentmethod['type']);
619 $this->assertTrue($enrolmentmethod['status']);
620 $this->assertEquals('enrol_self_get_instance_info', $enrolmentmethod['wsfunction']);