From a4c43eae014f20ae311307bf4536e4761346d418 Mon Sep 17 00:00:00 2001 From: abettadapur Date: Mon, 19 May 2014 11:43:31 -0400 Subject: [PATCH] V1 Tests JsonSchema Refactored V1 tests to include JsonSchema validation where appropriate Added necessary schema entries to the schema dictionary Implements: blueprint jsonschema-validation Change-Id: I474265948253a932ef3dbb45bca34b27b798447d --- marconi/queues/api/v1/response.py | 198 ++++++++++++++++++---- tests/functional/wsgi/v1/test_claims.py | 9 +- tests/functional/wsgi/v1/test_messages.py | 4 +- tests/functional/wsgi/v1/test_queues.py | 2 + 4 files changed, 181 insertions(+), 32 deletions(-) diff --git a/marconi/queues/api/v1/response.py b/marconi/queues/api/v1/response.py index 57c212c10..2a7655ae4 100644 --- a/marconi/queues/api/v1/response.py +++ b/marconi/queues/api/v1/response.py @@ -22,37 +22,43 @@ class ResponseSchema(api.Api): def __init__(self, limits): self.limits = limits - self.schema = { - 'message_get_many': { - "type": "array", - "items": { - "type": "object", - "properties": { - "href": { - "type": "string", - "pattern": "^(/v1/queues/[a-zA-Z0-9_-]{1,64}" - "/messages/[a-zA-Z0-9_-]+)$" - }, - "ttl": { - "type": "number", - "minimum": 1, - "maximum": self.limits.max_message_ttl - }, - "age": { - "type": "number", - "minimum": 0 - }, - "body": { - "type": "object" - } - }, - "required": ["href", "ttl", "age", "body"], - "additionalProperties": False, - }, - "minItems": 1, - "maxItems": self.limits.max_messages_per_page - }, + age = { + "type": "number", + "minimum": 0 + } + + message = { + "type": "object", + "properties": { + "href": { + "type": "string", + "pattern": "^(/v1/queues/[a-zA-Z0-9_-]" + "{1,64}/messages/[a-zA-Z0-9_-]+)$" + }, + "age": age, + "ttl": { + "type": "number", + "minimum": 1, + "maximum": self.limits.max_message_ttl + }, + + "body": { + "type": "object" + } + }, + "required": ["href", "ttl", "age", "body"], + "additionalProperties": False, + } + + claim_href = { + "type": "string", + "pattern": "^(/v1/queues/[a-zA-Z0-9_-]{1,64}" + "/messages/[a-zA-Z0-9_-]+)" + "\?claim_id=[a-zA-Z0-9_-]+$" + } + + self.schema = { 'queue_list': { 'type': 'object', 'properties': { @@ -103,5 +109,137 @@ class ResponseSchema(api.Api): }, 'required': ['links', 'queues'], 'additionalProperties': False, + }, + 'queue_stats': { + 'type': 'object', + 'properties': { + 'messages': { + 'type': 'object', + 'properties': { + 'free': { + 'type': 'number', + 'minimum': 0 + }, + 'claimed': { + 'type': 'number', + 'minimum': 0 + }, + 'total': { + 'type': 'number', + 'minimum': 0 + }, + 'oldest': { + 'type': 'object' + }, + 'newest': { + 'type': 'object' + } + + }, + 'required': ['free', 'claimed', 'total'], + 'additionalProperties': False + } + }, + 'required': ['messages'], + 'additionalProperties': False + }, + 'message_list': { + 'type': 'object', + 'properties': { + 'links': { + 'type': 'array', + 'items': { + 'type': 'object', + 'properties': { + 'rel': { + 'type': 'string' + }, + 'href': { + 'type': 'string', + 'pattern': '^/v1/queues/[a-zA-Z0-9_-]+' + '/messages\?(.)*$' + } + }, + 'required': ['rel', 'href'], + 'additionalProperties': False + } + }, + 'messages': { + "type": "array", + "items": message, + "minItems": 1, + "maxItems": self.limits.max_messages_per_claim + } + } + }, + 'message_get_many': { + "type": "array", + "items": message, + "minItems": 1, + "maxItems": self.limits.max_messages_per_page + }, + + 'claim_create': { + "type": "array", + "items": { + "type": "object", + "properties": { + "href": claim_href, + "ttl": { + "type": "number", + "minimum": 1, + "maximum": self.limits.max_message_ttl + }, + "age": age, + "body": { + "type": "object" + } + }, + "required": ["href", "ttl", "age", "body"], + "additionalProperties": False, + }, + "minItems": 1, + "maxItems": self.limits.max_messages_per_page + }, + + 'claim_get': { + 'type': 'object', + 'properties': { + 'age': age, + 'ttl': { + 'type': 'number', + 'minimum': 0, + 'maximum': self.limits.max_claim_ttl + }, + 'href': { + 'type': 'string', + 'pattern': '^/v1/queues/[a-zA-Z0-9_-]+' + '/claims/[a-zA-Z0-9_-]+$' + }, + 'messages': { + "type": "array", + "items": { + "type": "object", + "properties": { + "href": claim_href, + "ttl": { + "type": "number", + "minimum": 1, + "maximum": self.limits.max_message_ttl + }, + "age": age, + "body": { + "type": "object" + } + }, + "required": ["href", "ttl", "age", "body"], + "additionalProperties": False, + }, + "minItems": 1, + "maxItems": self.limits.max_messages_per_page + } + }, + 'required': ['age', 'ttl', 'messages', 'href'], + 'additionalProperties': False } } diff --git a/tests/functional/wsgi/v1/test_claims.py b/tests/functional/wsgi/v1/test_claims.py index 068cf6895..faf117c78 100644 --- a/tests/functional/wsgi/v1/test_claims.py +++ b/tests/functional/wsgi/v1/test_claims.py @@ -52,7 +52,8 @@ class TestClaims(base.FunctionalTestBase): @ddt.data({}, dict(limit=2)) def test_claim_messages(self, params): """Claim messages.""" - message_count = params.get('limit', 10) + message_count = params.get('limit', + self.limits.max_messages_per_claim) doc = {"ttl": 300, "grace": 100} @@ -65,6 +66,9 @@ class TestClaims(base.FunctionalTestBase): response_headers = set(result.headers.keys()) self.assertIsSubset(self.headers_response_with_body, response_headers) + # NOTE(abettadapur) This fails because of Bug #1321840 + # self.assertSchema(result.json(), 'claim_create') + test_claim_messages.tags = ['smoke', 'positive'] def test_query_claim(self): @@ -80,6 +84,9 @@ class TestClaims(base.FunctionalTestBase): result = self.client.get(url) self.assertEqual(result.status_code, 200) + # NOTE(abettadapur) This fails because of Bug #1321840 + # self.assertSchema(result.json(), 'claim_get') + test_query_claim.tags = ['smoke', 'positive'] def test_claim_more_than_allowed(self): diff --git a/tests/functional/wsgi/v1/test_messages.py b/tests/functional/wsgi/v1/test_messages.py index 6c03e7711..1e54b09f0 100644 --- a/tests/functional/wsgi/v1/test_messages.py +++ b/tests/functional/wsgi/v1/test_messages.py @@ -137,7 +137,7 @@ class TestMessages(base.FunctionalTestBase): test_message_bulk_insert.tags = ['smoke', 'positive'] - @ddt.data({}, {'limit': 5}) + @ddt.data({'limit': 10}, {'limit': 5}) def test_get_message(self, params): """Get Messages.""" @@ -161,6 +161,7 @@ class TestMessages(base.FunctionalTestBase): if result.status_code == 200: actual_msg_count = len(result.json()['messages']) self.assertMessageCount(actual_msg_count, expected_msg_count) + self.assertSchema(result.json(), 'message_list') href = result.json()['links'][0]['href'] url = self.cfg.marconi.url + href @@ -244,6 +245,7 @@ class TestMessages(base.FunctionalTestBase): url += ',nonexisting' result = self.client.get(url) self.assertEqual(result.status_code, 200) + self.assertSchema(result.json(), "message_get_many") test_message_partial_get.tags = ['negative'] diff --git a/tests/functional/wsgi/v1/test_queues.py b/tests/functional/wsgi/v1/test_queues.py index ab3558d77..08c0d0c4a 100644 --- a/tests/functional/wsgi/v1/test_queues.py +++ b/tests/functional/wsgi/v1/test_queues.py @@ -369,6 +369,7 @@ class TestQueueMisc(base.FunctionalTestBase): expected_response = {'messages': {'claimed': 0, 'total': 0, 'free': 0}} self.assertEqual(result.json(), expected_response) + self.assertSchema(result.json(), 'queue_stats') test_get_stats_empty_queue.tags = ['positive'] @@ -399,6 +400,7 @@ class TestQueueMisc(base.FunctionalTestBase): self.assertEqual(result.status_code, 200) self.assertQueueStats(result.json(), claimed) + self.assertSchema(result.json(), 'queue_stats') test_get_queue_stats_claimed.tags = ['positive']