Merge "Add schema validation to update user v2"

This commit is contained in:
Jenkins 2016-08-04 04:26:55 +00:00 committed by Gerrit Code Review
commit 4605f90283
4 changed files with 81 additions and 42 deletions

View File

@ -95,13 +95,10 @@ class User(controller.V2Controller):
@controller.v2_deprecated
def update_user(self, request, user_id, user):
# NOTE(termie): this is really more of a patch than a put
validation.lazy_validate(schema.user_update_v2, user)
user = self.normalize_username_in_request(user)
self.assert_admin(request)
if 'enabled' in user and not isinstance(user['enabled'], bool):
msg = _('Enabled field should be a boolean')
raise exception.ValidationError(message=msg)
default_project_id = user.pop('tenantId', None)
if default_project_id is not None:
user['default_project_id'] = default_project_id

View File

@ -22,6 +22,28 @@ _identity_name = {
'pattern': '[\S]+'
}
# Schema for Identity v2 API
_user_properties_v2 = {
'description': validation.nullable(parameter_types.description),
'enabled': parameter_types.boolean,
'tenantId': validation.nullable(parameter_types.id_string),
'name': _identity_name,
'username': _identity_name,
'password': {
'type': ['string', 'null']
}
}
user_update_v2 = {
'type': 'object',
'properties': _user_properties_v2,
'minProperties': 0,
'additionalProperties': True
}
# Schema for Identity v3 API
_user_properties = {
'default_project_id': validation.nullable(parameter_types.id_string),
'description': validation.nullable(parameter_types.description),

View File

@ -447,31 +447,6 @@ class IdentityTests(object):
user['id'],
user)
def test_update_user_blank_name_fails(self):
user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id)
user = self.identity_api.create_user(user)
user['name'] = ''
self.assertRaises(exception.ValidationError,
self.identity_api.update_user,
user['id'],
user)
def test_update_user_invalid_name_fails(self):
user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id)
user = self.identity_api.create_user(user)
user['name'] = None
self.assertRaises(exception.ValidationError,
self.identity_api.update_user,
user['id'],
user)
user['name'] = 123
self.assertRaises(exception.ValidationError,
self.identity_api.update_user,
user['id'],
user)
def test_list_users(self):
users = self.identity_api.list_users(
domain_scope=self._set_domain_scope(
@ -568,19 +543,6 @@ class IdentityTests(object):
user_ref = self.identity_api.get_user(user_ref['id'])
self.assertEqual(changed_name, user_ref['name'])
def test_update_user_enable_fails(self):
user = unit.new_user_ref(domain_id=CONF.identity.default_domain_id)
user = self.identity_api.create_user(user)
user_ref = self.identity_api.get_user(user['id'])
self.assertTrue(user_ref['enabled'])
# Strings are not valid boolean values
user['enabled'] = 'false'
self.assertRaises(exception.ValidationError,
self.identity_api.update_user,
user['id'],
user)
def test_add_user_to_group(self):
domain = self._get_domain_fixture()
new_group = unit.new_group_ref(domain_id=domain['id'])

View File

@ -17,6 +17,7 @@ from keystone.assignment import schema as assignment_schema
from keystone.catalog import schema as catalog_schema
from keystone.common.validation import validators
from keystone import exception
from keystone.identity import schema as identity_schema
from keystone.resource import schema as resource_schema
from keystone.tests import unit
@ -302,3 +303,60 @@ class ServiceValidationTestCase(unit.BaseTestCase):
self.assertRaises(exception.SchemaValidationError,
self.create_validator.validate,
request)
class UserValidationTestCase(unit.BaseTestCase):
"""Test for V2 User API Validation."""
def setUp(self):
super(UserValidationTestCase, self).setUp()
schema_user_update = identity_schema.user_update_v2
self.update_validator = validators.SchemaValidator(schema_user_update)
def test_validate_user_update_succeeds_with_name(self):
request = {
'name': uuid.uuid4().hex,
'enabled': True
}
self.update_validator.validate(request)
def test_validate_user_update_succeeds_with_username(self):
request = {
'username': uuid.uuid4().hex,
'enabled': True
}
self.update_validator.validate(request)
def test_validate_user_update_succeeds_with_no_params(self):
request = {}
self.update_validator.validate(request)
def test_validate_user_update_fails_with_invalid_name(self):
for invalid_name in _INVALID_NAMES:
request = {
'name': invalid_name
}
self.assertRaises(exception.SchemaValidationError,
self.update_validator.validate,
request)
def test_validate_user_update_with_enabled(self):
"""Validate `enabled` as boolean-like values."""
for valid_enabled in _VALID_ENABLED_FORMATS:
request = {
'name': uuid.uuid4().hex,
'enabled': valid_enabled
}
self.update_validator.validate(request)
def test_validate_user_update_with_invalid_enabled_fails(self):
"""Exception is raised when `enabled` isn't a boolean-like value."""
for invalid_enabled in _INVALID_ENABLED_FORMATS:
request = {
'name': uuid.uuid4().hex,
'enabled': invalid_enabled
}
self.assertRaises(exception.SchemaValidationError,
self.update_validator.validate,
request)