8000 BREAKING CHANGE feat: add custom HTTP header support (#501) · aditya274/twilio-python@8b0fb5c · GitHub
[go: up one dir, main page]

Skip to content

Commit 8b0fb5c

Browse files
authored
BREAKING CHANGE feat: add custom HTTP header support (twilio#501)
* add custom header support * add header testing to holodeck
1 parent 04452d4 commit 8b0fb5c

File tree

53 files changed

+874
-295
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

53 files changed

+874
-295
lines changed

tests/holodeck.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
from twilio.base.exceptions import TwilioRestException
22
from twilio.http import HttpClient
33
from twilio.http.request import Request
4+
import platform
5+
from twilio import __version__
46

57

68
class Hologram(object):
@@ -24,9 +26,26 @@ def mock(self, response, request=None):
2426
def requests(self):
2527
return self._requests
2628

29+
def add_standard_headers(self, request):
30+
standard_headers = {
31+
'User-Agent': 'twilio-python/{} (Python {})'.format(
32+
__version__,
33+
platform.python_version()),
34+
'X-Twilio-Client': 'python-{}'.format(__version__),
35+
'Accept': 'application/json',
36+
'Accept-Charset': 'utf-8'
37+
}
38+
39+
if request.method == 'POST' and 'Content-Type' not in standard_headers:
40+
standard_headers['Content-Type'] = 'application/x-www-form-urlencoded'
41+
42+
standard_headers.update(request.headers)
43+
request.headers = standard_headers
44+
return request
45+
2746
def assert_has_request(self, request):
2847
for req in self.requests:
29-
if req == request:
48+
if req == request or req == self.add_standard_headers(request):
3049
return
3150

3251
message = '\nHolodeck never received a request matching: \n + {}\n'.format(request)

tests/integration/authy/v1/service/entity/factor/test_challenge.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,13 @@ def test_create_request(self):
2121
self.client.authy.v1.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
2222
.entities(identity="identity") \
2323
.factors(sid="YFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
24-
.challenges.create()
24+
.challenges.create(twilio_authy_sandbox_mode="twilio_authy_sandbox_mode")
2525

26+
headers = {'Twilio-Authy-Sandbox-Mode': "twilio_authy_sandbox_mode", }
2627
self.holodeck.assert_has_request(Request(
2728
'post',
2829
'https://authy.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Entities/identity/Factors/YFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Challenges',
30+
headers=headers,
2931
))
3032

3133
def test_create_response(self):
@@ -68,11 +70,13 @@ def test_delete_request(self):
6870
self.client.authy.v1.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
6971
.entities(identity="identity") \
7072
.factors(sid="YFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
71-
.challenges(sid="sid").delete()
73+
.challenges(sid="sid").delete(twilio_authy_sandbox_mode="twilio_authy_sandbox_mode")
7274

75+
headers = {'Twilio-Authy-Sandbox-Mode': "twilio_authy_sandbox_mode", }
7376
self.holodeck.assert_has_request(Request(
7477
'delete',
7578
'https://authy.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Entities/identity/Factors/YFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Challenges/sid',
79+
headers=headers,
7680
))
7781

7882
def test_delete_response(self):
@@ -95,11 +99,13 @@ def test_fetch_request(self):
9599
self.client.authy.v1.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
96100
.entities(identity="identity") \
97101
.factors(sid="YFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
98-
.challenges(sid="sid").fetch()
102+
.challenges(sid="sid").fetch(twilio_authy_sandbox_mode="twilio_authy_sandbox_mode")
99103

104+
headers = {'Twilio-Authy-Sandbox-Mode': "twilio_authy_sandbox_mode", }
100105
self.holodeck.assert_has_request(Request(
101106
'get',
102107
'https://authy.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Entities/identity/Factors/YFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Challenges/sid',
108+
headers=headers,
103109
))
104110

105111
def test_fetch_sid_response(self):
@@ -175,11 +181,13 @@ def test_update_request(self):
175181
self.client.authy.v1.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
176182
.entities(identity="identity") \
177183
.factors(sid="YFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
178-
.challenges(sid="sid").update()
184+
.challenges(sid="sid").update(twilio_authy_sandbox_mode="twilio_authy_sandbox_mode")
179185

186+
headers = {'Twilio-Authy-Sandbox-Mode': &quo F438 t;twilio_authy_sandbox_mode", }
180187
self.holodeck.assert_has_request(Request(
181188
'post',
182189
'https://authy.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Entities/identity/Factors/YFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Challenges/sid',
190+
headers=headers,
183191
))
184192

185193
def test_verify_sid_response(self):

tests/integration/authy/v1/service/entity/test_factor.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,16 @@ def test_create_request(self):
2020
with self.assertRaises(TwilioException):
2121
self.client.authy.v1.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
2222
.entities(identity="identity") \
23-
.factors.create(binding="binding", friendly_name="friendly_name", factor_type="app-push")
23+
.factors.create(binding="binding", friendly_name="friendly_name", factor_type="app-push", twilio_authy_sandbox_mode="twilio_authy_sandbox_mode")
2424

2525
values = {'Binding': "binding", 'FriendlyName': "friendly_name", 'FactorType': "app-push", }
2626

27+
headers = {'Twilio-Authy-Sandbox-Mode': "twilio_authy_sandbox_mode", }
28+
self.holodeck.assert_has_request(Request(
29+
'post',
30+
'https://authy.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Entities/identity/Factors',
31+
headers=headers,
32+
))
2733
self.holodeck.assert_has_request(Request(
2834
'post',
2935
'https://authy.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Entities/identity/Factors',
@@ -66,11 +72,13 @@ def test_delete_request(self):
6672
with self.assertRaises(TwilioException):
6773
self.client.authy.v1.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
6874
.entities(identity="identity") \
69-
.factors(sid="YFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX").delete()
75+
.factors(sid="YFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX").delete(twilio_authy_sandbox_mode="twilio_authy_sandbox_mode")
7076

77+
headers = {'Twilio-Authy-Sandbox-Mode': "twilio_authy_sandbox_mode", }
7178
self.holodeck.assert_has_request(Request(
7279
'delete',
7380
'https://authy.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Entities/identity/Factors/YFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
81+
headers=headers,
7482
))
7583

7684
def test_delete_response(self):
@@ -91,11 +99,13 @@ def test_fetch_request(self):
9199
with self.assertRaises(TwilioException):
92100
self.client.authy.v1.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
93101
.entities(identity="identity") \
94-
.factors(sid="YFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX").fetch()
102+
.factors(sid="YFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX").fetch(twilio_authy_sandbox_mode="twilio_authy_sandbox_mode")
95103

104+
headers = {'Twilio-Authy-Sandbox-Mode': "twilio_authy_sandbox_mode", }
96105
self.holodeck.assert_has_request(Request(
97106
'get',
98107
'https://authy.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Entities/identity/Factors/YFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
108+
headers=headers,
99109
))
100110

101111
def test_fetch_response(self):
@@ -134,11 +144,13 @@ def test_list_request(self):
134144
with self.assertRaises(TwilioException):
135145
self.client.authy.v1.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
136146
.entities(identity="identity") \
137-
.factors.list()
147+
.factors.list(twilio_authy_sandbox_mode="twilio_authy_sandbox_mode")
138148

149+
headers = {'Twilio-Authy-Sandbox-Mode': "twilio_authy_sandbox_mode", }
139150
self.holodeck.assert_has_request(Request(
140151
'get',
141152
'https://authy.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Entities/identity/Factors',
153+
headers=headers,
142154
))
143155

144156
def test_read_empty_response(self):
@@ -215,11 +227,13 @@ def test_update_request(self):
215227
with self.assertRaises(TwilioException):
216228
self.client.authy.v1.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
217229
.entities(identity="identity") \
218-
.factors(sid="YFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX").update()
230+
.factors(sid="YFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX").update(twilio_authy_sandbox_mode="twilio_authy_sandbox_mode")
219231

232+
headers = {'Twilio-Authy-Sandbox-Mode': "twilio_authy_sandbox_mode", }
220233
self.holodeck.assert_has_request(Request(
221234
'post',
222235
'https://authy.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Entities/identity/Factors/YFXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
236+
headers=headers,
223237
))
224238

225239
def test_verify_response(self):

tests/integration/authy/v1/service/test_entity.py

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,16 @@ def test_create_request(self):
1919

2020
with self.assertRaises(TwilioException):
2121
self.client.authy.v1.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
22-
.entities.create(identity="identity")
22+
.entities.create(identity="identity", twilio_authy_sandbox_mode="twilio_authy_sandbox_mode")
2323

2424
values = {'Identity': "identity", }
2525

26+
headers = {'Twilio-Authy-Sandbox-Mode': "twilio_authy_sandbox_mode", }
27+
self.holodeck.assert_has_request(Request(
28+
'post',
29+
'https://authy.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Entities',
30+
headers=headers,
31+
))
2632
self.holodeck.assert_has_request(Request(
2733
'post',
2834
'https://authy.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Entities',
@@ -58,11 +64,13 @@ def test_delete_request(self):
5864

5965
with self.assertRaises(TwilioException):
6066
self.client.authy.v1.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
61-
.entities(identity="identity").delete()
67+
.entities(identity="identity").delete(twilio_authy_sandbox_mode="twilio_authy_sandbox_mode")
6268

69+
headers = {'Twilio-Authy-Sandbox-Mode': "twilio_authy_sandbox_mode", }
6370
self.holodeck.assert_has_request(Request(
6471
'delete',
6572
'https://authy.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Entities/identity',
73+
headers=headers,
6674
))
6775

6876
def test_delete_response(self):
@@ -81,11 +89,13 @@ def test_fetch_request(self):
8189

8290
with self.assertRaises(TwilioException):
8391
self.client.authy.v1.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
84-
.entities(identity="identity").fetch()
92+
.entities(identity="identity").fetch(twilio_authy_sandbox_mode="twilio_authy_sandbox_mode")
8593

94+
headers = {'Twilio-Authy-Sandbox-Mode': "twilio_authy_sandbox_mode", }
8695
self.holodeck.assert_has_request(Request(
8796
'get',
8897
'https://authy.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Entities/identity',
98+
headers=headers,
8999
))
90100

91101
def test_fetch_response(self):
@@ -117,11 +127,13 @@ def test_list_request(self):
117127

118128
with self.assertRaises(TwilioException):
119129
self.client.authy.v1.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
120-
.entities.list()
130+
.entities.list(twilio_authy_sandbox_mode="twilio_authy_sandbox_mode")
121131

132+
headers = {'Twilio-Authy-Sandbox-Mode': "twilio_authy_sandbox_mode", }
122133
self.holodeck.assert_has_request(Request(
123134
'get',
124135
'https://authy.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Entities',
136+
headers=headers,
125137
))
126138

127139
def test_read_empty_response(self):

tests/integration/authy/v1/test_service.py

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,16 @@ def test_create_request(self):
1818
self.holodeck.mock(Response(500, ''))
1919

2020
with self.assertRaises(TwilioException):
21-
self.client.authy.v1.services.create(friendly_name="friendly_name")
21+
self.client.authy.v1.services.create(friendly_name="friendly_name", twilio_authy_sandbox_mode="twilio_authy_sandbox_mode")
2222

2323
values = {'FriendlyName': "friendly_name", }
2424

25+
headers = {'Twilio-Authy-Sandbox-Mode': "twilio_authy_sandbox_mode", }
26+
self.holodeck.assert_has_request(Request(
27+
'post',
28+
'https://authy.twilio.com/v1/Services',
29 57AE +
headers=headers,
30+
))
2531
self.holodeck.assert_has_request(Request(
2632
'post',
2733
'https://authy.twilio.com/v1/Services',
@@ -54,11 +60,13 @@ def test_delete_request(self):
5460
self.holodeck.mock(Response(500, ''))
5561

5662
with self.assertRaises(TwilioException):
57-
self.client.authy.v1.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX").delete()
63+
self.client.authy.v1.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX").delete(twilio_authy_sandbox_mode="twilio_authy_sandbox_mode")
5864

65+
headers = {'Twilio-Authy-Sandbox-Mode': "twilio_authy_sandbox_mode", }
5966
self.holodeck.assert_has_request(Request(
6067
'delete',
6168
'https://authy.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
69+
headers=headers,
6270
))
6371

6472
def test_delete_response(self):
@@ -75,11 +83,13 @@ def test_fetch_request(self):
7583
self.holodeck.mock(Response(500, ''))
7684

7785
with self.assertRaises(TwilioException):
78-
self.client.authy.v1.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX").fetch()
86+
self.client.authy.v1.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX").fetch(twilio_authy_sandbox_mode="twilio_authy_sandbox_mode")
7987

88+
headers = {'Twilio-Authy-Sandbox-Mode': "twilio_authy_sandbox_mode", }
8089
self.holodeck.assert_has_request(Request(
8190
'get',
8291
'https://authy.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
92+
headers=headers,
8393
))
8494

8595
def test_fetch_response(self):
@@ -108,11 +118,13 @@ def test_list_request(self):
108118
self.holodeck.mock(Response(500, ''))
109119

110120
with self.assertRaises(TwilioException):
111-
self.client.authy.v1.services.list()
121+
self.client.authy.v1.services.list(twilio_authy_sandbox_mode="twilio_authy_sandbox_mode")
112122

123+
headers = {'Twilio-Authy-Sandbox-Mode': "twilio_authy_sandbox_mode", }
113124
self.holodeck.assert_has_request(Request(
114125
'get',
115126
'https://authy.twilio.com/v1/Services',
127+
headers=headers,
116128
))
117129

118130
def test_read_empty_response(self):
@@ -177,11 +189,13 @@ def test_update_request(self):
177189
self.holodeck.mock(Response(500, ''))
178190

179191
with self.assertRaises(TwilioException):
180-
self.client.authy.v1.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX").update()
192+
self.client.authy.v1.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX").update(twilio_authy_sandbox_mode="twilio_authy_sandbox_mode")
181193

194+
headers = {'Twilio-Authy-Sandbox-Mode': "twilio_authy_sandbox_mode", }
182195
self.holodeck.assert_has_request(Request(
183196
'post',
184197
'https://authy.twilio.com/v1/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
198+
headers=headers,
185199
))
186200

187201
def test_update_response(self):

tests/integration/chat/v2/service/channel/test_member.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,10 +60,16 @@ def test_create_request(self):
6060
with self.assertRaises(TwilioException):
6161
self.client.chat.v2.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
6262
.channels(sid="CHXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
63-
.members.create(identity="identity")
63+
.members.create(identity="identity", x_twilio_webhook_enabled="true")
6464

6565
values = {'Identity': "identity", }
6666

67+
headers = {'X-Twilio-Webhook-Enabled': "true", }
68+
self.holodeck.assert_has_request(Request(
69+
'post',
70+
'https://chat.twilio.com/v2/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Channels/CHXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Members',
71+
headers=headers,
72+
))
6773
self.holodeck.assert_has_request(Request(
6874
'post',
6975
'https://chat.twilio.com/v2/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Channels/CHXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Members',
@@ -181,11 +187,13 @@ def test_delete_request(self):
181187
with self.assertRaises(TwilioException):
182188
self.client.chat.v2.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
183189
.channels(sid="CHXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
184-
.members(sid="MBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX").delete()
190+
.members(sid="MBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX").delete(x_twilio_webhook_enabled="true")
185191

192+
headers = {'X-Twilio-Webhook-Enabled': "true", }
186193
self.holodeck.assert_has_request(Request(
187194
'delete',
188195
'https://chat.twilio.com/v2/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Channels/CHXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Members/MBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
196+
headers=headers,
189197
))
190198

191199
def test_delete_response(self):
@@ -206,11 +214,13 @@ def test_update_request(self):
206214
with self.assertRaises(TwilioException):
207215
self.client.chat.v2.services(sid="ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
208216
.channels(sid="CHXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") \
209-
.members(sid="MBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX").update()
217+
.members(sid="MBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX").update(x_twilio_webhook_enabled="true")
210218

219+
headers = {'X-Twilio-Webhook-Enabled': "true", }
211220
self.holodeck.assert_has_request(Request(
212221
'post',
213222
'https://chat.twilio.com/v2/Services/ISXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Channels/CHXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/Members/MBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
223+
headers=headers,
214224
))
215225

216226
def test_update_role_sid_response(self):

0 commit comments

Comments
 (0)
0