Files
deb-python-gabbi/gabbi/tests/test_handlers.py
Mehdi Abaakouk 8dcab1a7bd Add more information when status assertion fail
Having the response output is useful to understand
why the status code doesn't match the expected one.
2015-08-06 08:00:01 +02:00

181 lines
6.8 KiB
Python

#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
"""Test response handlers.
"""
import json
import unittest
from gabbi import case
from gabbi import driver
from gabbi import handlers
class HandlersTest(unittest.TestCase):
"""Test the response handlers.
Note that this does not test the magic template variables, that
should be tested somewhere else.
"""
def setUp(self):
super(HandlersTest, self).setUp()
self.test_class = case.HTTPTestCase
self.test = driver.TestBuilder('mytest', (self.test_class,),
{'test_data': {}})
def test_response_strings(self):
handler = handlers.StringResponseHandler(self.test_class)
self.test.content_type = "text/plain"
self.test.json_data = None
self.test.test_data = {'response_strings': ['alpha', 'beta']}
self.test.output = 'alpha\nbeta\n'
self._assert_handler(handler)
def test_response_strings_fail(self):
handler = handlers.StringResponseHandler(self.test_class)
self.test.content_type = "text/plain"
self.test.json_data = None
self.test.test_data = {'response_strings': ['alpha', 'beta']}
self.test.output = 'alpha\nbta\n'
with self.assertRaises(AssertionError):
self._assert_handler(handler)
def test_response_strings_fail_big_output(self):
handler = handlers.StringResponseHandler(self.test_class)
self.test.content_type = "text/plain"
self.test.json_data = None
self.test.test_data = {'response_strings': ['alpha', 'beta']}
self.test.output = 'alpha\nbta\n' * 1000
with self.assertRaises(AssertionError) as cm:
self._assert_handler(handler)
msg = str(cm.exception)
self.assertEqual(2036, len(msg))
def test_response_strings_fail_big_payload(self):
handler = handlers.StringResponseHandler(self.test_class)
self.test.content_type = "application/json"
self.test.test_data = {'response_strings': ['foobar']}
self.test.json_data = {
'objects': [{'name': 'cw',
'location': 'barn'},
{'name': 'chris',
'location': 'house'}] * 100
}
self.test.output = json.dumps(self.test.json_data)
with self.assertRaises(AssertionError) as cm:
self._assert_handler(handler)
msg = str(cm.exception)
self.assertEqual(2038, len(msg))
# Check the pprint of the json
self.assertIn(' "location": "house"', msg)
def test_response_json_paths(self):
handler = handlers.JSONResponseHandler(self.test_class)
self.test.content_type = "application/json"
self.test.test_data = {'response_json_paths': {
'$.objects[0].name': 'cow',
'$.objects[1].location': 'house',
}}
self.test.json_data = {
'objects': [{'name': 'cow',
'location': 'barn'},
{'name': 'chris',
'location': 'house'}]
}
self._assert_handler(handler)
def test_response_json_paths_fail_data(self):
handler = handlers.JSONResponseHandler(self.test_class)
self.test.content_type = "application/json"
self.test.test_data = {'response_json_paths': {
'$.objects[0].name': 'cow',
'$.objects[1].location': 'house',
}}
self.test.json_data = {
'objects': [{'name': 'cw',
'location': 'barn'},
{'name': 'chris',
'location': 'house'}]
}
with self.assertRaises(AssertionError):
self._assert_handler(handler)
def test_response_json_paths_fail_path(self):
handler = handlers.JSONResponseHandler(self.test_class)
self.test.content_type = "application/json"
self.test.test_data = {'response_json_paths': {
'$.objects[1].name': 'cow',
}}
self.test.json_data = {
'objects': [{'name': 'cow',
'location': 'barn'},
{'name': 'chris',
'location': 'house'}]
}
with self.assertRaises(AssertionError):
self._assert_handler(handler)
def test_response_headers(self):
handler = handlers.HeadersResponseHandler(self.test_class)
self.test.response = {'content-type': 'text/plain'}
self.test.test_data = {'response_headers': {
'content-type': 'text/plain',
}}
self._assert_handler(handler)
self.test.test_data = {'response_headers': {
'Content-Type': 'text/plain',
}}
self._assert_handler(handler)
def test_response_headers_regex(self):
handler = handlers.HeadersResponseHandler(self.test_class)
self.test.test_data = {'response_headers': {
'content-type': '/text/plain/',
}}
self.test.response = {'content-type': 'text/plain; charset=UTF-8'}
self._assert_handler(handler)
def test_response_headers_fail_data(self):
handler = handlers.HeadersResponseHandler(self.test_class)
self.test.test_data = {'response_headers': {
'content-type': 'text/plain',
}}
self.test.response = {'content-type': 'application/json'}
with self.assertRaises(AssertionError) as failure:
self._assert_handler(handler)
self.assertIn("Expect header content-type with value text/plain,"
" got application/json",
str(failure.exception))
def test_response_headers_fail_header(self):
handler = handlers.HeadersResponseHandler(self.test_class)
self.test.test_data = {'response_headers': {
'location': '/somewhere',
}}
self.test.response = {'content-type': 'application/json'}
with self.assertRaises(AssertionError) as failure:
self._assert_handler(handler)
self.assertIn("'location' header not present in response:",
str(failure.exception))
def _assert_handler(self, handler):
# Instantiate our contained test class by naming its test
# method and then run its tests to confirm.
test = self.test('test_request')
handler(test)