Skip to content

Commit 154814e

Browse files
committed
Adding BadGatewayError (502) and ServiceUnavailableError(503).
1 parent b3340e9 commit 154814e

File tree

3 files changed

+52
-23
lines changed

3 files changed

+52
-23
lines changed

intercom/__init__.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,11 @@ def wrapper(instance, value):
3636
return wrapper
3737

3838
from .intercom import AuthenticationError
39+
from .intercom import BadGatewayError
3940
from .intercom import Intercom
4041
from .intercom import ResourceNotFound
4142
from .intercom import ServerError
43+
from .intercom import ServiceUnavailableError
4244

4345
from .impression import Impression
4446
from .message_thread import MessageThread
@@ -47,6 +49,7 @@ def wrapper(instance, value):
4749
from .tag import Tag
4850

4951
__all__ = (
50-
AuthenticationError, Intercom, ResourceNotFound, ServerError,
51-
Impression, MessageThread, Note, User, Tag
52+
AuthenticationError, BadGatewayError, Intercom, ResourceNotFound,
53+
ServerError, ServiceUnavailableError, Impression, MessageThread,
54+
Note, User, Tag
5255
)

intercom/intercom.py

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ class AuthenticationError(IntercomError):
3535
pass
3636

3737

38+
class BadGatewayError(IntercomError):
39+
""" Raised when a request does not reach the API due to a 502. """
40+
pass
41+
42+
3843
class ResourceNotFound(IntercomError):
3944
""" Raised when a resource cannot be found e.g. a non-existant User. """
4045
pass
@@ -46,35 +51,36 @@ class ServerError(IntercomError):
4651
pass
4752

4853

54+
class ServiceUnavailableError(IntercomError):
55+
""" Raised when the API cannot be handle a request. """
56+
pass
57+
58+
4959
def api_call(func_to_decorate):
5060
""" Decorator for handling AWS credentials. """
5161
@functools.wraps(func_to_decorate)
5262
def wrapper(*args, **kwargs):
5363
""" Decorator closure. """
5464
response = func_to_decorate(*args, **kwargs)
55-
if response.status_code == 401:
56-
raise AuthenticationError("Invalid API key/username provided.")
57-
try:
58-
result = json.loads(response.content)
59-
except ValueError as err:
60-
if response.status_code == 404:
61-
raise ResourceNotFound("Not found.")
62-
raise ServerError(err.message)
63-
if response.status_code in (200, 201):
64-
pass
65-
else:
66-
# an error state try to get the error message
67-
error = result.get('error', {})
68-
message = error.get('message', 'Unknown error')
69-
70-
if response.status_code == 404:
71-
raise ResourceNotFound(message, result)
72-
else:
73-
raise ServerError(message, result)
65+
raise_errors_on_failure(response)
66+
result = json.loads(response.content)
7467
return result
7568
return wrapper
7669

7770

71+
def raise_errors_on_failure(response):
72+
if response.status_code == 404:
73+
raise ResourceNotFound("Not found.")
74+
elif response.status_code == 401:
75+
raise AuthenticationError("Invalid API key/username provided.")
76+
elif response.status_code == 500:
77+
raise ServerError("Server error.")
78+
elif response.status_code == 502:
79+
raise BadGatewayError("Bad gateway.")
80+
elif response.status_code == 503:
81+
raise ServiceUnavailableError("Service unavailable.")
82+
83+
7884
class Intercom(object):
7985
""" Intercom API Wrapper """
8086

tests/integration/test.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@
1313
FIXTURES = os.path.join(DIRPATH, 'fixtures')
1414

1515
from intercom import AuthenticationError
16+
from intercom import BadGatewayError
1617
from intercom import ResourceNotFound
1718
from intercom import ServerError
19+
from intercom import ServiceUnavailableError
1820
from intercom import Intercom
1921
from intercom import User
2022
from intercom import MessageThread
@@ -167,7 +169,7 @@ def test_endpoints():
167169

168170
@nottest
169171
@httpretty.activate
170-
def test_unreachable():
172+
def test_unreachable_endpoints():
171173
class ServiceUnavailableError(Exception):
172174
pass
173175
httpretty.register_uri(
@@ -181,9 +183,18 @@ class ServiceUnavailableError(Exception):
181183
.should.throw(ServiceUnavailableError)
182184

183185

186+
@httpretty.activate
187+
@raises(ServiceUnavailableError)
188+
def test_unreachable():
189+
httpretty.register_uri(
190+
get, r(r"/v1/users\?email="),
191+
status=503, match_querystring=True)
192+
User.find(email='somebody@example.com')
193+
194+
184195
@nottest
185196
@httpretty.activate
186-
def test_bad_gateway():
197+
def test_bad_gateway_endpoints():
187198
class BadGatewayError(Exception):
188199
pass
189200
httpretty.register_uri(
@@ -197,6 +208,15 @@ class BadGatewayError(Exception):
197208
.should.throw(BadGatewayError)
198209

199210

211+
@httpretty.activate
212+
@raises(BadGatewayError)
213+
def test_bad_gateway():
214+
httpretty.register_uri(
215+
get, r(r"/v1/users\?email="),
216+
status=502, match_querystring=True)
217+
User.find(email='somebody@example.com')
218+
219+
200220
@httpretty.activate
201221
def test_doctest():
202222
import doctest

0 commit comments

Comments
 (0)