From b02b5fb74c09b3b209b32fa2e6c0baea88bec75f Mon Sep 17 00:00:00 2001 From: jerome mouneyrac Date: Mon, 30 Aug 2010 07:48:09 +0000 Subject: [PATCH] webservice MDL-23943 fix moodle_enrol_get_enrolled_users (return function, return value, sql result not unique, param name never used) + add unit test --- enrol/externallib.php | 24 +++++++++----- webservice/simpletest/testwebservice.php | 40 ++++++++++++++++++++++-- 2 files changed, 55 insertions(+), 9 deletions(-) diff --git a/enrol/externallib.php b/enrol/externallib.php index ecb948b7f08..f0125bc1b7b 100644 --- a/enrol/externallib.php +++ b/enrol/externallib.php @@ -67,7 +67,7 @@ class moodle_enrol_external extends external_api { $coursecontext = get_context_instance(CONTEXT_COURSE, $params['courseid']); if ($courseid == SITEID) { - $systemcontext = get_context_instance(CONTEXT_SYSTEM); + $context = get_context_instance(CONTEXT_SYSTEM); } else { $context = $coursecontext; } @@ -101,13 +101,21 @@ class moodle_enrol_external extends external_api { } list($sql, $params) = get_enrolled_sql($coursecontext, $withcapability, $groupid, $onlyactive); - $sql = "SELECT e.courseid, ue.userid + $sql = "SELECT DISTINCT ue.userid, e.courseid FROM {user_enrolments} ue JOIN {enrol} e ON (e.id = ue.enrolid) WHERE e.courseid = :courseid AND ue.userid IN ($sql)"; $params['courseid'] = $courseid; - return $DB->get_records_sql($sql, $params); + $enrolledusers = $DB->get_records_sql($sql, $params); + + $result = array(); + foreach ($enrolledusers as $enrolleduser) { + $result[] = array('courseid' => $enrolleduser->courseid, + 'userid' => $enrolleduser->userid); + } + + return $result; } /** @@ -115,10 +123,12 @@ class moodle_enrol_external extends external_api { * @return external_description */ public static function get_enrolled_users_returns() { - return new external_single_structure( - array( - 'courseid' => new external_value(PARAM_INT, 'id of course'), - 'userid' => new external_value(PARAM_INT, 'id of user'), + return new external_multiple_structure( + new external_single_structure( + array( + 'courseid' => new external_value(PARAM_INT, 'id of course'), + 'userid' => new external_value(PARAM_INT, 'id of user'), + ) ) ); } diff --git a/webservice/simpletest/testwebservice.php b/webservice/simpletest/testwebservice.php index db6f7654652..536b0b43956 100644 --- a/webservice/simpletest/testwebservice.php +++ b/webservice/simpletest/testwebservice.php @@ -71,6 +71,7 @@ class webservice_test extends UnitTestCase { 'moodle_group_get_groups' => false, 'moodle_course_get_courses' => false, 'moodle_user_get_users_by_id' => false, + 'moodle_enrol_get_enrolled_users' => false ); ////// WRITE DB tests //// @@ -213,6 +214,41 @@ class webservice_test extends UnitTestCase { $this->assertEqual(count($users), count($userids)); } + function moodle_enrol_get_enrolled_users($client) { + global $DB; + + //function settings + $withcapability = ''; + $groupid = null; + $onlyactive = false; + + $dbcourses = $DB->get_records('course'); + $function = 'moodle_enrol_get_enrolled_users'; + + foreach ($dbcourses as $dbcourse) { + + $params = array(); + + $coursecontext = get_context_instance(CONTEXT_COURSE, $dbcourse->id); + + list($sql, $params) = get_enrolled_sql($coursecontext, $withcapability, $groupid, $onlyactive); + $sql = "SELECT DISTINCT ue.userid, e.courseid + FROM {user_enrolments} ue + JOIN {enrol} e ON (e.id = ue.enrolid) + WHERE e.courseid = :courseid AND ue.userid IN ($sql)"; + + $params['courseid'] = $dbcourse->id; + + $enrolledusers = $DB->get_records_sql($sql, $params); + + $wsparams = array('courseid' => $dbcourse->id, 'withcapability' => $withcapability, + 'groupid' => $groupid, 'onlyactive' => $onlyactive); + $resultusers = $client->call($function, $wsparams); + + $this->assertEqual(count($resultusers), count($enrolledusers)); + } + } + function moodle_course_get_courses($client) { global $DB; @@ -302,7 +338,7 @@ class webservice_test extends UnitTestCase { $themeobjects = get_list_of_themes(); $theme = key($themeobjects); $categoryid = $DB->get_record('course_categories', array(), '*', IGNORE_MULTIPLE)->id; - $categoryid = empty($categoryid)?0:$categoryid; + $categoryid = empty($categoryid) ? 0 : $categoryid; $course1 = new stdClass(); $course1->fullname = 'Test Data create course 1'; @@ -386,7 +422,7 @@ class webservice_test extends UnitTestCase { $dbcourse2 = $DB->get_record('course', array('fullname' => $course2->fullname)); $this->assertEqual($dbcourse2->fullname, $course2->fullname); $this->assertEqual($dbcourse2->shortname, $course2->shortname); - $this->assertEqual($dbcourse2->category, $course2->categoryid ); + $this->assertEqual($dbcourse2->category, $course2->categoryid); $this->assertEqual($dbcourse2->summaryformat, FORMAT_MOODLE); $this->assertEqual($dbcourse2->format, $courseconfig->format); $this->assertEqual($dbcourse2->showgrades, $courseconfig->showgrades);