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/>.
18 * Group external PHPunit tests
22 * @copyright 2012 Jerome Mouneyrac
23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
27 defined('MOODLE_INTERNAL') ||
die();
31 require_once($CFG->dirroot
. '/webservice/tests/helpers.php');
32 require_once($CFG->dirroot
. '/group/externallib.php');
33 require_once($CFG->dirroot
. '/group/lib.php');
35 class core_group_externallib_testcase
extends externallib_advanced_testcase
{
40 public function test_create_groups() {
43 $this->resetAfterTest(true);
45 $course = self
::getDataGenerator()->create_course();
48 $group1['courseid'] = $course->id
;
49 $group1['name'] = 'Group Test 1';
50 $group1['description'] = 'Group Test 1 description';
51 $group1['descriptionformat'] = FORMAT_MOODLE
;
52 $group1['enrolmentkey'] = 'Test group enrol secret phrase';
53 $group1['idnumber'] = 'TEST1';
55 $group2['courseid'] = $course->id
;
56 $group2['name'] = 'Group Test 2';
57 $group2['description'] = 'Group Test 2 description';
59 $group3['courseid'] = $course->id
;
60 $group3['name'] = 'Group Test 3';
61 $group3['description'] = 'Group Test 3 description';
62 $group3['idnumber'] = 'TEST1';
64 $group4['courseid'] = $course->id
;
65 $group4['name'] = 'Group Test 4';
66 $group4['description'] = 'Group Test 4 description';
68 // Set the required capabilities by the external function
69 $context = context_course
::instance($course->id
);
70 $roleid = $this->assignUserCapability('moodle/course:managegroups', $context->id
);
71 $this->assignUserCapability('moodle/course:view', $context->id
, $roleid);
73 // Call the external function.
74 $groups = core_group_external
::create_groups(array($group1, $group2));
76 // We need to execute the return values cleaning process to simulate the web service server.
77 $groups = external_api
::clean_returnvalue(core_group_external
::create_groups_returns(), $groups);
79 // Checks against DB values
80 $this->assertEquals(2, count($groups));
81 foreach ($groups as $group) {
82 $dbgroup = $DB->get_record('groups', array('id' => $group['id']), '*', MUST_EXIST
);
83 switch ($dbgroup->name
) {
85 $groupdescription = $group1['description'];
86 $groupcourseid = $group1['courseid'];
87 $this->assertEquals($dbgroup->descriptionformat
, $group1['descriptionformat']);
88 $this->assertEquals($dbgroup->enrolmentkey
, $group1['enrolmentkey']);
89 $this->assertEquals($dbgroup->idnumber
, $group1['idnumber']);
92 $groupdescription = $group2['description'];
93 $groupcourseid = $group2['courseid'];
96 throw new moodle_exception('unknowgroupname');
99 $this->assertEquals($dbgroup->description
, $groupdescription);
100 $this->assertEquals($dbgroup->courseid
, $groupcourseid);
104 $froups = core_group_external
::create_groups(array($group3));
105 $this->fail('Exception expected due to already existing idnumber.');
106 } catch (moodle_exception
$e) {
107 $this->assertInstanceOf('moodle_exception', $e);
108 $this->assertEquals(get_string('idnumbertaken', 'error'), $e->getMessage());
111 // Call without required capability
112 $this->unassignUserCapability('moodle/course:managegroups', $context->id
, $roleid);
114 $this->expectException(\required_capability_exception
::class);
115 $froups = core_group_external
::create_groups(array($group4));
121 public function test_update_groups() {
124 $this->resetAfterTest(true);
126 $course = self
::getDataGenerator()->create_course();
128 $group1data = array();
129 $group1data['courseid'] = $course->id
;
130 $group1data['name'] = 'Group Test 1';
131 $group1data['description'] = 'Group Test 1 description';
132 $group1data['descriptionformat'] = FORMAT_MOODLE
;
133 $group1data['enrolmentkey'] = 'Test group enrol secret phrase';
134 $group1data['idnumber'] = 'TEST1';
135 $group2data = array();
136 $group2data['courseid'] = $course->id
;
137 $group2data['name'] = 'Group Test 2';
138 $group2data['description'] = 'Group Test 2 description';
139 $group2data['idnumber'] = 'TEST2';
141 // Set the required capabilities by the external function.
142 $context = context_course
::instance($course->id
);
143 $roleid = $this->assignUserCapability('moodle/course:managegroups', $context->id
);
144 $this->assignUserCapability('moodle/course:view', $context->id
, $roleid);
146 // Create the test groups.
147 $group1 = self
::getDataGenerator()->create_group($group1data);
148 $group2 = self
::getDataGenerator()->create_group($group2data);
150 $group1data['id'] = $group1->id
;
151 unset($group1data['courseid']);
152 $group2data['id'] = $group2->id
;
153 unset($group2data['courseid']);
155 // No exceptions should be triggered.
156 $group1data['idnumber'] = 'CHANGED';
157 core_group_external
::update_groups(array($group1data));
158 $group2data['description'] = 'Group Test 2 description CHANGED';
159 core_group_external
::update_groups(array($group2data));
161 foreach ([$group1, $group2] as $group) {
162 $dbgroup = $DB->get_record('groups', array('id' => $group->id
), '*', MUST_EXIST
);
163 switch ($dbgroup->name
) {
164 case $group1data['name']:
165 $this->assertEquals($dbgroup->idnumber
, $group1data['idnumber']);
166 $groupdescription = $group1data['description'];
168 case $group2data['name']:
169 $this->assertEquals($dbgroup->idnumber
, $group2data['idnumber']);
170 $groupdescription = $group2data['description'];
173 throw new moodle_exception('unknowngroupname');
176 $this->assertEquals($dbgroup->description
, $groupdescription);
179 // Taken idnumber exception.
180 $group1data['idnumber'] = 'TEST2';
182 $groups = core_group_external
::update_groups(array($group1data));
183 $this->fail('Exception expected due to already existing idnumber.');
184 } catch (moodle_exception
$e) {
185 $this->assertInstanceOf('moodle_exception', $e);
186 $this->assertEquals(get_string('idnumbertaken', 'error'), $e->getMessage());
189 // Call without required capability.
190 $group1data['idnumber'] = 'TEST1';
191 $this->unassignUserCapability('moodle/course:managegroups', $context->id
, $roleid);
193 $this->expectException(\required_capability_exception
::class);
194 $groups = core_group_external
::update_groups(array($group1data));
200 public function test_get_groups() {
203 $this->resetAfterTest(true);
205 $course = self
::getDataGenerator()->create_course();
206 $group1data = array();
207 $group1data['courseid'] = $course->id
;
208 $group1data['name'] = 'Group Test 1';
209 $group1data['description'] = 'Group Test 1 description';
210 $group1data['descriptionformat'] = FORMAT_MOODLE
;
211 $group1data['enrolmentkey'] = 'Test group enrol secret phrase';
212 $group1data['idnumber'] = 'TEST1';
213 $group2data = array();
214 $group2data['courseid'] = $course->id
;
215 $group2data['name'] = 'Group Test 2';
216 $group2data['description'] = 'Group Test 2 description';
217 $group1 = self
::getDataGenerator()->create_group($group1data);
218 $group2 = self
::getDataGenerator()->create_group($group2data);
220 // Set the required capabilities by the external function
221 $context = context_course
::instance($course->id
);
222 $roleid = $this->assignUserCapability('moodle/course:managegroups', $context->id
);
223 $this->assignUserCapability('moodle/course:view', $context->id
, $roleid);
225 // Call the external function.
226 $groups = core_group_external
::get_groups(array($group1->id
, $group2->id
));
228 // We need to execute the return values cleaning process to simulate the web service server.
229 $groups = external_api
::clean_returnvalue(core_group_external
::get_groups_returns(), $groups);
231 // Checks against DB values
232 $this->assertEquals(2, count($groups));
233 foreach ($groups as $group) {
234 $dbgroup = $DB->get_record('groups', array('id' => $group['id']), '*', MUST_EXIST
);
235 switch ($dbgroup->name
) {
237 $groupdescription = $group1->description
;
238 $groupcourseid = $group1->courseid
;
239 $this->assertEquals($dbgroup->descriptionformat
, $group1->descriptionformat
);
240 $this->assertEquals($dbgroup->enrolmentkey
, $group1->enrolmentkey
);
241 $this->assertEquals($dbgroup->idnumber
, $group1->idnumber
);
244 $groupdescription = $group2->description
;
245 $groupcourseid = $group2->courseid
;
248 throw new moodle_exception('unknowgroupname');
251 $this->assertEquals($dbgroup->description
, $groupdescription);
252 $this->assertEquals($dbgroup->courseid
, $groupcourseid);
255 // Call without required capability
256 $this->unassignUserCapability('moodle/course:managegroups', $context->id
, $roleid);
258 $this->expectException(\required_capability_exception
::class);
259 $groups = core_group_external
::get_groups(array($group1->id
, $group2->id
));
265 public function test_delete_groups() {
268 $this->resetAfterTest(true);
270 $course = self
::getDataGenerator()->create_course();
271 $group1data = array();
272 $group1data['courseid'] = $course->id
;
273 $group1data['name'] = 'Group Test 1';
274 $group1data['description'] = 'Group Test 1 description';
275 $group1data['descriptionformat'] = FORMAT_MOODLE
;
276 $group1data['enrolmentkey'] = 'Test group enrol secret phrase';
277 $group2data = array();
278 $group2data['courseid'] = $course->id
;
279 $group2data['name'] = 'Group Test 2';
280 $group2data['description'] = 'Group Test 2 description';
281 $group3data['courseid'] = $course->id
;
282 $group3data['name'] = 'Group Test 3';
283 $group3data['description'] = 'Group Test 3 description';
284 $group1 = self
::getDataGenerator()->create_group($group1data);
285 $group2 = self
::getDataGenerator()->create_group($group2data);
286 $group3 = self
::getDataGenerator()->create_group($group3data);
288 // Set the required capabilities by the external function
289 $context = context_course
::instance($course->id
);
290 $roleid = $this->assignUserCapability('moodle/course:managegroups', $context->id
);
291 $this->assignUserCapability('moodle/course:view', $context->id
, $roleid);
293 // Checks against DB values
294 $groupstotal = $DB->count_records('groups', array());
295 $this->assertEquals(3, $groupstotal);
297 // Call the external function.
298 core_group_external
::delete_groups(array($group1->id
, $group2->id
));
300 // Checks against DB values
301 $groupstotal = $DB->count_records('groups', array());
302 $this->assertEquals(1, $groupstotal);
304 // Call without required capability
305 $this->unassignUserCapability('moodle/course:managegroups', $context->id
, $roleid);
307 $this->expectException(\required_capability_exception
::class);
308 $froups = core_group_external
::delete_groups(array($group3->id
));
312 * Test create and update groupings.
315 public function test_create_update_groupings() {
318 $this->resetAfterTest(true);
320 $this->setAdminUser();
322 $course = self
::getDataGenerator()->create_course();
324 $grouping1data = array();
325 $grouping1data['courseid'] = $course->id
;
326 $grouping1data['name'] = 'Grouping 1 Test';
327 $grouping1data['description'] = 'Grouping 1 Test description';
328 $grouping1data['descriptionformat'] = FORMAT_MOODLE
;
329 $grouping1data['idnumber'] = 'TEST';
331 $grouping1 = self
::getDataGenerator()->create_grouping($grouping1data);
333 $grouping1data['name'] = 'Another group';
336 $groupings = core_group_external
::create_groupings(array($grouping1data));
337 $this->fail('Exception expected due to already existing idnumber.');
338 } catch (moodle_exception
$e) {
339 $this->assertInstanceOf('moodle_exception', $e);
340 $this->assertEquals(get_string('idnumbertaken', 'error'), $e->getMessage());
343 // No exception should be triggered.
344 $grouping1data['id'] = $grouping1->id
;
345 $grouping1data['idnumber'] = 'CHANGED';
346 unset($grouping1data['courseid']);
347 core_group_external
::update_groupings(array($grouping1data));
349 $grouping2data = array();
350 $grouping2data['courseid'] = $course->id
;
351 $grouping2data['name'] = 'Grouping 2 Test';
352 $grouping2data['description'] = 'Grouping 2 Test description';
353 $grouping2data['descriptionformat'] = FORMAT_MOODLE
;
354 $grouping2data['idnumber'] = 'TEST';
356 $grouping2 = self
::getDataGenerator()->create_grouping($grouping2data);
358 $grouping2data['id'] = $grouping2->id
;
359 $grouping2data['idnumber'] = 'CHANGED';
360 unset($grouping2data['courseid']);
362 $groupings = core_group_external
::update_groupings(array($grouping2data));
363 $this->fail('Exception expected due to already existing idnumber.');
364 } catch (moodle_exception
$e) {
365 $this->assertInstanceOf('moodle_exception', $e);
366 $this->assertEquals(get_string('idnumbertaken', 'error'), $e->getMessage());
373 public function test_get_groupings() {
376 $this->resetAfterTest(true);
378 $course = self
::getDataGenerator()->create_course();
380 $groupingdata = array();
381 $groupingdata['courseid'] = $course->id
;
382 $groupingdata['name'] = 'Grouping Test';
383 $groupingdata['description'] = 'Grouping Test description';
384 $groupingdata['descriptionformat'] = FORMAT_MOODLE
;
386 $grouping = self
::getDataGenerator()->create_grouping($groupingdata);
388 // Set the required capabilities by the external function.
389 $context = context_course
::instance($course->id
);
390 $roleid = $this->assignUserCapability('moodle/course:managegroups', $context->id
);
391 $this->assignUserCapability('moodle/course:view', $context->id
, $roleid);
393 // Call the external function without specifying the optional parameter.
394 $groupings = core_group_external
::get_groupings(array($grouping->id
));
395 // We need to execute the return values cleaning process to simulate the web service server.
396 $groupings = external_api
::clean_returnvalue(core_group_external
::get_groupings_returns(), $groupings);
398 $this->assertEquals(1, count($groupings));
400 $group1data = array();
401 $group1data['courseid'] = $course->id
;
402 $group1data['name'] = 'Group Test 1';
403 $group1data['description'] = 'Group Test 1 description';
404 $group1data['descriptionformat'] = FORMAT_MOODLE
;
405 $group2data = array();
406 $group2data['courseid'] = $course->id
;
407 $group2data['name'] = 'Group Test 2';
408 $group2data['description'] = 'Group Test 2 description';
409 $group2data['descriptionformat'] = FORMAT_MOODLE
;
411 $group1 = self
::getDataGenerator()->create_group($group1data);
412 $group2 = self
::getDataGenerator()->create_group($group2data);
414 groups_assign_grouping($grouping->id
, $group1->id
);
415 groups_assign_grouping($grouping->id
, $group2->id
);
417 // Call the external function specifying that groups are returned.
418 $groupings = core_group_external
::get_groupings(array($grouping->id
), true);
419 // We need to execute the return values cleaning process to simulate the web service server.
420 $groupings = external_api
::clean_returnvalue(core_group_external
::get_groupings_returns(), $groupings);
421 $this->assertEquals(1, count($groupings));
422 $this->assertEquals(2, count($groupings[0]['groups']));
423 foreach ($groupings[0]['groups'] as $group) {
424 $dbgroup = $DB->get_record('groups', array('id' => $group['id']), '*', MUST_EXIST
);
425 $dbgroupinggroups = $DB->get_record('groupings_groups',
426 array('groupingid' => $groupings[0]['id'],
427 'groupid' => $group['id']),
429 switch ($dbgroup->name
) {
431 $groupdescription = $group1->description
;
432 $groupcourseid = $group1->courseid
;
435 $groupdescription = $group2->description
;
436 $groupcourseid = $group2->courseid
;
439 throw new moodle_exception('unknowgroupname');
442 $this->assertEquals($dbgroup->description
, $groupdescription);
443 $this->assertEquals($dbgroup->courseid
, $groupcourseid);
448 * Test delete_groupings.
450 public function test_delete_groupings() {
453 $this->resetAfterTest(true);
455 $course = self
::getDataGenerator()->create_course();
457 $groupingdata1 = array();
458 $groupingdata1['courseid'] = $course->id
;
459 $groupingdata1['name'] = 'Grouping Test';
460 $groupingdata1['description'] = 'Grouping Test description';
461 $groupingdata1['descriptionformat'] = FORMAT_MOODLE
;
462 $groupingdata2 = array();
463 $groupingdata2['courseid'] = $course->id
;
464 $groupingdata2['name'] = 'Grouping Test';
465 $groupingdata2['description'] = 'Grouping Test description';
466 $groupingdata2['descriptionformat'] = FORMAT_MOODLE
;
467 $groupingdata3 = array();
468 $groupingdata3['courseid'] = $course->id
;
469 $groupingdata3['name'] = 'Grouping Test';
470 $groupingdata3['description'] = 'Grouping Test description';
471 $groupingdata3['descriptionformat'] = FORMAT_MOODLE
;
473 $grouping1 = self
::getDataGenerator()->create_grouping($groupingdata1);
474 $grouping2 = self
::getDataGenerator()->create_grouping($groupingdata2);
475 $grouping3 = self
::getDataGenerator()->create_grouping($groupingdata3);
477 // Set the required capabilities by the external function.
478 $context = context_course
::instance($course->id
);
479 $roleid = $this->assignUserCapability('moodle/course:managegroups', $context->id
);
480 $this->assignUserCapability('moodle/course:view', $context->id
, $roleid);
482 // Checks against DB values.
483 $groupingstotal = $DB->count_records('groupings', array());
484 $this->assertEquals(3, $groupingstotal);
486 // Call the external function.
487 core_group_external
::delete_groupings(array($grouping1->id
, $grouping2->id
));
489 // Checks against DB values.
490 $groupingstotal = $DB->count_records('groupings', array());
491 $this->assertEquals(1, $groupingstotal);
493 // Call without required capability.
494 $this->unassignUserCapability('moodle/course:managegroups', $context->id
, $roleid);
496 $this->expectException(\required_capability_exception
::class);
497 core_group_external
::delete_groupings(array($grouping3->id
));
503 public function test_get_course_user_groups() {
506 $this->resetAfterTest(true);
508 $student1 = self
::getDataGenerator()->create_user();
509 $student2 = self
::getDataGenerator()->create_user();
510 $teacher = self
::getDataGenerator()->create_user();
512 $course = self
::getDataGenerator()->create_course();
513 $anothercourse = self
::getDataGenerator()->create_course();
514 $emptycourse = self
::getDataGenerator()->create_course();
516 $studentrole = $DB->get_record('role', array('shortname' => 'student'));
517 $this->getDataGenerator()->enrol_user($student1->id
, $course->id
, $studentrole->id
);
518 $this->getDataGenerator()->enrol_user($student1->id
, $anothercourse->id
, $studentrole->id
);
519 $this->getDataGenerator()->enrol_user($student2->id
, $course->id
, $studentrole->id
);
521 $teacherrole = $DB->get_record('role', array('shortname' => 'editingteacher'));
522 $this->getDataGenerator()->enrol_user($teacher->id
, $course->id
, $teacherrole->id
);
523 $this->getDataGenerator()->enrol_user($teacher->id
, $emptycourse->id
, $teacherrole->id
);
525 $group1data = array();
526 $group1data['courseid'] = $course->id
;
527 $group1data['name'] = 'Group Test 1';
528 $group1data['description'] = 'Group Test 1 description';
529 $group1data['idnumber'] = 'TEST1';
530 $group2data = array();
531 $group2data['courseid'] = $course->id
;
532 $group2data['name'] = 'Group Test 2';
533 $group2data['description'] = 'Group Test 2 description';
534 $group3data = array();
535 $group3data['courseid'] = $anothercourse->id
;
536 $group3data['name'] = 'Group Test 3';
537 $group3data['description'] = 'Group Test 3 description';
538 $group3data['idnumber'] = 'TEST3';
539 $group1 = self
::getDataGenerator()->create_group($group1data);
540 $group2 = self
::getDataGenerator()->create_group($group2data);
541 $group3 = self
::getDataGenerator()->create_group($group3data);
543 groups_add_member($group1->id
, $student1->id
);
544 groups_add_member($group1->id
, $student2->id
);
545 groups_add_member($group2->id
, $student1->id
);
546 groups_add_member($group3->id
, $student1->id
);
548 // Create a grouping.
549 $groupingdata = array();
550 $groupingdata['courseid'] = $course->id
;
551 $groupingdata['name'] = 'Grouping Test';
552 $groupingdata['description'] = 'Grouping Test description';
553 $groupingdata['descriptionformat'] = FORMAT_MOODLE
;
555 $grouping = self
::getDataGenerator()->create_grouping($groupingdata);
556 // Grouping only containing group1.
557 groups_assign_grouping($grouping->id
, $group1->id
);
559 $this->setUser($student1);
561 $groups = core_group_external
::get_course_user_groups($course->id
, $student1->id
);
562 $groups = external_api
::clean_returnvalue(core_group_external
::get_course_user_groups_returns(), $groups);
563 // Check that I see my groups.
564 $this->assertCount(2, $groups['groups']);
565 $this->assertEquals($course->id
, $groups['groups'][0]['courseid']);
566 $this->assertEquals($course->id
, $groups['groups'][1]['courseid']);
568 // Check that I only see my groups inside the given grouping.
569 $groups = core_group_external
::get_course_user_groups($course->id
, $student1->id
, $grouping->id
);
570 $groups = external_api
::clean_returnvalue(core_group_external
::get_course_user_groups_returns(), $groups);
571 // Check that I see my groups in the grouping.
572 $this->assertCount(1, $groups['groups']);
573 $this->assertEquals($group1->id
, $groups['groups'][0]['id']);
576 // Check optional parameters (all student 1 courses and current user).
577 $groups = core_group_external
::get_course_user_groups();
578 $groups = external_api
::clean_returnvalue(core_group_external
::get_course_user_groups_returns(), $groups);
579 // Check that I see my groups in all my courses.
580 $this->assertCount(3, $groups['groups']);
582 $this->setUser($student2);
583 $groups = core_group_external
::get_course_user_groups($course->id
, $student2->id
);
584 $groups = external_api
::clean_returnvalue(core_group_external
::get_course_user_groups_returns(), $groups);
585 // Check that I see my groups.
586 $this->assertCount(1, $groups['groups']);
588 $this->assertEquals($group1data['name'], $groups['groups'][0]['name']);
589 $this->assertEquals($group1data['description'], $groups['groups'][0]['description']);
590 $this->assertEquals($group1data['idnumber'], $groups['groups'][0]['idnumber']);
592 $this->setUser($teacher);
593 $groups = core_group_external
::get_course_user_groups($course->id
, $student1->id
);
594 $groups = external_api
::clean_returnvalue(core_group_external
::get_course_user_groups_returns(), $groups);
595 // Check that a teacher can see student groups in given course.
596 $this->assertCount(2, $groups['groups']);
598 $groups = core_group_external
::get_course_user_groups($course->id
, $student2->id
);
599 $groups = external_api
::clean_returnvalue(core_group_external
::get_course_user_groups_returns(), $groups);
600 // Check that a teacher can see student groups in given course.
601 $this->assertCount(1, $groups['groups']);
603 $groups = core_group_external
::get_course_user_groups(0, $student1->id
);
604 $groups = external_api
::clean_returnvalue(core_group_external
::get_course_user_groups_returns(), $groups);
605 // Check that a teacher can see student groups in all the user courses if the teacher is enrolled in the course.
606 $this->assertCount(2, $groups['groups']); // Teacher only see groups in first course.
607 $this->assertCount(1, $groups['warnings']); // Enrolment warnings.
608 $this->assertEquals('1', $groups['warnings'][0]['warningcode']);
610 // Enrol teacher in second course.
611 $this->getDataGenerator()->enrol_user($teacher->id
, $anothercourse->id
, $teacherrole->id
);
612 $groups = core_group_external
::get_course_user_groups(0, $student1->id
);
613 $groups = external_api
::clean_returnvalue(core_group_external
::get_course_user_groups_returns(), $groups);
614 // Check that a teacher can see student groups in all the user courses if the teacher is enrolled in the course.
615 $this->assertCount(3, $groups['groups']);
617 // Check permissions.
618 $this->setUser($student1);
620 // Student can's see other students group.
621 $groups = core_group_external
::get_course_user_groups($course->id
, $student2->id
);
622 $groups = external_api
::clean_returnvalue(core_group_external
::get_course_user_groups_returns(), $groups);
623 $this->assertCount(1, $groups['warnings']);
624 $this->assertEquals('cannotmanagegroups', $groups['warnings'][0]['warningcode']);
626 // Not enrolled course.
627 $groups = core_group_external
::get_course_user_groups($emptycourse->id
, $student2->id
);
628 $groups = external_api
::clean_returnvalue(core_group_external
::get_course_user_groups_returns(), $groups);
629 $this->assertCount(1, $groups['warnings']);
630 $this->assertEquals('1', $groups['warnings'][0]['warningcode']);
632 $this->setUser($teacher);
633 // Check user checking not enrolled in given course.
634 $groups = core_group_external
::get_course_user_groups($emptycourse->id
, $student1->id
);
635 $groups = external_api
::clean_returnvalue(core_group_external
::get_course_user_groups_returns(), $groups);
636 $this->assertCount(1, $groups['warnings']);
637 $this->assertEquals('notenrolled', $groups['warnings'][0]['warningcode']);
641 * Test get_activity_allowed_groups
643 public function test_get_activity_allowed_groups() {
646 $this->resetAfterTest(true);
648 $generator = self
::getDataGenerator();
650 $student = $generator->create_user();
651 $otherstudent = $generator->create_user();
652 $teacher = $generator->create_user();
653 $course = $generator->create_course();
654 $othercourse = $generator->create_course();
656 $studentrole = $DB->get_record('role', array('shortname' => 'student'));
657 $teacherrole = $DB->get_record('role', array('shortname' => 'editingteacher'));
658 $generator->enrol_user($student->id
, $course->id
, $studentrole->id
);
659 $generator->enrol_user($otherstudent->id
, $othercourse->id
, $studentrole->id
);
660 $generator->enrol_user($teacher->id
, $course->id
, $teacherrole->id
);
662 $forum1 = $generator->create_module("forum", array('course' => $course->id
), array('groupmode' => VISIBLEGROUPS
));
663 $forum2 = $generator->create_module("forum", array('course' => $othercourse->id
));
664 $forum3 = $generator->create_module("forum", array('course' => $course->id
), array('visible' => 0));
666 // Request data for tests.
667 $cm1 = get_coursemodule_from_instance("forum", $forum1->id
);
668 $cm2 = get_coursemodule_from_instance("forum", $forum2->id
);
669 $cm3 = get_coursemodule_from_instance("forum", $forum3->id
);
671 $group1data = array();
672 $group1data['courseid'] = $course->id
;
673 $group1data['name'] = 'Group Test 1';
674 $group1data['description'] = 'Group Test 1 description';
675 $group1data['idnumber'] = 'TEST1';
676 $group2data = array();
677 $group2data['courseid'] = $course->id
;
678 $group2data['name'] = 'Group Test 2';
679 $group2data['description'] = 'Group Test 2 description';
680 $group2data['idnumber'] = 'TEST2';
681 $group1 = $generator->create_group($group1data);
682 $group2 = $generator->create_group($group2data);
684 groups_add_member($group1->id
, $student->id
);
685 groups_add_member($group2->id
, $student->id
);
687 $this->setUser($student);
689 // First try possible errors.
691 $data = core_group_external
::get_activity_allowed_groups($cm2->id
);
692 } catch (moodle_exception
$e) {
693 $this->assertEquals('requireloginerror', $e->errorcode
);
697 $data = core_group_external
::get_activity_allowed_groups($cm3->id
);
698 } catch (moodle_exception
$e) {
699 $this->assertEquals('requireloginerror', $e->errorcode
);
702 // Retrieve my groups.
703 $groups = core_group_external
::get_activity_allowed_groups($cm1->id
);
704 $groups = external_api
::clean_returnvalue(core_group_external
::get_activity_allowed_groups_returns(), $groups);
705 $this->assertCount(2, $groups['groups']);
706 $this->assertFalse($groups['canaccessallgroups']);
708 foreach ($groups['groups'] as $group) {
709 if ($group['name'] == $group1data['name']) {
710 $this->assertEquals($group1data['description'], $group['description']);
711 $this->assertEquals($group1data['idnumber'], $group['idnumber']);
713 $this->assertEquals($group2data['description'], $group['description']);
714 $this->assertEquals($group2data['idnumber'], $group['idnumber']);
718 $this->setUser($teacher);
719 // Retrieve other users groups.
720 $groups = core_group_external
::get_activity_allowed_groups($cm1->id
, $student->id
);
721 $groups = external_api
::clean_returnvalue(core_group_external
::get_activity_allowed_groups_returns(), $groups);
722 $this->assertCount(2, $groups['groups']);
723 // We are checking the $student passed as parameter so this will return false.
724 $this->assertFalse($groups['canaccessallgroups']);
726 // Check warnings. Trying to get groups for a user not enrolled in course.
727 $groups = core_group_external
::get_activity_allowed_groups($cm1->id
, $otherstudent->id
);
728 $groups = external_api
::clean_returnvalue(core_group_external
::get_activity_allowed_groups_returns(), $groups);
729 $this->assertCount(1, $groups['warnings']);
730 $this->assertFalse($groups['canaccessallgroups']);
732 // Checking teacher groups.
733 $groups = core_group_external
::get_activity_allowed_groups($cm1->id
);
734 $groups = external_api
::clean_returnvalue(core_group_external
::get_activity_allowed_groups_returns(), $groups);
735 $this->assertCount(2, $groups['groups']);
736 // Teachers by default can access all groups.
737 $this->assertTrue($groups['canaccessallgroups']);
741 * Test get_activity_groupmode
743 public function test_get_activity_groupmode() {
746 $this->resetAfterTest(true);
748 $generator = self
::getDataGenerator();
750 $student = $generator->create_user();
751 $course = $generator->create_course();
752 $othercourse = $generator->create_course();
754 $studentrole = $DB->get_record('role', array('shortname' => 'student'));
755 $generator->enrol_user($student->id
, $course->id
, $studentrole->id
);
757 $forum1 = $generator->create_module("forum", array('course' => $course->id
), array('groupmode' => VISIBLEGROUPS
));
758 $forum2 = $generator->create_module("forum", array('course' => $othercourse->id
));
759 $forum3 = $generator->create_module("forum", array('course' => $course->id
), array('visible' => 0));
761 // Request data for tests.
762 $cm1 = get_coursemodule_from_instance("forum", $forum1->id
);
763 $cm2 = get_coursemodule_from_instance("forum", $forum2->id
);
764 $cm3 = get_coursemodule_from_instance("forum", $forum3->id
);
766 $this->setUser($student);
768 $data = core_group_external
::get_activity_groupmode($cm1->id
);
769 $data = external_api
::clean_returnvalue(core_group_external
::get_activity_groupmode_returns(), $data);
770 $this->assertEquals(VISIBLEGROUPS
, $data['groupmode']);
773 $data = core_group_external
::get_activity_groupmode($cm2->id
);
774 } catch (moodle_exception
$e) {
775 $this->assertEquals('requireloginerror', $e->errorcode
);
779 $data = core_group_external
::get_activity_groupmode($cm3->id
);
780 } catch (moodle_exception
$e) {
781 $this->assertEquals('requireloginerror', $e->errorcode
);
787 * Test add_group_members.
789 public function test_add_group_members() {
792 $this->resetAfterTest(true);
794 $student1 = self
::getDataGenerator()->create_user();
795 $student2 = self
::getDataGenerator()->create_user();
796 $student3 = self
::getDataGenerator()->create_user();
798 $course = self
::getDataGenerator()->create_course();
800 $studentrole = $DB->get_record('role', array('shortname' => 'student'));
801 $this->getDataGenerator()->enrol_user($student1->id
, $course->id
, $studentrole->id
);
802 $this->getDataGenerator()->enrol_user($student2->id
, $course->id
, $studentrole->id
);
803 $this->getDataGenerator()->enrol_user($student3->id
, $course->id
, $studentrole->id
);
805 $group1data = array();
806 $group1data['courseid'] = $course->id
;
807 $group1data['name'] = 'Group Test 1';
808 $group1data['description'] = 'Group Test 1 description';
809 $group1data['idnumber'] = 'TEST1';
810 $group1 = self
::getDataGenerator()->create_group($group1data);
812 // Checks against DB values.
813 $memberstotal = $DB->count_records('groups_members', ['groupid' => $group1->id
]);
814 $this->assertEquals(0, $memberstotal);
816 // Set the required capabilities by the external function.
817 $context = context_course
::instance($course->id
);
818 $roleid = $this->assignUserCapability('moodle/course:managegroups', $context->id
);
819 $this->assignUserCapability('moodle/course:view', $context->id
, $roleid);
821 core_group_external
::add_group_members([
823 'groupid' => $group1->id
,
824 'userid' => $student1->id
,
827 core_group_external
::add_group_members([
829 'groupid' => $group1->id
,
830 'userid' => $student2->id
,
833 core_group_external
::add_group_members([
835 'groupid' => $group1->id
,
836 'userid' => $student3->id
,
840 // Checks against DB values.
841 $memberstotal = $DB->count_records('groups_members', ['groupid' => $group1->id
]);
842 $this->assertEquals(3, $memberstotal);
846 * Test delete_group_members.
848 public function test_delete_group_members() {
851 $this->resetAfterTest(true);
853 $student1 = self
::getDataGenerator()->create_user();
854 $student2 = self
::getDataGenerator()->create_user();
855 $student3 = self
::getDataGenerator()->create_user();
857 $course = self
::getDataGenerator()->create_course();
859 $studentrole = $DB->get_record('role', array('shortname' => 'student'));
860 $this->getDataGenerator()->enrol_user($student1->id
, $course->id
, $studentrole->id
);
861 $this->getDataGenerator()->enrol_user($student2->id
, $course->id
, $studentrole->id
);
862 $this->getDataGenerator()->enrol_user($student3->id
, $course->id
, $studentrole->id
);
864 $group1data = array();
865 $group1data['courseid'] = $course->id
;
866 $group1data['name'] = 'Group Test 1';
867 $group1data['description'] = 'Group Test 1 description';
868 $group1data['idnumber'] = 'TEST1';
869 $group1 = self
::getDataGenerator()->create_group($group1data);
871 groups_add_member($group1->id
, $student1->id
);
872 groups_add_member($group1->id
, $student2->id
);
873 groups_add_member($group1->id
, $student3->id
);
875 // Checks against DB values.
876 $memberstotal = $DB->count_records('groups_members', ['groupid' => $group1->id
]);
877 $this->assertEquals(3, $memberstotal);
879 // Set the required capabilities by the external function.
880 $context = context_course
::instance($course->id
);
881 $roleid = $this->assignUserCapability('moodle/course:managegroups', $context->id
);
882 $this->assignUserCapability('moodle/course:view', $context->id
, $roleid);
884 core_group_external
::delete_group_members([
886 'groupid' => $group1->id
,
887 'userid' => $student2->id
,
891 // Checks against DB values.
892 $memberstotal = $DB->count_records('groups_members', ['groupid' => $group1->id
]);
893 $this->assertEquals(2, $memberstotal);