Tests: fix MockRequestsBackend.get_api_call_arg edge cases

get_api_call_arg had incorrectly returned None if a kwarg was passed
to the mocked function with a False-y value (e.g., [] or {})

get_api_call_json had only considered data param, ignoring json param
requests added a while back
This commit is contained in:
medmunds
2018-01-17 13:53:06 -08:00
parent 2bf492c2f4
commit 5fb46952c6
3 changed files with 38 additions and 27 deletions

View File

@@ -51,20 +51,16 @@ class RequestsBackendMockAPITestCase(SimpleTestCase, AnymailTestMixin):
# This assumes the last (or only) call to requests.Session.request is the API call of interest.
if self.mock_request.call_args is None:
raise AssertionError("No ESP API was called")
(args, kwargs) = self.mock_request.call_args
try:
actual_method = kwargs.get('method', None) or args[1]
actual_url = kwargs.get('url', None) or args[2]
except IndexError:
raise AssertionError("API was called without a method or url (?!)")
if actual_method != method:
raise AssertionError("API was not called using %s. (%s was used instead.)"
% (method, actual_method))
if not actual_url.endswith(url):
raise AssertionError("API was not called at %s\n(It was called at %s)"
% (url, actual_url))
if method is not None:
actual_method = self.get_api_call_arg('method')
if actual_method != method:
self.fail("API was not called using %s. (%s was used instead.)" % (method, actual_method))
if url is not None:
actual_url = self.get_api_call_arg('url')
if not actual_url.endswith(url):
self.fail("API was not called at %s\n(It was called at %s)" % (url, actual_url))
def get_api_call_arg(self, kwarg, pos, required=True):
def get_api_call_arg(self, kwarg, required=True):
"""Returns an argument passed to the mock ESP API.
Fails test if API wasn't called.
@@ -73,36 +69,51 @@ class RequestsBackendMockAPITestCase(SimpleTestCase, AnymailTestMixin):
raise AssertionError("API was not called")
(args, kwargs) = self.mock_request.call_args
try:
return kwargs.get(kwarg, None) or args[pos]
except IndexError:
if required:
raise AssertionError("API was called without required %s" % kwarg)
else:
return None
return kwargs[kwarg]
except KeyError:
pass
try:
# positional arg? This is the order of requests.Session.request params:
pos = ('method', 'url', 'params', 'data', 'headers', 'cookies', 'files', 'auth',
'timeout', 'allow_redirects', 'proxies', 'hooks', 'stream', 'verify', 'cert', 'json',
).index(kwarg)
return args[pos]
except (ValueError, IndexError):
pass
if required:
self.fail("API was called without required arg '%s'" % kwarg)
return None
def get_api_call_params(self, required=True):
"""Returns the query params sent to the mock ESP API."""
return self.get_api_call_arg('params', 3, required)
return self.get_api_call_arg('params', required)
def get_api_call_data(self, required=True):
"""Returns the raw data sent to the mock ESP API."""
return self.get_api_call_arg('data', 4, required)
return self.get_api_call_arg('data', required)
def get_api_call_json(self, required=True):
"""Returns the data sent to the mock ESP API, json-parsed"""
return json.loads(self.get_api_call_data(required))
# could be either the data param (as json str) or the json param (needing formatting)
value = self.get_api_call_arg('data', required=False)
if value is not None:
return json.loads(value)
else:
return self.get_api_call_arg('json', required)
def get_api_call_headers(self, required=True):
"""Returns the headers sent to the mock ESP API"""
return self.get_api_call_arg('headers', 5, required)
return self.get_api_call_arg('headers', required)
def get_api_call_files(self, required=True):
"""Returns the files sent to the mock ESP API"""
return self.get_api_call_arg('files', 7, required)
return self.get_api_call_arg('files', required)
def get_api_call_auth(self, required=True):
"""Returns the auth sent to the mock ESP API"""
return self.get_api_call_arg('auth', 8, required)
return self.get_api_call_arg('auth', required)
def assert_esp_not_called(self, msg=None):
if self.mock_request.called: