From a73e1ab4c5d221848445bdd5eaa7f58ca59bae2d Mon Sep 17 00:00:00 2001 From: jerome Date: Thu, 5 Mar 2009 06:59:58 +0000 Subject: [PATCH] web service MDL-12886 Add unit tests for User web service functions. Change most of User web service functions to support multiple operation in one call. Adapt SOAP and XMLRPC test client. (REST User test clients wont work anymore till REST server supports array parameter) --- user/external.php | 211 ++++++++++-------- user/lib.php | 26 ++- user/simpletest/testexternal.php | 205 +++++++++++++++++ webservice/lib.php | 6 +- .../soap/testclient/zend_soap_client.php | 22 +- .../xmlrpc/testclient/zend_xmlrpc_client.php | 12 +- 6 files changed, 365 insertions(+), 117 deletions(-) create mode 100644 user/simpletest/testexternal.php diff --git a/user/external.php b/user/external.php index 10fc87526f..8f3b5c943f 100644 --- a/user/external.php +++ b/user/external.php @@ -1,60 +1,37 @@ search - the string to search - * @subparam string $params:searches->search2 optional - the string to search - * @subparam string $params:searches->search3 - the string to search - * @subparam string $params:airport->planes:plane->company->employees:employee->name - name of a employee of a company of a plane of an airport - * @return object $return - * @subreturn integer $return:user->id - * @subreturn integer $return:user->auth - * @subreturn integer $return:user->confirmed - * @subreturn string $return:user->username - * @subreturn string $return:user->idnumber - * @subreturn string $return:user->firstname - * @subreturn string $return:user->lastname - * @subreturn string $return:user->email - * @subreturn string $return:user->emailstop - * @subreturn string $return:user->lang - * @subreturn string $return:user->theme - * @subreturn string $return:user->timezone - * @subreturn string $return:user->mailformat - */ - static function tmp_do_multiple_user_searches($params) { - global $USER; - if (has_capability('moodle/user:viewdetails', get_context_instance(CONTEXT_SYSTEM))) { - $users = array(); - foreach($params as $searchparams) { - $searchusers = get_users(true, $searchparams['search'], false, null, 'firstname ASC','', '', '', 1000, 'id, auth, confirmed, username, idnumber, firstname, lastname, email, emailstop, lang, theme, timezone, mailformat'); - foreach ($searchusers as $user) { - $users[] = $user; - } - } - return $users; - } - else { - throw new moodle_exception('wscouldnotvieweuser'); - } - } - /** * Retrieve all user * @param array|struct $params - need to be define as struct for XMLRPC @@ -80,87 +57,147 @@ final class user_external { $params['search'] = clean_param($params['search'], PARAM_ALPHANUM); if (has_capability('moodle/user:viewdetails', get_context_instance(CONTEXT_SYSTEM))) { - // return "toto"; - return get_users(true, $params['search'], false, null, 'firstname ASC','', '', '', 1000, 'id, auth, confirmed, username, idnumber, firstname, lastname, email, emailstop, lang, theme, timezone, mailformat'); + return get_users(true, $params['search'], false, null, 'firstname ASC','', '', '', 1000, 'id, auth, confirmed, username, idnumber, firstname, lastname, email, emailstop, lang, theme, timezone, mailformat, city, description, country'); } else { throw new moodle_exception('wscouldnotvieweuser'); } } - /** - * Create a user + /** + * Create multiple users * @param array|struct $params - need to be define as struct for XMLRPC - * @subparam string $params->username - * @subparam string $params->firstname - * @subparam string $params->lastname - * @subparam string $params->email - * @subparam string $params->password - * @return integer id of new user + * @subparam string $params:user->username + * @subparam string $params:user->firstname + * @subparam string $params:user->lastname + * @subparam string $params:user->email + * @subparam string $params:user->password + * @return array $return ids of new user + * @subreturn integer $return:id user id */ - static function tmp_create_user($params) { + static function tmp_create_users($params) { global $USER; if (has_capability('moodle/user:create', get_context_instance(CONTEXT_SYSTEM))) { - $user = array(); - $user['username'] = $params['username']; - $user['firstname'] = $params['firstname']; - $user['lastname'] = $params['lastname']; - $user['email'] = $params['email']; - $user['password'] = $params['password']; - return tmp_create_user($user); + $userids = array(); + foreach ($params as $userparams) { + + $user = array(); + foreach (array_keys($userparams) as $key) { + $user[$key] = clean_param($userparams[$key], PARAM_ALPHANUMEXT); + } + + if (array_key_exists('email', $userparams)) { + $user['email'] = clean_param($userparams['email'], PARAM_NOTAGS); + } + + if (array_key_exists('description', $userparams)) { + $user['description'] = clean_param($userparams['description'], PARAM_TEXT); + } + + try { + $userids[$userparams['username']] = tmp_create_user($user); + } + catch (dml_write_exception $e) { + throw new moodle_exception('wscouldnotcreateeuserindb'); + } + } + return $userids; } else { throw new moodle_exception('wscouldnotcreateeuser'); - } + } } - /** - * Delete a user + /** + * Delete multiple users * @global object $DB * @param array|struct $params - need to be define as struct for XMLRPC - * @subparam string $params->username - * @subparam integer $params->mnethostid + * @subparam string $params:user->username + * @subparam integer $params:user->mnethostid * @return boolean result true if success */ - static function tmp_delete_user($params) { + static function tmp_delete_users($params) { global $DB,$USER; + $deletionsuccessfull = true; if (has_capability('moodle/user:delete', get_context_instance(CONTEXT_SYSTEM))) { - $user = $DB->get_record('user', array('username'=>$params['username'], 'mnethostid'=>$params['mnethostid'])); - return delete_user($user); //this function is in moodlelib.php + foreach ($params as $userparams) { + + $username = clean_param($userparams['username'], PARAM_ALPHANUMEXT); + + $user = $DB->get_record('user', array('username'=>$username, 'mnethostid'=>1)); + + if (empty($user)) { + throw new moodle_exception('wscouldnotdeletenoexistinguser'); + } + + if (!delete_user($user)) { + $deletionsuccessfull = false; //this function is in moodlelib.php + } + } + return $deletionsuccessfull; } else { throw new moodle_exception('wscouldnotdeleteuser'); } } - - /** - * Update some user information + /** + * Update some users information * @global object $DB * @param array|struct $params - need to be define as struct for XMLRPC - * @subparam string $params->username - * @subparam integer $params->mnethostid - * @subparam string $params->newusername - * @subparam string $params->firstname + * @subparam string $params:user->username + * @subparam integer $params:user->mnethostid + * @subparam string $params:user->newusername + * @subparam string $params:user->firstname * @return boolean result true if success */ - static function tmp_update_user($params) { + static function tmp_update_users($params) { global $DB,$USER; if (has_capability('moodle/user:update', get_context_instance(CONTEXT_SYSTEM))) { - $user = $DB->get_record('user', array('username'=>$params['username'], 'mnethostid'=>$params['mnethostid'])); + $updatesuccessfull = true; - if (!empty($params['newusername'])) { - $user->username = $params['newusername']; - } - if (!empty($params['firstname'])) { - $user->firstname = $params['firstname']; + foreach ($params as $userparams) { + if (array_key_exists('username', $userparams)) { + $username = clean_param($userparams['username'], PARAM_NOTAGS); + } + + $user = $DB->get_record('user', array('username'=>$username, 'mnethostid'=>1)); + + if (empty($user)) { + throw new moodle_exception('wscouldnotupdatenoexistinguser'); + } + + foreach (array_keys($userparams) as $key) { + $user->$key = clean_param($userparams[$key], PARAM_ALPHANUMEXT); + } + + if (array_key_exists('email', $userparams)) { + $user->email = clean_param($userparams['email'], PARAM_NOTAGS); + } + + if (array_key_exists('description', $userparams)) { + $user->description = clean_param($userparams['description'], PARAM_TEXT); + } + + if (array_key_exists('newusername', $userparams)) { + $user->username = clean_param($userparams['newusername'], PARAM_ALPHANUMEXT); + } + + try { + if( !tmp_update_user($user)) { + $updatesuccessfull = false; + } + } + catch (dml_write_exception $e) { + throw new moodle_exception('wscouldnotupdateuserindb'); + } } - return tmp_update_user($user); + return $updatesuccessfull; } else { throw new moodle_exception('wscouldnotupdateuser'); } - + } } diff --git a/user/lib.php b/user/lib.php index bcc86af6cd..60987b4c89 100644 --- a/user/lib.php +++ b/user/lib.php @@ -99,37 +99,42 @@ * * @param assoc array or object $user * - * @return userid or thrown exceptions + * @return string or thrown exceptions */ function tmp_create_user($user) { global $CFG, $DB; - ///WS: convert user array into an user object + /// WS: convert user array into an user object if (is_array($user)) { $user = (object) $user; } - ///check password and auth fields - if (!isset($user->password)) { - $user->password = ''; - } + /// check auth fields if (!isset($user->auth)) { $user->auth = 'manual'; + } else { + /// check that the auth value exists + $authplugin = get_directory_list($CFG->dirroot."/auth", '', false, true, false); + if (array_search($user->auth, $authplugin)===false) { + throw new moodle_exception('authnotexisting'); + } } - $required = array('username','firstname','lastname','email'); + $required = array('username','firstname','lastname','email', 'password'); foreach ($required as $req) { if (!isset($user->{$req})) { throw new moodle_exception('missingerequiredfield'); } } - - $record = create_user_record($user->username, $user->password, $user->auth); + $password = hash_internal_user_password($user->password); + $record = create_user_record($user->username, $password, $user->auth); if ($record) { $user->id = $record->id; if ($DB->update_record('user',$user)) { return $record->id; } else { + //we could not update properly the newly created user, we need to delete it $DB->delete_record('user',array('id' => $record->id)); + throw new moodle_exception('couldnotcreateuser'); } } throw new moodle_exception('couldnotcreateuser'); @@ -140,7 +145,8 @@ /** * Update a user record from its id * Warning: no checks are done on the data!!! - * @param object $user + * @param object $user + * @return boolean */ function tmp_update_user($user) { global $DB; diff --git a/user/simpletest/testexternal.php b/user/simpletest/testexternal.php new file mode 100644 index 0000000000..4e1e1071b2 --- /dev/null +++ b/user/simpletest/testexternal.php @@ -0,0 +1,205 @@ + DO NOT UNCOMMENT THESE TEST FUNCTIONS EXCEPT IF U R DEV + * => NONE OF THESE TEST FUNCTIONS SHOULD BE UNCOMMENT BY DEFAULT + * => THESE TEST FUNCTIONS ARE DEPENDENT BETWEEEN EACH OTHER + * => THE FUNCTION ORDER CAN NOT BE CHANGE + * + * + * THESE TEST NEED TO BE RUN AS ADMIN!!! + * @author Jerome Mouneyrac + */ + +require_once($CFG->dirroot . '/user/external.php'); + +class user_external_test extends UnitTestCase { + var $realDB; + + function setUp() { + + } + + function tearDown() { + + } +/* + function testTmp_create_users() { + /// test that we create multiple users + $params = array(); + for ($i=0;$i<2;$i=$i+1) { + $user = array(); + $user['username'] = 'mockuserfortesting'.$i; + $user['firstname'] = 'mockuserfortesting'.$i.'_firstname'; + $user['lastname'] = 'mockuserfortesting'.$i.'_lastname'; + $user['email'] = 'mockuserfortesting'.$i.'@moodle.com'; + $user['password'] = 'mockuserfortesting'.$i.'_password'; + $params[] = $user; + } + $result = user_external::tmp_create_users($params); + $this->assertEqual(sizeof($result), 2); + //just test that value are integer and not null + $this->assertIsA($result[key($result)], "integer"); + $this->assertNotNull($result[key($result)]); + + /// test that we create one user with all optional fields + $params = array(); + $user = array(); + $user['username'] = 'mockuserfortestingXX'; + $user['firstname'] = 'mockuserfortesting_firstname'; + $user['lastname'] = 'mockuserfortesting_lastname'; + $user['email'] = 'mockuserfortesting@moodle.com'; + $user['password'] = 'mockuserfortesting_password'; + $user['city'] = 'mockuserfortesting_city'; + $user['description'] = 'mockuserfortesting description'; + $user['country'] = 'AU'; + $user['lang']='en_utf8'; + $user['auth']='manual'; + $params[] = $user; + $result = user_external::tmp_create_users($params); + $this->assertEqual($result, true); + + + /// test we cannot create a user with some missing mandatory field + $params = array(); + $user = array(); + $user['username'] = 'mockuserfortestingY'; + $params[] = $user; + $this->expectException(new moodle_exception('missingerequiredfield')); + $result = user_external::tmp_create_users($params); + + } + + function testTmp_create_users_2() { + /// test we cannot create a user because the username already exist + $params = array(); + $user = array(); + $user['username'] = 'mockuserfortestingXX'; + $user['firstname'] = 'mockuserfortestingX_firstname'; + $user['lastname'] = 'mockuserfortestingX_lastname'; + $user['email'] = 'mockuserfortestingX@moodle.com'; + $user['password'] = 'mockuserfortestingX_password'; + $params[] = $user; + + $this->expectException(new moodle_exception('wscouldnotcreateeuserindb')); + $result = user_external::tmp_create_users($params); + } + + function testTmp_get_users() { + $params = array('search' => 'mockuserfortestingXX'); + $users = user_external::tmp_get_users($params); + foreach ($users as $user) { + $this->assertEqual($user->username, 'mockuserfortestingXX'); + $this->assertEqual($user->firstname, 'mockuserfortesting_firstname'); + $this->assertEqual($user->lastname, 'mockuserfortesting_lastname'); + $this->assertEqual($user->email, 'mockuserfortesting@moodle.com'); + // $this->assertEqual($user->password, 'mockuserfortesting_password'); + $this->assertEqual($user->city, 'mockuserfortesting_c'); + $this->assertEqual($user->description, 'mockuserfortesting description'); + $this->assertEqual($user->country, 'AU'); + $this->assertEqual($user->lang, 'en_utf8'); + } + + } + + function testTmp_update_users() { + /// update several users with full information + $params = array(); + $user = array(); + $user['username'] = 'mockuserfortestingXX'; + $user['newusername'] = 'mockuserfortestingXY'; + $user['firstname'] = 'mockuserfortestingY_firstname'; + $user['lastname'] = 'mockuserfortestingY_lastname'; + $user['email'] = 'mockuserfortestingY@moodle.com'; + $user['password'] = 'mockuserfortestingY_password'; + $user['city'] = 'mockuserfortestingY_city'; + $user['description'] = 'mockuserfortestingY description'; + $user['country'] = 'AU'; + $user['lang']='en_utf8'; + $user['auth']='manual'; + $params[] = $user; + $user = array(); + $user['username'] = 'mockuserfortesting0'; + $user['newusername'] = 'mockuserfortesting0Y'; + $user['firstname'] = 'mockuserfortesting0Y_firstname'; + $user['lastname'] = 'mockuserfortesting0Y_lastname'; + $user['email'] = 'mockuserfortesting0Y@moodle.com'; + $user['password'] = 'mockuserfortesting0Y_password'; + $user['city'] = 'mockuserfortesting0Y_city'; + $user['description'] = 'mockuserfortesting0Y description'; + $user['country'] = 'AU'; + $user['lang']='en_utf8'; + $user['auth']='manual'; + $params[] = $user; + $result = user_external::tmp_update_users($params); + $this->assertEqual($result, true); + + /// Exception: update non existing user + $params = array(); + $user = array(); + $user['username'] = 'mockuserfortesting000'; + $user['newusername'] = 'mockuserfortesting0Y'; + $params[] = $user; + $this->expectException(new moodle_exception('wscouldnotupdatenoexistinguser')); //TODO catch the write exception + $result = user_external::tmp_update_users($params); + } + + function testTmp_update_users_2() { + /// update an existing user with an already existing username + $params = array(); + $user = array(); + $user['username'] = 'mockuserfortesting0Y'; + $user['newusername'] = 'mockuserfortestingXY'; + $params[] = $user; + + $this->expectException(new moodle_exception('wscouldnotupdateuserindb')); + $result = user_external::tmp_update_users($params); + } + + function testTmp_delete_users() { + /// we delete all previously created users + $params = array(); + $user = array(); + $user['username'] = 'mockuserfortestingXY'; + $params[] = $user; + $user = array(); + $user['username'] = 'mockuserfortesting0Y'; + $params[] = $user; + $user = array(); + $user['username'] = 'mockuserfortesting1'; + $params[] = $user; + $result = user_external::tmp_delete_users($params); + $this->assertEqual($result, true); + + /// try to delete them a new time, should return exception + $this->expectException(new moodle_exception('wscouldnotdeletenoexistinguser')); + $result = user_external::tmp_delete_users($params); + } +*/ +} +?> \ No newline at end of file diff --git a/webservice/lib.php b/webservice/lib.php index a751a861b5..f1944ed693 100644 --- a/webservice/lib.php +++ b/webservice/lib.php @@ -400,9 +400,9 @@ final class webservice_lib { } } - // echo "
";
-        //        var_dump($description);
-        //        echo "
"; +// echo "
";
+//                var_dump($description);
+//                echo "
"; return $description; } diff --git a/webservice/soap/testclient/zend_soap_client.php b/webservice/soap/testclient/zend_soap_client.php index ece750cb13..484f8364b8 100644 --- a/webservice/soap/testclient/zend_soap_client.php +++ b/webservice/soap/testclient/zend_soap_client.php @@ -85,29 +85,29 @@ print ""; //call_soap_function($client,$functionname,$param,$expectedresult); print "
\n";
-var_dump($client->tmp_create_user(array('username' => "mockuser66",'firstname' => "firstname6",'lastname' => "lastname6",'email' => "mockuser6@mockuser6.com",'password' => "password6")));
+var_dump($client->tmp_create_users(array(array('username' => "mockuser66",'firstname' => "firstname6",'lastname' => "lastname6",'email' => "mockuser6@mockuser6.com",'password' => "password6"))));
 print "
"; print "
\n";
-var_dump($client->tmp_update_user(array('mnethostid' => 1,'username' => "mockuser66",'newusername' => "mockuser6b",'firstname' => "firstname6b")));
+var_dump($client->tmp_update_users(array(array('username' => "mockuser66",'newusername' => "mockuser6b",'firstname' => "firstname6b"))));
 print "
"; print "
\n";
-var_dump($client->tmp_delete_user(array('username' => "mockuser6b",'mnethostid' => 1)));
+var_dump($client->tmp_delete_users(array(array('username' => "mockuser6b"))));
 print "
"; -print "
\n";
-var_dump($client->tmp_do_multiple_user_searches(array(array('search' => "jerome"),array('search' => "mock"))));
-print "
"; +//print "
\n";
+//var_dump($client->tmp_do_multiple_user_searches(array(array('search' => "jerome"),array('search' => "mock"))));
+//print "
"; print_footer(); -//function call_soap_function($client,$functionname,$param,$expectedresult) { -// print "
\n";
-//    var_dump($client->$functionname($param));
-//    print "
"; -//} +function call_soap_function($client,$functionname,$param,$expectedresult) { + print "
\n";
+    var_dump($client->$functionname($param));
+    print "
"; +} function printLastRequestResponse($client) { diff --git a/webservice/xmlrpc/testclient/zend_xmlrpc_client.php b/webservice/xmlrpc/testclient/zend_xmlrpc_client.php index 261dd025f5..8acd88f084 100644 --- a/webservice/xmlrpc/testclient/zend_xmlrpc_client.php +++ b/webservice/xmlrpc/testclient/zend_xmlrpc_client.php @@ -41,13 +41,13 @@ var_dump($token); $client = new Zend_XmlRpc_Client($CFG->wwwroot."/webservice/xmlrpc/server.php?classpath=user&token=".$token); var_dump($users = $client->call('user.tmp_get_users', array(array('search' => "admin")))); print "

\n"; -var_dump($users = $client->call('user.tmp_create_user', array(array('username' => "mockuser66",'firstname' => "firstname6",'lastname' => "lastname6",'email' => "mockuser6@mockuser6.com",'password' => "password6")))); +var_dump($users = $client->call('user.tmp_create_users', array(array(array('firstname' => "firstname6",'username' => "mockuser66",'lastname' => "lastname6",'email' => "mockuser6@mockuser6.com",'password' => "password6"))))); print "

\n"; -var_dump($users = $client->call('user.tmp_update_user', array(array('username' => "mockuser66",'mnethostid' => 1,'newusername' => "mockuser6b",'firstname' => "firstname6b")))); -print "

\n"; -var_dump($users = $client->call('user.tmp_delete_user', array(array('username' => "mockuser6b",'mnethostid' => 1)))); -print "

\n"; -var_dump($users = $client->call('user.tmp_do_multiple_user_searches', array(array(array('search' => "jerome"),array('search' => "admin"))))); +var_dump($users = $client->call('user.tmp_update_users', array(array(array('username' => "mockuser66",'newusername' => "mockuser6b",'firstname' => "firstname6b"))))); print "

\n"; +var_dump($users = $client->call('user.tmp_delete_users', array(array(array('username' => "mockuser6b"))))); +//print "

\n"; +//var_dump($users = $client->call('user.tmp_do_multiple_user_searches', array(array(array('search' => "jerome"),array('search' => "admin"))))); +//print "

\n"; ?> \ No newline at end of file -- 2.39.5