From 212489084fac8de20718bfccad2f77cbfa7ea3e2 Mon Sep 17 00:00:00 2001 From: Dolph Mathews Date: Fri, 10 Feb 2012 14:52:13 -0600 Subject: XML de/serialization (bug 928058) Middleware rewrites incoming XML requests as JSON, and outgoing JSON as XML, per Accept and Content-Type headers. Tests assert that core API methods support WADL/XSD specs, and cover JSON content as well. Change-Id: I6897971dd745766cbc472fd6e5346b1b34d933b0 --- tests/test_middleware.py | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) (limited to 'tests/test_middleware.py') diff --git a/tests/test_middleware.py b/tests/test_middleware.py index 01d6c8ed..d46348a4 100644 --- a/tests/test_middleware.py +++ b/tests/test_middleware.py @@ -14,6 +14,8 @@ # License for the specific language governing permissions and limitations # under the License. +import json + import webob from keystone import config @@ -25,15 +27,23 @@ CONF = config.CONF def make_request(**kwargs): + accept = kwargs.pop('accept', None) method = kwargs.pop('method', 'GET') body = kwargs.pop('body', None) req = webob.Request.blank('/', **kwargs) req.method = method if body is not None: req.body = body + if accept is not None: + req.accept = accept return req +def make_response(**kwargs): + body = kwargs.pop('body', None) + return webob.Response(body) + + class TokenAuthMiddlewareTest(test.TestCase): def test_request(self): req = make_request() @@ -97,3 +107,51 @@ class JsonBodyMiddlewareTest(test.TestCase): middleware.JsonBodyMiddleware(None).process_request(req) params = req.environ.get(middleware.PARAMS_ENV, {}) self.assertEqual(params, {}) + + +class XmlBodyMiddlewareTest(test.TestCase): + def test_client_wants_xml_back(self): + """Clients requesting XML should get what they ask for.""" + body = '{"container": {"attribute": "value"}}' + req = make_request(body=body, method='POST', accept='application/xml') + middleware.XmlBodyMiddleware(None).process_request(req) + resp = make_response(body=body) + middleware.XmlBodyMiddleware(None).process_response(req, resp) + self.assertEqual(resp.content_type, 'application/xml') + + def test_client_wants_json_back(self): + """Clients requesting JSON should definitely not get XML back.""" + body = '{"container": {"attribute": "value"}}' + req = make_request(body=body, method='POST', accept='application/json') + middleware.XmlBodyMiddleware(None).process_request(req) + resp = make_response(body=body) + middleware.XmlBodyMiddleware(None).process_response(req, resp) + self.assertNotIn('application/xml', resp.content_type) + + def test_client_fails_to_specify_accept(self): + """If client does not specify an Accept header, default to JSON.""" + body = '{"container": {"attribute": "value"}}' + req = make_request(body=body, method='POST') + middleware.XmlBodyMiddleware(None).process_request(req) + resp = make_response(body=body) + middleware.XmlBodyMiddleware(None).process_response(req, resp) + self.assertNotIn('application/xml', resp.content_type) + + def test_xml_replaced_by_json(self): + """XML requests should be replaced by JSON requests.""" + req = make_request( + body='', + content_type='application/xml', + method='POST') + middleware.XmlBodyMiddleware(None).process_request(req) + self.assertTrue(req.content_type, 'application/json') + self.assertTrue(json.loads(req.body)) + + def test_json_unnaffected(self): + """JSON-only requests should be unnaffected by the XML middleware.""" + content_type = 'application/json' + body = '{"container": {"attribute": "value"}}' + req = make_request(body=body, content_type=content_type, method='POST') + middleware.XmlBodyMiddleware(None).process_request(req) + self.assertEqual(req.body, body) + self.assertEqual(req.content_type, content_type) -- cgit