Skip to content

Commit b3257ce

Browse files
jmctwiliotmconnors
authored andcommitted
[DEVX-5241] Add last_request and last_response to client. (#382)
* [DEVX-5241] Add last_request and last_response to client. * [DEVX-5241] Add tests for last_request and last_response. * [DEVX-5241] Setting last_request before the request is sent just in case. * last_response and last_request are Twilio objects, tests to assert proper contructions and setting none on request exception
1 parent 823a60b commit b3257ce

File tree

2 files changed

+45
-3
lines changed

2 files changed

+45
-3
lines changed

tests/unit/http/test_http_client.py

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414

1515

1616
class TestHttpClientRequest(unittest.TestCase):
17-
1817
def setUp(self):
1918
self.session_patcher = patch('twilio.http.http_client.Session')
2019

@@ -40,6 +39,8 @@ def test_request_sets_host_header_if_missing(self):
4039
self.client.request('doesnt matter', 'doesnt matter')
4140

4241
self.assertEqual('other.twilio.com', self.request_mock.headers['Host'])
42+
self.assertIsNotNone(self.client.last_request)
43+
self.assertIsNotNone(self.client.last_response)
4344

4445
def test_request_with_unicode_response(self):
4546
self.request_mock.url = 'https://api.twilio.com/'
@@ -51,6 +52,38 @@ def test_request_with_unicode_response(self):
5152
self.assertEqual(200, response.status_code)
5253
self.assertEqual('testing-unicode: Ω≈ç√, 💩', response.content)
5354

55+
def test_last_request_last_response_exist(self):
56+
self.request_mock.url = 'https://api.twilio.com/'
57+
self.request_mock.headers = {'Host': 'other.twilio.com'}
58+
59+
self.client.request('doesnt-matter-method',
60+
'doesnt-matter-url',
61+
{'params-value': 'params-key'},
62+
{'data-value': 'data-key'},
63+
{'headers-value': 'headers-key'},
64+
['a', 'b'])
65+
66+
self.assertIsNotNone(self.client.last_request)
67+
self.assertEqual('doesnt-matter-url', self.client.last_request.url)
68+
self.assertEqual('DOESNT-MATTER-METHOD', self.client.last_request.method)
69+
self.assertEqual({'params-value': 'params-key'}, self.client.last_request.params)
70+
self.assertEqual({'data-value': 'data-key'}, self.client.last_request.data)
71+
self.assertEqual({'headers-value': 'headers-key'}, self.client.last_request.headers)
72+
self.assertEqual(['a', 'b'], self.client.last_request.auth)
73+
74+
self.assertIsNotNone(self.client.last_response)
75+
self.assertEqual(200, self.client.last_response.status_code)
76+
self.assertEqual('testing-unicode: Ω≈ç√, 💩', self.client.last_response.text)
77+
78+
def test_last_response_empty_on_error(self):
79+
self.session_mock.send.side_effect = Exception('voltron')
80+
81+
with self.assertRaises(Exception):
82+
self.client.request('doesnt-matter', 'doesnt-matter')
83+
84+
self.assertIsNotNone(self.client.last_request)
85+
self.assertIsNone(self.client.last_response)
86+
5487

5588
class TestHttpClientSession(unittest.TestCase):
5689

twilio/http/http_client.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from twilio.http import HttpClient
44
from twilio.http.response import Response
5+
from twilio.http.request import Request as TwilioRequest
56

67

78
class TwilioHttpClient(HttpClient):
@@ -10,7 +11,9 @@ class TwilioHttpClient(HttpClient):
1011
"""
1112
def __init__(self, pool_connections=True):
1213
self.session = Session() if pool_connections else None
13-
14+
self.last_request = None
15+
self.last_response = None
16+
1417
def request(self, method, url, params=None, data=None, headers=None, auth=None, timeout=None,
1518
allow_redirects=False):
1619
"""
@@ -29,8 +32,12 @@ def request(self, method, url, params=None, data=None, headers=None, auth=None,
2932
:return: An http response
3033
:rtype: A :class:`Response <twilio.rest.http.response.Response>` object
3134
"""
35+
36+
self.last_response = None
3237
session = self.session or Session()
3338
request = Request(method.upper(), url, params=params, data=data, headers=headers, auth=auth)
39+
self.last_request = TwilioRequest(method.upper(), url, auth=auth, params=params, data=data,
40+
headers=headers)
3441

3542
prepped_request = session.prepare_request(request)
3643
response = session.send(
@@ -39,4 +46,6 @@ def request(self, method, url, params=None, data=None, headers=None, auth=None,
3946
timeout=timeout,
4047
)
4148

42-
return Response(int(response.status_code), response.text)
49+
self.last_response = Response(int(response.status_code), response.text)
50+
51+
return self.last_response

0 commit comments

Comments
 (0)