8000 Merge pull request #28 from wanjunsli/taskrouter-jwt · twilio/twilio-python@17e47db · GitHub
[go: up one dir, main page]

Skip to content

Commit 17e47db

Browse files
committed
Merge pull request #28 from wanjunsli/taskrouter-jwt
Taskrouter jwt
2 parents 689562e + 7435b95 commit 17e47db

File tree

6 files changed

+779
-114
lines changed

6 files changed

+779
-114
lines changed

tests/task_router/test_capability.py

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,23 @@ def test_defaults(self):
5555

5656
self.assertTrue(decoded is not None)
5757
websocket_url = (
58-
'https://event-bridge.twilio.com/v1/wschannels/%s/%s' %
59-
(self.account_sid, self.worker_sid)
58+
'https://event-bridge.twilio.com/v1/wschannels/{}/{}'.format(self.account_sid, self.worker_sid)
6059
)
6160
expected = [
61+
{
62+
'url': 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Activities',
63+
'method': 'GET',
64+
'allow': True,
65+
'query_filter': {},
66+
'post_filter': {},
67+
},
68+
{
69+
'url': 'https://taskrouter.twilio.com/v1/Workspaces/{}/Tasks/**'.format(self.workspace_sid),
70+
'method': 'GET',
71+
'allow': True,
72+
'query_filter': {},
73+
'post_filter': {},
74+
},
6275
{
6376
'url': websocket_url,
6477
'method': 'GET',
@@ -74,13 +87,12 @@ def test_defaults(self):
7487
'post_filter': {},
7588
},
7689
{
77-
'url':
78-
'https://taskrouter.twilio.com/v1/Workspaces/WS456/Activities',
90+
'url': 'https://taskrouter.twilio.com/v1/Workspaces/{}/Workers/{}'.format(self.workspace_sid, self.worker_sid),
7991
'method': 'GET',
8092
'allow': True,
8193
'query_filter': {},
8294
'post_filter': {},
83-
},
95+
}
8496
]
8597
self.assertEqual(expected, decoded['policies'])
8698

@@ -90,7 +102,7 @@ def test_allow_worker_activity_updates(self):
90102
decoded = jwt.decode(token, self.auth_token)
91103

