2 // This file is part of Moodle - http://moodle.org/
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.
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();
21 require_once($CFG->dirroot
. '/webservice/tests/helpers.php');
22 require_once($CFG->dirroot
. '/enrol/externallib.php');
25 * Enrol external PHPunit tests
29 * @copyright 2012 Jerome Mouneyrac
30 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
33 class core_enrol_externallib_testcase
extends externallib_advanced_testcase
{
36 * dataProvider for test_get_enrolled_users_visibility().
38 public function get_enrolled_users_visibility_provider() {
40 'Course without groups, default behavior (not filtering by cap, group, active)' =>
43 'coursegroupmode' => NOGROUPS
,
44 'withcapability' => 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)' =>
61 'coursegroupmode' => VISIBLEGROUPS
,
62 'withcapability' => 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)' =>
79 'coursegroupmode' => SEPARATEGROUPS
,
80 'withcapability' => 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)' =>
97 'coursegroupmode' => VISIBLEGROUPS
,
98 'withcapability' => 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)' =>
115 'coursegroupmode' => SEPARATEGROUPS
,
116 'withcapability' => 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)' =>
134 'coursegroupmode' => SEPARATEGROUPS
,
135 'withcapability' => 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)' =>
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)' =>
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)' =>
188 'coursegroupmode' => SEPARATEGROUPS
,
189 'withcapability' => 'moodle/course:bulkmessaging',
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)' =>
213 'coursegroupmode' => SEPARATEGROUPS
,
214 'withcapability' => 'moodle/course:bulkmessaging',
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)' =>
230 'coursegroupmode' => SEPARATEGROUPS
,
231 'withcapability' => 'moodle/course:bulkmessaging',
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) {
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
);
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.
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']);
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.
331 if (isset($settings['groupid'])) {
332 $groupid = $
{$settings['groupid']}->id
;
335 // Call to the function.
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.
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() {
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() {
417 $this->resetAfterTest(true);
419 $coursedata1 = array(
420 'summary' => 'Lightwork Course 1 description',
421 'summaryformat' => FORMAT_MOODLE
,
423 'enablecompletion' => 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.
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 () {
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')));
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.
534 "coursecapabilities" => array(
535 'courseid' => $course1->id
,
536 'capabilities' => array('moodle/course:viewparticipants')
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() {
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',
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(),
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
,
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(),
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']);