def test_validate_user_update(self): """Test the update data validation. """ # Missing username data = dict() self.assertRaises(userdata.UserNameRequiredError, userdata.user_update_fields_ok, data) # No other fields results in a NOOP data = dict(username="******") self.assertEquals(userdata.user_update_fields_ok(data), data) # Missing new_password is too small. data = dict(username="******", new_password="") self.assertRaises(userdata.PasswordTooSmallError, userdata.user_update_fields_ok, data) data = dict(username="******", new_password=None) self.assertRaises(userdata.PasswordTooSmallError, userdata.user_update_fields_ok, data) # trailing whitespace stripped: data = dict(username="******", new_password="******") correct = dict(username="******", new_password="******") self.assertEquals(userdata.user_update_fields_ok(data), correct)
def update(self, data): """Update the details about an existing user. :param data: This must contain the 'username' field at least. You only need to provide the fields that are to be updated. To change password, the "new_password" field is provided. :returns: A dict containing the updated user details. """ self.log.debug("update: validating given data") data = userdata.user_update_fields_ok(data) username = data['username'] self.log.debug("update: attempting to update user <%s>." % username) # TODO: at the moment this is travelling over the intranet we control, # however this needs much stronger protection i.e. HTTPS/SSL between # services talking to each other. # # obuscate for moment. if "new_password" in data: data["new_password"] = data["new_password"].encode("base64") uri = urljoin(self.base_uri, self.GET_UPDATE_OR_DELETE % dict( username=username, )) self.log.debug("update: uri <%s>" % uri) res = requests.put(uri, json.dumps(data), headers=self.JSON_CT) rc = res.json() if not rc['success']: raise userdata.UserServiceError(rc['message']) return rc['data']