Add unit tests for rest_client's json schema validation

Currently there is no unit tests for rest_client's validate_response()
which validate the json schema.

This commit adds unit tests for json schema validation part.

Change-Id: I78f67dafff8198c4169365164b53486a35cfda6d
This commit is contained in:
ghanshyam
2015-06-09 13:33:41 +09:00
parent f93048334c
commit ad2d4e9a3a

View File

@@ -642,3 +642,222 @@ class TestResponseBodyList(base.TestCase):
actual = rest_client.ResponseBodyList(response, body) actual = rest_client.ResponseBodyList(response, body)
self.assertEqual("response: %s\nBody: %s" % (response, body), self.assertEqual("response: %s\nBody: %s" % (response, body),
str(actual)) str(actual))
class TestJSONSchemaValidationBase(base.TestCase):
class Response(dict):
def __getattr__(self, attr):
return self[attr]
def __setattr__(self, attr, value):
self[attr] = value
def setUp(self):
super(TestJSONSchemaValidationBase, self).setUp()
self.fake_auth_provider = fake_auth_provider.FakeAuthProvider()
self.rest_client = rest_client.RestClient(
self.fake_auth_provider, None, None)
def _test_validate_pass(self, schema, resp_body, status=200):
resp = self.Response()
resp.status = status
self.rest_client.validate_response(schema, resp, resp_body)
def _test_validate_fail(self, schema, resp_body, status=200,
error_msg="HTTP response body is invalid"):
resp = self.Response()
resp.status = status
ex = self.assertRaises(exceptions.InvalidHTTPResponseBody,
self.rest_client.validate_response,
schema, resp, resp_body)
self.assertIn(error_msg, ex._error_string)
class TestRestClientJSONSchemaValidation(TestJSONSchemaValidationBase):
schema = {
'status_code': [200],
'response_body': {
'type': 'object',
'properties': {
'foo': {
'type': 'integer',
},
},
'required': ['foo']
}
}
def test_validate_pass(self):
body = {'foo': 12}
self._test_validate_pass(self.schema, body)
def test_validate_not_http_success_code(self):
schema = {
'status_code': [200]
}
body = {}
self._test_validate_pass(schema, body, status=400)
def test_validate_multiple_allowed_type(self):
schema = {
'status_code': [200],
'response_body': {
'type': 'object',
'properties': {
'foo': {
'type': ['integer', 'string'],
},
},
'required': ['foo']
}
}
body = {'foo': 12}
self._test_validate_pass(schema, body)
body = {'foo': '12'}
self._test_validate_pass(schema, body)
def test_validate_enable_additional_property_pass(self):
schema = {
'status_code': [200],
'response_body': {
'type': 'object',
'properties': {
'foo': {'type': 'integer'}
},
'additionalProperties': True,
'required': ['foo']
}
}
body = {'foo': 12, 'foo2': 'foo2value'}
self._test_validate_pass(schema, body)
def test_validate_disable_additional_property_pass(self):
schema = {
'status_code': [200],
'response_body': {
'type': 'object',
'properties': {
'foo': {'type': 'integer'}
},
'additionalProperties': False,
'required': ['foo']
}
}
body = {'foo': 12}
self._test_validate_pass(schema, body)
def test_validate_disable_additional_property_fail(self):
schema = {
'status_code': [200],
'response_body': {
'type': 'object',
'properties': {
'foo': {'type': 'integer'}
},
'additionalProperties': False,
'required': ['foo']
}
}
body = {'foo': 12, 'foo2': 'foo2value'}
self._test_validate_fail(schema, body)
def test_validate_wrong_status_code(self):
schema = {
'status_code': [202]
}
body = {}
resp = self.Response()
resp.status = 200
ex = self.assertRaises(exceptions.InvalidHttpSuccessCode,
self.rest_client.validate_response,
schema, resp, body)
self.assertIn("Unexpected http success status code", ex._error_string)
def test_validate_wrong_attribute_type(self):
body = {'foo': 1.2}
self._test_validate_fail(self.schema, body)
def test_validate_unexpected_response_body(self):
schema = {
'status_code': [200],
}
body = {'foo': 12}
self._test_validate_fail(
schema, body,
error_msg="HTTP response body should not exist")
def test_validate_missing_response_body(self):
body = {}
self._test_validate_fail(self.schema, body)
def test_validate_missing_required_attribute(self):
body = {'notfoo': 12}
self._test_validate_fail(self.schema, body)
def test_validate_response_body_not_list(self):
schema = {
'status_code': [200],
'response_body': {
'type': 'object',
'properties': {
'list_items': {
'type': 'array',
'items': {'foo': {'type': 'integer'}}
}
},
'required': ['list_items'],
}
}
body = {'foo': 12}
self._test_validate_fail(schema, body)
def test_validate_response_body_list_pass(self):
schema = {
'status_code': [200],
'response_body': {
'type': 'object',
'properties': {
'list_items': {
'type': 'array',
'items': {'foo': {'type': 'integer'}}
}
},
'required': ['list_items'],
}
}
body = {'list_items': [{'foo': 12}, {'foo': 10}]}
self._test_validate_pass(schema, body)
class TestRestClientJSONHeaderSchemaValidation(TestJSONSchemaValidationBase):
schema = {
'status_code': [200],
'response_header': {
'type': 'object',
'properties': {
'foo': {'type': 'integer'}
},
'required': ['foo']
}
}
def test_validate_header_schema_pass(self):
resp_body = {}
resp = self.Response()
resp.status = 200
resp.foo = 12
self.rest_client.validate_response(self.schema, resp, resp_body)
def test_validate_header_schema_fail(self):
resp_body = {}
resp = self.Response()
resp.status = 200
resp.foo = 1.2
ex = self.assertRaises(exceptions.InvalidHTTPResponseHeader,
self.rest_client.validate_response,
self.schema, resp, resp_body)
self.assertIn("HTTP response header is invalid", ex._error_string)