From 8fe7c84f7105d7ee3d6b25d7b995e2e3c15d3b1d Mon Sep 17 00:00:00 2001 From: Rich Leland Date: Thu, 12 Jan 2017 13:28:53 -0500 Subject: [PATCH 1/3] Tweak SparkPostAPIException error handling --- sparkpost/exceptions.py | 12 +++++------- test/test_base.py | 14 ++++++++++++++ test/test_transmissions.py | 2 +- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/sparkpost/exceptions.py b/sparkpost/exceptions.py index 0fdb00d..86da1b8 100644 --- a/sparkpost/exceptions.py +++ b/sparkpost/exceptions.py @@ -8,14 +8,12 @@ def __init__(self, response, *args, **kwargs): errors = None try: errors = response.json()['errors'] - errors = [e['message'] + - ' Code: ' + e.get('code', '') + - ' Description: ' + e.get('description', '') + - '\n' + error_template = "{message} Code: {code} Description: {desc} \n" + errors = [error_template.format(message=e['message'], + code=e.get('code', 'none'), + desc=e.get('description', 'none')) for e in errors] - except: - pass - if not errors: + except ValueError: errors = [response.text or ""] self.status = response.status_code self.response = response diff --git a/test/test_base.py b/test/test_base.py index 0bd59cd..aff6b79 100644 --- a/test/test_base.py +++ b/test/test_base.py @@ -92,6 +92,20 @@ def test_fail_nojson_request(): resource.request('GET', resource.uri) +@responses.activate +def test_fail_no_errors(): + responses.add( + responses.GET, + fake_uri, + status=500, + content_type='application/json', + body='no errors' + ) + resource = create_resource() + with pytest.raises(SparkPostAPIException): + resource.request('GET', resource.uri) + + def test_fail_get(): resource = create_resource() with pytest.raises(NotImplementedError): diff --git a/test/test_transmissions.py b/test/test_transmissions.py index c2d4e32..9847fb2 100644 --- a/test/test_transmissions.py +++ b/test/test_transmissions.py @@ -333,7 +333,7 @@ def test_fail_delete(): content_type='application/json', body=""" {"errors": [{"message": "resource not found", - "description": "Resource not found:transmission id foobar""}]} + "description": "Resource not found:transmission id foobar"}]} """ ) with pytest.raises(SparkPostAPIException): From f99e3fc06ca584744bfb84357391c0eeae3d81b9 Mon Sep 17 00:00:00 2001 From: Rich Leland Date: Thu, 12 Jan 2017 13:31:00 -0500 Subject: [PATCH 2/3] Catch more than JSON parsing errors --- sparkpost/exceptions.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/sparkpost/exceptions.py b/sparkpost/exceptions.py index 86da1b8..b62d628 100644 --- a/sparkpost/exceptions.py +++ b/sparkpost/exceptions.py @@ -5,7 +5,6 @@ class SparkPostException(Exception): class SparkPostAPIException(SparkPostException): "Handle 4xx and 5xx errors from the SparkPost API" def __init__(self, response, *args, **kwargs): - errors = None try: errors = response.json()['errors'] error_template = "{message} Code: {code} Description: {desc} \n" @@ -13,7 +12,7 @@ def __init__(self, response, *args, **kwargs): code=e.get('code', 'none'), desc=e.get('description', 'none')) for e in errors] - except ValueError: + except: errors = [response.text or ""] self.status = response.status_code self.response = response From f343c2125e8885f376654f87e4577dc21d276c39 Mon Sep 17 00:00:00 2001 From: Rich Leland Date: Fri, 13 Jan 2017 14:50:27 -0500 Subject: [PATCH 3/3] Use get method to provide default for error message --- sparkpost/exceptions.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sparkpost/exceptions.py b/sparkpost/exceptions.py index b62d628..3c2a9e9 100644 --- a/sparkpost/exceptions.py +++ b/sparkpost/exceptions.py @@ -8,7 +8,7 @@ def __init__(self, response, *args, **kwargs): try: errors = response.json()['errors'] error_template = "{message} Code: {code} Description: {desc} \n" - errors = [error_template.format(message=e['message'], + errors = [error_template.format(message=e.get('message', ''), code=e.get('code', 'none'), desc=e.get('description', 'none')) for e in errors]