92104
self.assertTrue(decoded is not None)
93-
url = 'https://taskrouter.twilio.com/v1/Workspaces/%s/Workers/%s' % (
105+
url = 'https://taskrouter.twilio.com/v1/Workspaces/{}/Workers/{}'.format(
94106
self.workspace_sid,
95107
self.worker_sid,
96108
)
@@ -110,7 +122,7 @@ def test_allow_worker_fetch_attributes(self):
110122
decoded = jwt.decode(token, self.auth_token)
111123

112124
self.assertTrue(decoded is not None)
113-
url = 'https://taskrouter.twilio.com/v1/Workspaces/%s/Workers/%s' % (
125+
url = 'https://taskrouter.twilio.com/v1/Workspaces/{}/Workers/{}'.format(
114126
self.workspace_sid,
115127
self.worker_sid,
116128
)
@@ -131,7 +143,7 @@ def test_allow_task_reservation_updates(self):
131143
decoded = jwt.decode(token, self.auth_token)
132144

133145
self.assertTrue(decoded is not None)
134-
url = 'https://taskrouter.twilio.com/v1/Workspaces/%s/Tasks/**' % (
146+
url = 'https://taskrouter.twilio.com/v1/Workspaces/{}/Tasks/**'.format(
135147
self.workspace_sid,
136148
)
137149

@@ -140,6 +152,6 @@ def test_allow_task_reservation_updates(self):
140152
'method': 'POST',
141153
'allow': True,
142154
'query_filter': {},
143-
'post_filter': {'ReservationStatus': {'required': True}},
155+
'post_filter': {},
144156
}
145157
self.assertEqual(expected, decoded['policies'][-1])
Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,166 @@
1+
import unittest
2+
import warnings
3+
4+
from twilio import jwt
5+
from twilio.task_router import TaskRouterCapability
6+
7+
8+
class TaskRouterCapabilityTest(unittest.TestCase):
9+
10+
def check_policy(self, method, url, policy):
11+
self.assertEqual(url, policy['url'])
12+
self.assertEqual(method, policy['method'])
13+
self.assertTrue(policy['allow'])
14+
self.assertEqual({}, policy['query_filter'])
15+
self.assertEqual({}, policy['post_filter'])
16+
17+
def check_decoded(self, decoded, account_sid, workspace_sid, channel_id, channel_sid=None):
18+
self.assertEqual(decoded["iss"], account_sid)
19+
self.assertEqual(decoded["account_sid"], account_sid)
20+
self.assertEqual(decoded["workspace_sid"], workspace_sid)
21+
self.assertEqual(decoded["channel"], channel_id)
22+
self.assertEqual(decoded["version"], "v1")
23+
self.assertEqual(decoded["friendly_name"], channel_id)
24+
25+
if 'worker_sid' in decoded.keys():
26+
self.assertEqual(decoded['worker_sid'], channel_sid)
27+
if 'taskqueue_sid' in decoded.keys():
28+
self.assertEqual(decoded['taskqueue_sid'], channel_sid)
29+
30+
def test_workspace_default(self):
31+
account_sid = "AC123"
32+
auth_token = "foobar"
33+
workspace_sid = "WS456"
34+
channel_id = "WS456"
35+
capability = TaskRouterCapability(account_sid, auth_token, workspace_sid, channel_id)
36+
37+
capability.generate_token()
38+
39+
token = capability.generate_token()
40+
self.assertIsNotNone(token)
41+
42+
decoded = jwt.decode(token, auth_token)
43+
self.assertIsNotNone(decoded)
44+
45+
self.check_decoded(decoded, account_sid, workspace_sid, channel_id)
46+
47+
policies = decoded['policies']
48+
self.assertEqual(len(policies), 3)
49+
50+
for method, url, policy in [
51+
('GET', "https://event-bridge.twilio.com/v1/wschannels/AC123/WS456", policies[0]),
52+
('POST', "https://event-bridge.twilio.com/v1/wschannels/AC123/WS456", policies[1]),
53+
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456", policies[2]),
54+
]:
55+
yield self.check_policy, method, url, policy
56+
57+
def test_worker_default(self):
58+
account_sid = "AC123"
59+
auth_token = "foobar"
60+
workspace_sid = "WS456"
61+
worker_sid = "WK789"
62+
capability = TaskRouterCapability(account_sid, auth_token, workspace_sid, worker_sid)
63+
64+
capability.generate_token()
65+
66+
token = capability.generate_token()
67+
self.assertIsNotNone(token)
68+
69+
decoded = jwt.decode(token, auth_token)
70+
self.assertIsNotNone(decoded)
71+
72+
self.check_decoded(decoded, account_sid, workspace_sid, worker_sid, worker_sid)
73+
74+
policies = decoded['policies']
75+
self.assertEqual(len(policies), 5)
76+
77+
for method, url, policy in [
78+
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Activities", policies[0]),
79+
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Tasks/**", policies[1]),
80+
('GET', "https://taskrouter.twilio.com/v1/wschannels/AC123/WK789", policies[2]),
81+
('POST', "https://event-bridge.twilio.com/v1/wschannels/AC123/WK789", policies[3]),
82+
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789", policies[4])
83+
]:
84+
yield self.check_policy, method, url, policy
85+
86+
def test_task_queue_default(self):
87+
account_sid = "AC123"
88+
auth_token = "foobar"
89+
workspace_sid = "WS456"
90+
taskqueue_sid = "WQ789"
91+
capability = TaskRouterCapability(account_sid, auth_token, workspace_sid, taskqueue_sid)
92+
93+
capability.generate_token()
94+
95+
token = capability.generate_token()
96+
self.assertIsNotNone(token)
97+
98+
decoded = jwt.decode(token, auth_token)
99+
self.assertIsNotNone(decoded)
100+
101+
self.check_decoded(decoded, account_sid, workspace_sid, taskqueue_sid, taskqueue_sid)
102+
103+
policies = decoded['policies']
104+
self.assertEqual(len(policies), 3)
105+
106+
for method, url, policy in [
107+
('GET', "https://event-bridge.twilio.com/v1/wschannels/AC123/WQ789", policies[0]),
108+
('POST', "https://event-bridge.twilio.com/v1/wschannels/AC123/WQ789", policies[1])
109+
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/TaskQueues/WQ789", policies[2])
110+
]:
111+
yield self.check_policy, method, url, policy
112+
113+
def test_deprecated_worker(self):
114+
account_sid = "AC123"
115+
auth_token = "foobar"
116+
workspace_sid = "WS456"
117+
worker_sid = "WK789"
118+
capability = TaskRouterCapability(account_sid, auth_token, workspace_sid, worker_sid)
119+
120+
capability.generate_token()
121+
122+
token = capability.generate_token()
123+
self.assertIsNotNone(token)
124+
125+
decoded = jwt.decode(token, auth_token)
126+
self.assertIsNotNone(decoded)
127+
128+
self.check_decoded(decoded, account_sid, workspace_sid, worker_sid, worker_sid)
129+
130+
policies = decoded['policies']
131+
self.assertEqual(len(policies), 5)
132+
133+
# should expect 5 policies
134+
for method, url, policy in [
135+
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Activities", policies[0]),
136+
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Tasks/**", policies[1]),
137+
('GET', "https://event-bridge.twilio.com/v1/wschannels/AC123/WK789", policies[2]),
138+
('POST', "https://event-bridge.twilio.com/v1/wschannels/AC123/WK789", policies[3]),
139+
('GET', "https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789", policies[4])
140+
]:
141+
yield self.check_policy, method, url, policy
142+
143+
# check deprecated warnings
144+
with warnings.catch_warnings(record=True) as w:
145+
warnings.simplefilter("always")
146+
capability.allow_worker_fetch_attributes()
147+
assert len(w) == 1
148+
assert issubclass(w[-1].category, DeprecationWarning)
149+
assert "deprecated" in str(w[-1].message)
150+
151+
with warnings.catch_warnings(record=True) as w:
152+
warnings.simplefilter("always")
153+
capability.allow_worker_activity_updates()
154+
assert len(w) == 1
155+
assert issubclass(w[-1].category, DeprecationWarning)
156+
assert "deprecated" in str(w[-1].message)
157+
158+
with warnings.catch_warnings(record=True) as w:
159+
warnings.simplefilter("always")
160+
capability.allow_task_reservation_updates()
161+
assert len(w) == 1
162+
assert issubclass(w[-1].category, DeprecationWarning)
163+
assert "deprecated" in str(w[-1].message)
164+
165+
if __name__ == "__main__":
166+
unittest.main()
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
import time
2+
import unittest
3+
4+
from twilio import jwt
5+
from twilio.task_router import TaskRouterTaskQueueCapability
6+
7+
8+
class TaskRouterTaskQueueCapabilityTest(unittest.TestCase):
9+
10+
def setUp(self):
11+
self.account_sid = "AC123"
12+
self.auth_token = "foobar"
13+
self.workspace_sid = "WS456"
14+
self.taskqueue_sid = "WQ789"
15+
self.capability = TaskRouterTaskQueueCapability(self.account_sid, self.auth_token, self.workspace_sid, self.taskqueue_sid)
16+
17+
def test_generate_token(self):
18+
19+
token = self.capability.generate_token()
20+
self.assertIsNotNone(token)
21+
22+
decoded = jwt.decode(token, self.auth_token)
23+
self.assertIsNotNone(decoded)
24+
25+
self.assertEqual(decoded["iss"], self.account_sid)
26+
self.assertEqual(decoded["account_sid"], self.account_sid)
27+
self.assertEqual(decoded["workspace_sid"], self.workspace_sid)
28+
self.assertEqual(decoded["taskqueue_sid"], self.taskqueue_sid)
29+
self.assertEqual(decoded["channel"], self.taskqueue_sid)
30+
self.assertEqual(decoded["version"], "v1")
31+
self.assertEqual(decoded["friendly_name"], self.taskqueue_sid)
32+
33+
def test_generate_token_with_default_ttl(self):
34+
token = self.capability.generate_token()
35+
self.assertIsNotNone(token)
36+
37+
decoded = jwt.decode(token, self.auth_token)
38+
self.assertIsNotNone(decoded)
39+
40+
self.assertEqual(int(time.time()) + 3600, decoded["exp"])
41+
42+
def test_generate_token_with_custom_ttl(self):
43+
ttl = 10000
44+
45+
token = self.capability.generate_token(ttl)
46+
self.assertIsNotNone(token)
47+
48+
decoded = jwt.decode(token, self.auth_token)
49+
self.assertIsNotNone(decoded)
50+
51+
self.assertEqual(int(time.time()) + 10000, decoded["exp"])
52+
53+
def test_default(self):
54+
token = self.capability.generate_token()
55+
self.assertIsNotNone(token)
56+
57+
decoded = jwt.decode(token, self.auth_token)
58+
self.assertIsNotNone(decoded)
59+
60+
policies = decoded['policies']
61+
self.assertEqual(len(policies), 3)
62+
63+
# websocket GET
64+
get_policy = policies[0]
65+
self.assertEqual("https://event-bridge.twilio.com/v1/wschannels/AC123/WQ789", get_policy['url'])
66+
self.assertEqual("GET", get_policy['method'])
67+
self.assertTrue(get_policy['allow'])
68+
self.assertEqual({}, get_policy['query_filter'])
69+
self.assertEqual({}, get_policy['post_filter'])
70+
71+
# websocket POST
72+
post_policy = policies[1]
73+
self.assertEqual("https://event-bridge.twilio.com/v1/wschannels/AC123/WQ789", post_policy['url'])
74+
self.assertEqual("POST", post_policy['method'])
75+
self.assertTrue(post_policy['allow'])
76+
self.assertEqual({}, post_policy['query_filter'])
77+
self.assertEqual({}, post_policy['post_filter'])
78+
79+
# fetch GET
80+
fetch_policy = policies[2]
81+
self.assertEqual("https://taskrouter.twilio.com/v1/Workspaces/WS456/TaskQueues/WQ789", fetch_policy['url'])
82+
self.assertEqual("GET", fetch_policy['method'])
83+
self.assertTrue(fetch_policy['allow'])
84+
self.assertEqual({}, fetch_policy['query_filter'])
85+
self.assertEqual({}, fetch_policy['post_filter'])
86+
87+
def test_allow_fetch_subresources(self):
88+
self.capability.allow_fetch_subresources()
89+
90+
token = self.capability.generate_token()
91+
self.assertIsNotNone(token)
92+
93+
decoded = jwt.decode(token, self.auth_token)
94+
self.assertIsNotNone(decoded)
95+
96+
policies = decoded['policies']
97+
self.assertEqual(len(policies), 4)
98+
99+
# confirm the additional policy generated with allow_fetch_subresources()
100+
101+
policy = policies[3]
102+
103+
self.assertEqual(policy['url'], "https://taskrouter.twilio.com/v1/Workspaces/WS456/TaskQueues/WQ789/**")
104+
self.assertEqual(policy['method'], "GET")
105+
self.assertTrue(policy['allow'])
106+
self.assertEqual({}, policy['query_filter'])
107+
self.assertEqual({}, policy['post_filter'])
108+
109+
def test_allow_updates_subresources(self):
110+
self.capability.allow_updates_subresources()
111+
112+
token = self.capability.generate_token()
113+
self.assertIsNotNone(token)
114+
115+
decoded = jwt.decode(token, self.auth_token)
116+
self.assertIsNotNone(decoded)
117+
118+
policies = decoded['policies']
119+
self.assertEqual(len(policies), 4)
120+
121+
# confirm the additional policy generated with allow_updates_subresources()
122+
123+
policy = policies[3]
124+
125+
self.assertEqual(policy['url'], "https://taskrouter.twilio.com/v1/Workspaces/WS456/TaskQueues/WQ789/**")
126+
self.assertEqual(policy['method'], "POST")
127+
self.assertTrue(policy['allow'])
128+
self.assertEqual({}, policy['query_filter'])
129+
self.assertEqual({}, policy['post_filter'])
130+
131+
if __name__ == "__main__":
132+
unittest.main()

0 commit comments

Comments
 (0)
0