def test__request(self, http_request_patched): ''' Test error handling. ''' url = 'www.testcase.com' handler = APIHandlerHTTP() resp = {'status': 200} content = '{}' http_request_patched.return_value = resp, content result = handler._request(url) self.assertEqual(result, {}) # Responded with invalid JSON. content = 'invalid JSON' http_request_patched.return_value = resp, content self.assertRaises(simplejson.JSONDecodeError, handler._request, url) content = "{error: 'Server error.'}" resp['status'] = 400 # Bad Request self.assertRaises(InvalidAPIInputError, handler._request, url) resp['status'] = 401 # Unauthorised self.assertRaises(APIConnectionError, handler._request, url) resp['status'] = 404 # Not Found self.assertRaises(NotFoundError, handler._request, url) resp['status'] = 500 # Internal Server Error self.assertRaises(UnknownAPIError, handler._request, url) resp['status'] = 200 http_request_patched.side_effect = socket.error() self.assertRaises(APIConnectionError, handler._request, url) http_request_patched.side_effect = httplib2.ServerNotFoundError() self.assertRaises(APIConnectionError, handler._request, url)
def test__attempt_request(self): handler = APIHandlerHTTP(attempts=3) handler._request = Mock() handler._request.return_value = {} self.assertEqual(handler._attempt_request(1, x=2), {}) handler._request.assert_called_once_with(1, x=2) # Raises out Exception if it is raised in every attempt. handler._request.side_effect = UnknownAPIError('') self.assertRaises(UnknownAPIError, handler._attempt_request, 3) self.assertEqual(handler._request.call_args_list, [((1, ), { 'x': 2 })] + [((3, ), {})] * 3) # Returns value after Exception being raised in earlier attempts. return_values = [{}, UnknownAPIError(''), APIConnectionError('')] def side_effect(*args, **kwargs): elem = return_values.pop() if isinstance(elem, APIError): raise elem else: return elem handler._request.side_effect = side_effect self.assertEqual(handler._attempt_request(4, y=5), {}) self.assertEqual(handler._request.call_args_list, [((1, ), { 'x': 2 })] + [((3, ), {})] * 3 + [((4, ), { 'y': 5 })] * 3)
def test_request(self): responses.add(responses.GET, 'http://example.com/api/1/valid', json={'data': 'ok'}) responses.add(responses.GET, 'http://example.com/api/1/missing', status=404) responses.add(responses.GET, 'http://example.com/api/1/unauthorized', status=401) responses.add(responses.GET, 'http://example.com/api/1/server_error', status=500) responses.add(responses.GET, 'http://example.com/api/1/decode_error', status=200, body='{"invalid"}', content_type='application/json') handler = APIHandlerHTTP() self.assertEqual(handler.request('http://example.com/api/1/valid'), {'data': 'ok'}) self.assertRaises(NotFoundError, handler.request, 'http://example.com/api/1/missing') self.assertRaises(APIError, handler.request, 'http://example.com/api/1/unauthorized') self.assertRaises(APIError, handler.request, 'http://example.com/api/1/server_error') self.assertRaises(APIError, handler.request, 'http://example.com/api/1/decode_error')
def test__attempt_request(self): handler = APIHandlerHTTP(attempts=3) handler._request = Mock() handler._request.return_value = {} self.assertEqual(handler._attempt_request(1, x=2), {}) handler._request.assert_called_once_with(1, x=2) # Raises out Exception if it is raised in every attempt. handler._request.side_effect = UnknownAPIError('') self.assertRaises(UnknownAPIError, handler._attempt_request, 3) self.assertEqual(handler._request.call_args_list, [((1,), {'x': 2})] + [((3,), {})] * 3) # Returns value after Exception being raised in earlier attempts. return_values = [{}, UnknownAPIError(''), APIConnectionError('')] def side_effect(*args, **kwargs): elem = return_values.pop() if isinstance(elem, APIError): raise elem else: return elem handler._request.side_effect = side_effect self.assertEqual(handler._attempt_request(4, y=5), {}) self.assertEqual(handler._request.call_args_list, [((1,), {'x': 2})] + [((3,), {})] * 3 + [((4,), {'y': 5})] * 3)