twilio-ruby 5.0.0.rc21 → 5.0.0.rc22
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Makefile +3 -0
- data/lib/twilio-ruby.rb +7 -3
- data/lib/twilio-ruby/framework/domain.rb +5 -1
- data/lib/twilio-ruby/framework/page.rb +4 -4
- data/lib/twilio-ruby/framework/serialize.rb +3 -2
- data/lib/twilio-ruby/framework/values.rb +7 -0
- data/lib/twilio-ruby/framework/version.rb +4 -6
- data/lib/twilio-ruby/jwt/access_token.rb +160 -134
- data/lib/twilio-ruby/jwt/client_capability.rb +98 -0
- data/lib/twilio-ruby/jwt/jwt.rb +56 -0
- data/lib/twilio-ruby/jwt/task_router.rb +108 -139
- data/lib/twilio-ruby/rest/accounts.rb +1 -1
- data/lib/twilio-ruby/rest/accounts/v1/credential.rb +1 -1
- data/lib/twilio-ruby/rest/accounts/v1/credential/public_key.rb +30 -17
- data/lib/twilio-ruby/rest/api.rb +2 -2
- data/lib/twilio-ruby/rest/api/v2010/account.rb +31 -18
- data/lib/twilio-ruby/rest/api/v2010/account/address.rb +32 -19
- data/lib/twilio-ruby/rest/api/v2010/account/address/dependent_phone_number.rb +18 -5
- data/lib/twilio-ruby/rest/api/v2010/account/application.rb +32 -19
- data/lib/twilio-ruby/rest/api/v2010/account/authorized_connect_app.rb +20 -7
- data/lib/twilio-ruby/rest/api/v2010/account/available_phone_number.rb +20 -7
- data/lib/twilio-ruby/rest/api/v2010/account/available_phone_number/local.rb +20 -7
- data/lib/twilio-ruby/rest/api/v2010/account/available_phone_number/mobile.rb +20 -7
- data/lib/twilio-ruby/rest/api/v2010/account/available_phone_number/toll_free.rb +20 -7
- data/lib/twilio-ruby/rest/api/v2010/account/call.rb +33 -20
- data/lib/twilio-ruby/rest/api/v2010/account/call/feedback.rb +13 -13
- data/lib/twilio-ruby/rest/api/v2010/account/call/feedback_summary.rb +8 -8
- data/lib/twilio-ruby/rest/api/v2010/account/call/notification.rb +23 -10
- data/lib/twilio-ruby/rest/api/v2010/account/call/recording.rb +23 -10
- data/lib/twilio-ruby/rest/api/v2010/account/conference.rb +27 -14
- data/lib/twilio-ruby/rest/api/v2010/account/conference/participant.rb +32 -19
- data/lib/twilio-ruby/rest/api/v2010/account/connect_app.rb +25 -12
- data/lib/twilio-ruby/rest/api/v2010/account/incoming_phone_number.rb +32 -19
- data/lib/twilio-ruby/rest/api/v2010/account/incoming_phone_number/assigned_add_on.rb +24 -11
- data/lib/twilio-ruby/rest/api/v2010/account/incoming_phone_number/assigned_add_on/assigned_add_on_extension.rb +20 -7
- data/lib/twilio-ruby/rest/api/v2010/account/incoming_phone_number/local.rb +24 -11
- data/lib/twilio-ruby/rest/api/v2010/account/incoming_phone_number/mobile.rb +24 -11
- data/lib/twilio-ruby/rest/api/v2010/account/incoming_phone_number/toll_free.rb +24 -11
- data/lib/twilio-ruby/rest/api/v2010/account/key.rb +26 -13
- data/lib/twilio-ruby/rest/api/v2010/account/message.rb +30 -17
- data/lib/twilio-ruby/rest/api/v2010/account/message/feedback.rb +5 -5
- data/lib/twilio-ruby/rest/api/v2010/account/message/media.rb +23 -10
- data/lib/twilio-ruby/rest/api/v2010/account/new_key.rb +5 -5
- data/lib/twilio-ruby/rest/api/v2010/account/new_signing_key.rb +5 -5
- data/lib/twilio-ruby/rest/api/v2010/account/notification.rb +23 -10
- data/lib/twilio-ruby/rest/api/v2010/account/outgoing_caller_id.rb +28 -15
- data/lib/twilio-ruby/rest/api/v2010/account/queue.rb +30 -17
- data/lib/twilio-ruby/rest/api/v2010/account/queue/member.rb +23 -10
- data/lib/twilio-ruby/rest/api/v2010/account/recording.rb +23 -10
- data/lib/twilio-ruby/rest/api/v2010/account/recording/add_on_result.rb +21 -8
- data/lib/twilio-ruby/rest/api/v2010/account/recording/add_on_result/payload.rb +21 -8
- data/lib/twilio-ruby/rest/api/v2010/account/recording/transcription.rb +21 -8
- data/lib/twilio-ruby/rest/api/v2010/account/short_code.rb +27 -14
- data/lib/twilio-ruby/rest/api/v2010/account/signing_key.rb +26 -13
- data/lib/twilio-ruby/rest/api/v2010/account/sip.rb +1 -1
- data/lib/twilio-ruby/rest/api/v2010/account/sip/credential_list.rb +27 -14
- data/lib/twilio-ruby/rest/api/v2010/account/sip/credential_list/credential.rb +29 -16
- data/lib/twilio-ruby/rest/api/v2010/account/sip/domain.rb +30 -17
- data/lib/twilio-ruby/rest/api/v2010/account/sip/domain/credential_list_mapping.rb +24 -11
- data/lib/twilio-ruby/rest/api/v2010/account/sip/domain/ip_access_control_list_mapping.rb +24 -11
- data/lib/twilio-ruby/rest/api/v2010/account/sip/ip_access_control_list.rb +27 -14
- data/lib/twilio-ruby/rest/api/v2010/account/sip/ip_access_control_list/ip_address.rb +29 -16
- data/lib/twilio-ruby/rest/api/v2010/account/token.rb +5 -5
- data/lib/twilio-ruby/rest/api/v2010/account/transcription.rb +21 -8
- data/lib/twilio-ruby/rest/api/v2010/account/usage.rb +1 -1
- data/lib/twilio-ruby/rest/api/v2010/account/usage/record.rb +20 -7
- data/lib/twilio-ruby/rest/api/v2010/account/usage/record/all_time.rb +20 -7
- data/lib/twilio-ruby/rest/api/v2010/account/usage/record/daily.rb +20 -7
- data/lib/twilio-ruby/rest/api/v2010/account/usage/record/last_month.rb +20 -7
- data/lib/twilio-ruby/rest/api/v2010/account/usage/record/monthly.rb +20 -7
- data/lib/twilio-ruby/rest/api/v2010/account/usage/record/this_month.rb +20 -7
- data/lib/twilio-ruby/rest/api/v2010/account/usage/record/today.rb +20 -7
- data/lib/twilio-ruby/rest/api/v2010/account/usage/record/yearly.rb +20 -7
- data/lib/twilio-ruby/rest/api/v2010/account/usage/record/yesterday.rb +20 -7
- data/lib/twilio-ruby/rest/api/v2010/account/usage/trigger.rb +32 -19
- data/lib/twilio-ruby/rest/api/v2010/account/validation_request.rb +5 -5
- data/lib/twilio-ruby/rest/chat.rb +4 -4
- data/lib/twilio-ruby/rest/chat/v1/credential.rb +30 -17
- data/lib/twilio-ruby/rest/chat/v1/service.rb +29 -16
- data/lib/twilio-ruby/rest/chat/v1/service/channel.rb +32 -19
- data/lib/twilio-ruby/rest/chat/v1/service/channel/invite.rb +27 -14
- data/lib/twilio-ruby/rest/chat/v1/service/channel/member.rb +32 -19
- data/lib/twilio-ruby/rest/chat/v1/service/channel/message.rb +32 -19
- data/lib/twilio-ruby/rest/chat/v1/service/role.rb +27 -14
- data/lib/twilio-ruby/rest/chat/v1/service/user.rb +30 -17
- data/lib/twilio-ruby/rest/chat/v1/service/user/user_channel.rb +18 -5
- data/lib/twilio-ruby/rest/chat/v2/credential.rb +30 -17
- data/lib/twilio-ruby/rest/chat/v2/service.rb +29 -16
- data/lib/twilio-ruby/rest/chat/v2/service/channel.rb +32 -19
- data/lib/twilio-ruby/rest/chat/v2/service/channel/invite.rb +27 -14
- data/lib/twilio-ruby/rest/chat/v2/service/channel/member.rb +32 -19
- data/lib/twilio-ruby/rest/chat/v2/service/channel/message.rb +32 -19
- data/lib/twilio-ruby/rest/chat/v2/service/role.rb +27 -14
- data/lib/twilio-ruby/rest/chat/v2/service/user.rb +30 -17
- data/lib/twilio-ruby/rest/chat/v2/service/user/user_channel.rb +18 -5
- data/lib/twilio-ruby/rest/fax.rb +2 -2
- data/lib/twilio-ruby/rest/fax/v1/fax.rb +32 -19
- data/lib/twilio-ruby/rest/fax/v1/fax/fax_media.rb +21 -8
- data/lib/twilio-ruby/rest/ip_messaging.rb +4 -4
- data/lib/twilio-ruby/rest/ip_messaging/v1/credential.rb +30 -17
- data/lib/twilio-ruby/rest/ip_messaging/v1/service.rb +29 -16
- data/lib/twilio-ruby/rest/ip_messaging/v1/service/channel.rb +32 -19
- data/lib/twilio-ruby/rest/ip_messaging/v1/service/channel/invite.rb +27 -14
- data/lib/twilio-ruby/rest/ip_messaging/v1/service/channel/member.rb +32 -19
- data/lib/twilio-ruby/rest/ip_messaging/v1/service/channel/message.rb +32 -19
- data/lib/twilio-ruby/rest/ip_messaging/v1/service/role.rb +27 -14
- data/lib/twilio-ruby/rest/ip_messaging/v1/service/user.rb +30 -17
- data/lib/twilio-ruby/rest/ip_messaging/v1/service/user/user_channel.rb +18 -5
- data/lib/twilio-ruby/rest/ip_messaging/v2/credential.rb +30 -17
- data/lib/twilio-ruby/rest/ip_messaging/v2/service.rb +29 -16
- data/lib/twilio-ruby/rest/ip_messaging/v2/service/channel.rb +32 -19
- data/lib/twilio-ruby/rest/ip_messaging/v2/service/channel/invite.rb +27 -14
- data/lib/twilio-ruby/rest/ip_messaging/v2/service/channel/member.rb +32 -19
- data/lib/twilio-ruby/rest/ip_messaging/v2/service/channel/message.rb +32 -19
- data/lib/twilio-ruby/rest/ip_messaging/v2/service/role.rb +27 -14
- data/lib/twilio-ruby/rest/ip_messaging/v2/service/user.rb +30 -17
- data/lib/twilio-ruby/rest/ip_messaging/v2/service/user/user_channel.rb +18 -5
- data/lib/twilio-ruby/rest/lookups.rb +2 -2
- data/lib/twilio-ruby/rest/lookups/v1/phone_number.rb +6 -6
- data/lib/twilio-ruby/rest/messaging.rb +2 -2
- data/lib/twilio-ruby/rest/messaging/v1/service.rb +30 -17
- data/lib/twilio-ruby/rest/messaging/v1/service/alpha_sender.rb +24 -11
- data/lib/twilio-ruby/rest/messaging/v1/service/phone_number.rb +24 -11
- data/lib/twilio-ruby/rest/messaging/v1/service/short_code.rb +24 -11
- data/lib/twilio-ruby/rest/monitor.rb +4 -4
- data/lib/twilio-ruby/rest/monitor/v1/alert.rb +23 -10
- data/lib/twilio-ruby/rest/monitor/v1/event.rb +22 -9
- data/lib/twilio-ruby/rest/notify.rb +4 -4
- data/lib/twilio-ruby/rest/notify/v1/credential.rb +30 -17
- data/lib/twilio-ruby/rest/notify/v1/service.rb +32 -19
- data/lib/twilio-ruby/rest/notify/v1/service/binding.rb +27 -14
- data/lib/twilio-ruby/rest/notify/v1/service/notification.rb +5 -5
- data/lib/twilio-ruby/rest/notify/v1/service/segment.rb +18 -5
- data/lib/twilio-ruby/rest/notify/v1/service/user.rb +27 -14
- data/lib/twilio-ruby/rest/notify/v1/service/user/segment_memberships.rb +7 -7
- data/lib/twilio-ruby/rest/notify/v1/service/user/user_binding.rb +27 -14
- data/lib/twilio-ruby/rest/preview.rb +18 -18
- data/lib/twilio-ruby/rest/preview/bulk_exports/export.rb +3 -3
- data/lib/twilio-ruby/rest/preview/bulk_exports/export/day.rb +18 -5
- data/lib/twilio-ruby/rest/preview/bulk_exports/export_configuration.rb +8 -8
- data/lib/twilio-ruby/rest/preview/hosted_numbers/hosted_number_order.rb +32 -19
- data/lib/twilio-ruby/rest/preview/marketplace/available_add_on.rb +20 -7
- data/lib/twilio-ruby/rest/preview/marketplace/available_add_on/available_add_on_extension.rb +20 -7
- data/lib/twilio-ruby/rest/preview/marketplace/installed_add_on.rb +30 -17
- data/lib/twilio-ruby/rest/preview/marketplace/installed_add_on/installed_add_on_extension.rb +23 -10
- data/lib/twilio-ruby/rest/preview/proxy/service.rb +30 -17
- data/lib/twilio-ruby/rest/preview/proxy/service/phone_number.rb +24 -11
- data/lib/twilio-ruby/rest/preview/proxy/service/session.rb +32 -19
- data/lib/twilio-ruby/rest/preview/proxy/service/session/interaction.rb +22 -9
- data/lib/twilio-ruby/rest/preview/proxy/service/session/participant.rb +32 -19
- data/lib/twilio-ruby/rest/preview/proxy/service/session/participant/message_interaction.rb +24 -11
- data/lib/twilio-ruby/rest/preview/proxy/service/short_code.rb +24 -11
- data/lib/twilio-ruby/rest/preview/sync/service.rb +30 -17
- data/lib/twilio-ruby/rest/preview/sync/service/document.rb +28 -15
- data/lib/twilio-ruby/rest/preview/sync/service/document/document_permission.rb +24 -11
- data/lib/twilio-ruby/rest/preview/sync/service/sync_list.rb +25 -12
- data/lib/twilio-ruby/rest/preview/sync/service/sync_list/sync_list_item.rb +29 -16
- data/lib/twilio-ruby/rest/preview/sync/service/sync_list/sync_list_permission.rb +24 -11
- data/lib/twilio-ruby/rest/preview/sync/service/sync_map.rb +25 -12
- data/lib/twilio-ruby/rest/preview/sync/service/sync_map/sync_map_item.rb +29 -16
- data/lib/twilio-ruby/rest/preview/sync/service/sync_map/sync_map_permission.rb +24 -11
- data/lib/twilio-ruby/rest/preview/wireless/command.rb +26 -13
- data/lib/twilio-ruby/rest/preview/wireless/rate_plan.rb +30 -17
- data/lib/twilio-ruby/rest/preview/wireless/sim.rb +28 -15
- data/lib/twilio-ruby/rest/preview/wireless/sim/usage.rb +6 -6
- data/lib/twilio-ruby/rest/pricing.rb +3 -3
- data/lib/twilio-ruby/rest/pricing/v1/messaging.rb +1 -1
- data/lib/twilio-ruby/rest/pricing/v1/messaging/country.rb +20 -7
- data/lib/twilio-ruby/rest/pricing/v1/phone_number.rb +1 -1
- data/lib/twilio-ruby/rest/pricing/v1/phone_number/country.rb +20 -7
- data/lib/twilio-ruby/rest/pricing/v1/voice.rb +1 -1
- data/lib/twilio-ruby/rest/pricing/v1/voice/country.rb +20 -7
- data/lib/twilio-ruby/rest/pricing/v1/voice/number.rb +3 -3
- data/lib/twilio-ruby/rest/sync.rb +2 -2
- data/lib/twilio-ruby/rest/sync/v1/service.rb +30 -17
- data/lib/twilio-ruby/rest/sync/v1/service/document.rb +28 -15
- data/lib/twilio-ruby/rest/sync/v1/service/document/document_permission.rb +24 -11
- data/lib/twilio-ruby/rest/sync/v1/service/sync_list.rb +25 -12
- data/lib/twilio-ruby/rest/sync/v1/service/sync_list/sync_list_item.rb +29 -16
- data/lib/twilio-ruby/rest/sync/v1/service/sync_list/sync_list_permission.rb +24 -11
- data/lib/twilio-ruby/rest/sync/v1/service/sync_map.rb +25 -12
- data/lib/twilio-ruby/rest/sync/v1/service/sync_map/sync_map_item.rb +29 -16
- data/lib/twilio-ruby/rest/sync/v1/service/sync_map/sync_map_permission.rb +24 -11
- data/lib/twilio-ruby/rest/taskrouter.rb +2 -2
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace.rb +33 -20
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/activity.rb +32 -19
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/event.rb +22 -9
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task.rb +32 -19
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task/reservation.rb +27 -14
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_channel.rb +20 -7
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue.rb +33 -20
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue/task_queue_statistics.rb +6 -6
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue/task_queues_statistics.rb +20 -7
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker.rb +33 -20
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/reservation.rb +27 -14
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/worker_channel.rb +25 -12
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/worker_statistics.rb +6 -6
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/workers_statistics.rb +6 -6
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workflow.rb +33 -20
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workflow/workflow_statistics.rb +6 -6
- data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workspace_statistics.rb +6 -6
- data/lib/twilio-ruby/rest/trunking.rb +2 -2
- data/lib/twilio-ruby/rest/trunking/v1/trunk.rb +30 -17
- data/lib/twilio-ruby/rest/trunking/v1/trunk/credential_list.rb +24 -11
- data/lib/twilio-ruby/rest/trunking/v1/trunk/ip_access_control_list.rb +24 -11
- data/lib/twilio-ruby/rest/trunking/v1/trunk/origination_url.rb +29 -16
- data/lib/twilio-ruby/rest/trunking/v1/trunk/phone_number.rb +24 -11
- data/lib/twilio-ruby/rest/video.rb +4 -4
- data/lib/twilio-ruby/rest/video/v1/recording.rb +23 -10
- data/lib/twilio-ruby/rest/video/v1/room.rb +29 -16
- data/lib/twilio-ruby/rest/video/v1/room/recording.rb +20 -7
- data/lib/twilio-ruby/rest/wireless.rb +6 -6
- data/lib/twilio-ruby/rest/wireless/v1/command.rb +26 -13
- data/lib/twilio-ruby/rest/wireless/v1/rate_plan.rb +30 -17
- data/lib/twilio-ruby/rest/wireless/v1/sim.rb +27 -14
- data/lib/twilio-ruby/rest/wireless/v1/sim/usage_record.rb +20 -7
- data/lib/twilio-ruby/twiml/messaging_response.rb +147 -0
- data/lib/twilio-ruby/twiml/twiml.rb +77 -0
- data/lib/twilio-ruby/twiml/voice_response.rb +925 -0
- data/lib/twilio-ruby/version.rb +1 -1
- data/spec/holodeck/hologram.rb +0 -1
- data/spec/jwt/access_token_spec.rb +126 -182
- data/spec/jwt/client_capability_spec.rb +104 -0
- data/spec/jwt/task_router_spec.rb +164 -97
- data/spec/twiml/messaging_response_spec.rb +62 -0
- data/spec/twiml/voice_response_spec.rb +452 -0
- data/twilio-ruby.gemspec +4 -2
- metadata +36 -23
- data/lib/twilio-ruby/compatibility/v2010/account/call/feedback.rb +0 -15
- data/lib/twilio-ruby/compatibility/v2010/account/queue/member.rb +0 -23
- data/lib/twilio-ruby/jwt/capability.rb +0 -64
- data/lib/twilio-ruby/twiml/response.rb +0 -16
- data/spec/jwt/capability_spec.rb +0 -186
- data/spec/jwt/task_router_taskqueue_spec.rb +0 -111
- data/spec/jwt/task_router_worker_spec.rb +0 -146
- data/spec/jwt/task_router_workspace_spec.rb +0 -110
- data/spec/twiml/twiml_response_spec.rb +0 -47
@@ -1,111 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Twilio::JWT::TaskQueueCapability do
|
4
|
-
describe 'with a capability' do
|
5
|
-
before :each do
|
6
|
-
@capability = Twilio::JWT::TaskQueueCapability.new 'AC123', 'foobar', 'WS456', 'WQ789'
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'should return a valid jwt when #generate_token is called' do
|
10
|
-
token = @capability.generate_token
|
11
|
-
decoded, header = JWT.decode token, 'foobar'
|
12
|
-
expect(decoded['policies']).not_to be_nil
|
13
|
-
expect(decoded['iss']).not_to be_nil
|
14
|
-
expect(decoded['exp']).not_to be_nil
|
15
|
-
expect(decoded['account_sid']).to eq('AC123')
|
16
|
-
expect(decoded['workspace_sid']).to eq('WS456')
|
17
|
-
expect(decoded['taskqueue_sid']).to eq('WQ789')
|
18
|
-
expect(decoded['channel']).to eq('WQ789')
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'should properly set the iss key in the payload' do
|
22
|
-
token = @capability.generate_token
|
23
|
-
decoded, header = JWT.decode token, 'foobar'
|
24
|
-
expect(decoded['iss']).to eq('AC123')
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'should properly set exp based on the default 1-hour ttl' do
|
28
|
-
seconds = Time.now.to_i
|
29
|
-
token = @capability.generate_token
|
30
|
-
decoded, header = JWT.decode token, 'foobar'
|
31
|
-
expect(decoded['exp']).to eq(seconds + 3600)
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'should properly set exp based on the ttl arg to #generate_token' do
|
35
|
-
seconds = Time.now.to_i
|
36
|
-
ttl = rand 10000
|
37
|
-
token = @capability.generate_token ttl
|
38
|
-
decoded, header = JWT.decode token, 'foobar'
|
39
|
-
expect(decoded['exp']).to eq(seconds + ttl)
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'should allow websocket operations and fetching the workspace by default' do
|
43
|
-
token = @capability.generate_token
|
44
|
-
decoded, header = JWT.decode token, 'foobar'
|
45
|
-
expect(decoded['policies'].size).to eq(3)
|
46
|
-
get_policy = {
|
47
|
-
"url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WQ789',
|
48
|
-
"method" => 'GET',
|
49
|
-
"query_filter" => {},
|
50
|
-
"post_filter" => {},
|
51
|
-
"allow" => true
|
52
|
-
}
|
53
|
-
expect(decoded['policies'][0]).to eq(get_policy)
|
54
|
-
post_policy = {
|
55
|
-
"url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WQ789',
|
56
|
-
"method" => 'POST',
|
57
|
-
"query_filter" => {},
|
58
|
-
"post_filter" => {},
|
59
|
-
"allow" => true
|
60
|
-
}
|
61
|
-
expect(decoded['policies'][1]).to eq(post_policy)
|
62
|
-
|
63
|
-
taskqueue_fetch_policy = {
|
64
|
-
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/TaskQueues/WQ789',
|
65
|
-
'method' => 'GET',
|
66
|
-
'query_filter' => {},
|
67
|
-
'post_filter' => {},
|
68
|
-
'allow' => true
|
69
|
-
}
|
70
|
-
expect(decoded['policies'][2]).to eq(taskqueue_fetch_policy)
|
71
|
-
end
|
72
|
-
|
73
|
-
it 'should add a policy when #allow_fetch_subresources is called' do
|
74
|
-
token = @capability.generate_token
|
75
|
-
decoded, header = JWT.decode token, 'foobar'
|
76
|
-
policies_size = decoded['policies'].size
|
77
|
-
|
78
|
-
@capability.allow_fetch_subresources
|
79
|
-
token = @capability.generate_token
|
80
|
-
decoded, header = JWT.decode token, 'foobar'
|
81
|
-
taskqueue_fetch_policy = {
|
82
|
-
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/TaskQueues/WQ789/**',
|
83
|
-
'method' => 'GET',
|
84
|
-
'query_filter' => {},
|
85
|
-
'post_filter' => {},
|
86
|
-
'allow' => true
|
87
|
-
}
|
88
|
-
expect(decoded['policies'][-1]).to eq(taskqueue_fetch_policy)
|
89
|
-
expect(decoded['policies'].size).to eq(policies_size+1)
|
90
|
-
end
|
91
|
-
|
92
|
-
it 'should add a policy when #allow_update_subresources is called' do
|
93
|
-
token = @capability.generate_token
|
94
|
-
decoded, header = JWT.decode token, 'foobar'
|
95
|
-
policies_size = decoded['policies'].size
|
96
|
-
|
97
|
-
@capability.allow_updates_subresources
|
98
|
-
token = @capability.generate_token
|
99
|
-
decoded, header = JWT.decode token, 'foobar'
|
100
|
-
taskqueue_update_policy = {
|
101
|
-
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/TaskQueues/WQ789/**',
|
102
|
-
'method' => 'POST',
|
103
|
-
'query_filter' => {},
|
104
|
-
'post_filter' => {},
|
105
|
-
'allow' => true
|
106
|
-
}
|
107
|
-
expect(decoded['policies'][-1]).to eq(taskqueue_update_policy)
|
108
|
-
expect(decoded['policies'].size).to eq(policies_size+1)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
@@ -1,146 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Twilio::JWT::WorkerCapability do
|
4
|
-
describe 'with a capability' do
|
5
|
-
before :each do
|
6
|
-
@capability = Twilio::JWT::WorkerCapability.new 'AC123', 'foobar', 'WS456', 'WK789'
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'should return a valid jwt when #generate_token is called' do
|
10
|
-
token = @capability.generate_token
|
11
|
-
decoded, header = JWT.decode token, 'foobar'
|
12
|
-
expect(decoded['policies']).not_to be_nil
|
13
|
-
expect(decoded['iss']).not_to be_nil
|
14
|
-
expect(decoded['exp']).not_to be_nil
|
15
|
-
expect(decoded['account_sid']).to eq('AC123')
|
16
|
-
expect(decoded['workspace_sid']).to eq('WS456')
|
17
|
-
expect(decoded['worker_sid']).to eq('WK789')
|
18
|
-
expect(decoded['channel']).to eq('WK789')
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'should properly set the iss key in the payload' do
|
22
|
-
token = @capability.generate_token
|
23
|
-
decoded, header = JWT.decode token, 'foobar'
|
24
|
-
expect(decoded['iss']).to eq('AC123')
|
25
|
-
end
|
26
|
-
|
27
|
-
it 'should properly set exp based on the default 1-hour ttl' do
|
28
|
-
seconds = Time.now.to_i
|
29
|
-
token = @capability.generate_token
|
30
|
-
decoded, header = JWT.decode token, 'foobar'
|
31
|
-
expect(decoded['exp']).to eq(seconds + 3600)
|
32
|
-
end
|
33
|
-
|
34
|
-
it 'should properly set exp based on the ttl arg to #generate_token' do
|
35
|
-
seconds = Time.now.to_i
|
36
|
-
ttl = rand 10000
|
37
|
-
token = @capability.generate_token ttl
|
38
|
-
decoded, header = JWT.decode token, 'foobar'
|
39
|
-
expect(decoded['exp']).to eq(seconds + ttl)
|
40
|
-
end
|
41
|
-
|
42
|
-
it 'should allow websocket operations and activity list fetches by default' do
|
43
|
-
token = @capability.generate_token
|
44
|
-
decoded, header = JWT.decode token, 'foobar'
|
45
|
-
expect(decoded['policies'].size).to eq(6)
|
46
|
-
get_policy = {
|
47
|
-
"url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WK789',
|
48
|
-
"method" => 'GET',
|
49
|
-
"query_filter" => {},
|
50
|
-
"post_filter" => {},
|
51
|
-
"allow" => true
|
52
|
-
}
|
53
|
-
expect(decoded['policies'][0]).to eq(get_policy)
|
54
|
-
post_policy = {
|
55
|
-
"url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WK789',
|
56
|
-
"method" => 'POST',
|
57
|
-
"query_filter" => {},
|
58
|
-
"post_filter" => {},
|
59
|
-
"allow" => true
|
60
|
-
}
|
61
|
-
expect(decoded['policies'][1]).to eq(post_policy)
|
62
|
-
|
63
|
-
worker_fetch_policy = {
|
64
|
-
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789',
|
65
|
-
'method' => 'GET',
|
66
|
-
'query_filter' => {},
|
67
|
-
'post_filter' => {},
|
68
|
-
'allow' => true
|
69
|
-
}
|
70
|
-
expect(decoded['policies'][2]).to eq(worker_fetch_policy)
|
71
|
-
|
72
|
-
activities_policy = {
|
73
|
-
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Activities',
|
74
|
-
'method' => 'GET',
|
75
|
-
'query_filter' => {},
|
76
|
-
'post_filter' => {},
|
77
|
-
'allow' => true
|
78
|
-
}
|
79
|
-
expect(decoded['policies'][3]).to eq(activities_policy)
|
80
|
-
|
81
|
-
tasks_policy = {
|
82
|
-
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Tasks/**',
|
83
|
-
'method' => 'GET',
|
84
|
-
'query_filter' => {},
|
85
|
-
'post_filter' => {},
|
86
|
-
'allow' => true
|
87
|
-
}
|
88
|
-
expect(decoded['policies'][4]).to eq(tasks_policy)
|
89
|
-
|
90
|
-
worker_reservations_policy = {
|
91
|
-
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789/Reservations/**',
|
92
|
-
'method' => 'GET',
|
93
|
-
'query_filter' => {},
|
94
|
-
'post_filter' => {},
|
95
|
-
'allow' => true
|
96
|
-
}
|
97
|
-
expect(decoded['policies'][5]).to eq(worker_reservations_policy)
|
98
|
-
end
|
99
|
-
|
100
|
-
it 'should add a policy when #allow_activity_updates is called' do
|
101
|
-
token = @capability.generate_token
|
102
|
-
decoded, header = JWT.decode token, 'foobar'
|
103
|
-
policies_size = decoded['policies'].size
|
104
|
-
|
105
|
-
@capability.allow_activity_updates
|
106
|
-
token = @capability.generate_token
|
107
|
-
decoded, header = JWT.decode token, 'foobar'
|
108
|
-
activity_policy = {
|
109
|
-
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789',
|
110
|
-
'method' => 'POST',
|
111
|
-
'query_filter' => {},
|
112
|
-
'post_filter' => {'ActivitySid' => {'required' => true}},
|
113
|
-
'allow' => true
|
114
|
-
}
|
115
|
-
expect(decoded['policies'][-1]).to eq(activity_policy)
|
116
|
-
expect(decoded['policies'].size).to eq(policies_size+1)
|
117
|
-
end
|
118
|
-
|
119
|
-
it 'should add two policies when #allow_reservation_updates is called' do
|
120
|
-
token = @capability.generate_token
|
121
|
-
decoded, header = JWT.decode token, 'foobar'
|
122
|
-
policies_size = decoded['policies'].size
|
123
|
-
|
124
|
-
@capability.allow_reservation_updates
|
125
|
-
token = @capability.generate_token
|
126
|
-
decoded, header = JWT.decode token, 'foobar'
|
127
|
-
tasks_policy = {
|
128
|
-
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Tasks/**',
|
129
|
-
'method' => 'POST',
|
130
|
-
'query_filter' => {},
|
131
|
-
'post_filter' => {},
|
132
|
-
'allow' => true
|
133
|
-
}
|
134
|
-
expect(decoded['policies'][-2]).to eq(tasks_policy)
|
135
|
-
worker_reservations_policy = {
|
136
|
-
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/Workers/WK789/Reservations/**',
|
137
|
-
'method' => 'POST',
|
138
|
-
'query_filter' => {},
|
139
|
-
'post_filter' => {},
|
140
|
-
'allow' => true
|
141
|
-
}
|
142
|
-
expect(decoded['policies'][-1]).to eq(worker_reservations_policy)
|
143
|
-
expect(decoded['policies'].size).to eq(policies_size+2)
|
144
|
-
end
|
145
|
-
end
|
146
|
-
end
|
@@ -1,110 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Twilio::JWT::WorkspaceCapability do
|
4
|
-
describe 'with a capability' do
|
5
|
-
before :each do
|
6
|
-
@capability = Twilio::JWT::WorkspaceCapability.new 'AC123', 'foobar', 'WS456'
|
7
|
-
end
|
8
|
-
|
9
|
-
it 'should return a valid jwt when #generate_token is called' do
|
10
|
-
token = @capability.generate_token
|
11
|
-
decoded, header = JWT.decode token, 'foobar'
|
12
|
-
expect(decoded['policies']).not_to be_nil
|
13
|
-
expect(decoded['iss']).not_to be_nil
|
14
|
-
expect(decoded['exp']).not_to be_nil
|
15
|
-
expect(decoded['account_sid']).to eq('AC123')
|
16
|
-
expect(decoded['workspace_sid']).to eq('WS456')
|
17
|
-
expect(decoded['channel']).to eq('WS456')
|
18
|
-
end
|
19
|
-
|
20
|
-
it 'should properly set the iss key in the payload' do
|
21
|
-
token = @capability.generate_token
|
22
|
-
decoded, header = JWT.decode token, 'foobar'
|
23
|
-
expect(decoded['iss']).to eq('AC123')
|
24
|
-
end
|
25
|
-
|
26
|
-
it 'should properly set exp based on the default 1-hour ttl' do
|
27
|
-
seconds = Time.now.to_i
|
28
|
-
token = @capability.generate_token
|
29
|
-
decoded, header = JWT.decode token, 'foobar'
|
30
|
-
expect(decoded['exp']).to eq(seconds + 3600)
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'should properly set exp based on the ttl arg to #generate_token' do
|
34
|
-
seconds = Time.now.to_i
|
35
|
-
ttl = rand 10000
|
36
|
-
token = @capability.generate_token ttl
|
37
|
-
decoded, header = JWT.decode token, 'foobar'
|
38
|
-
expect(decoded['exp']).to eq(seconds + ttl)
|
39
|
-
end
|
40
|
-
|
41
|
-
it 'should allow websocket operations and fetching the workspace by default' do
|
42
|
-
token = @capability.generate_token
|
43
|
-
decoded, header = JWT.decode token, 'foobar'
|
44
|
-
expect(decoded['policies'].size).to eq(3)
|
45
|
-
get_policy = {
|
46
|
-
"url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WS456',
|
47
|
-
"method" => 'GET',
|
48
|
-
"query_filter" => {},
|
49
|
-
"post_filter" => {},
|
50
|
-
"allow" => true
|
51
|
-
}
|
52
|
-
expect(decoded['policies'][0]).to eq(get_policy)
|
53
|
-
post_policy = {
|
54
|
-
"url" => 'https://event-bridge.twilio.com/v1/wschannels/AC123/WS456',
|
55
|
-
"method" => 'POST',
|
56
|
-
"query_filter" => {},
|
57
|
-
"post_filter" => {},
|
58
|
-
"allow" => true
|
59
|
-
}
|
60
|
-
expect(decoded['policies'][1]).to eq(post_policy)
|
61
|
-
|
62
|
-
workspace_fetch_policy = {
|
63
|
-
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456',
|
64
|
-
'method' => 'GET',
|
65
|
-
'query_filter' => {},
|
66
|
-
'post_filter' => {},
|
67
|
-
'allow' => true
|
68
|
-
}
|
69
|
-
expect(decoded['policies'][2]).to eq(workspace_fetch_policy)
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'should add a policy when #allow_fetch_subresources is called' do
|
73
|
-
token = @capability.generate_token
|
74
|
-
decoded, header = JWT.decode token, 'foobar'
|
75
|
-
policies_size = decoded['policies'].size
|
76
|
-
|
77
|
-
@capability.allow_fetch_subresources
|
78
|
-
token = @capability.generate_token
|
79
|
-
decoded, header = JWT.decode token, 'foobar'
|
80
|
-
workspace_fetch_policy = {
|
81
|
-
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/**',
|
82
|
-
'method' => 'GET',
|
83
|
-
'query_filter' => {},
|
84
|
-
'post_filter' => {},
|
85
|
-
'allow' => true
|
86
|
-
}
|
87
|
-
expect(decoded['policies'][-1]).to eq(workspace_fetch_policy)
|
88
|
-
expect(decoded['policies'].size).to eq(policies_size+1)
|
89
|
-
end
|
90
|
-
|
91
|
-
it 'should add a policy when #allow_update_subresources is called' do
|
92
|
-
token = @capability.generate_token
|
93
|
-
decoded, header = JWT.decode token, 'foobar'
|
94
|
-
policies_size = decoded['policies'].size
|
95
|
-
|
96
|
-
@capability.allow_updates_subresources
|
97
|
-
token = @capability.generate_token
|
98
|
-
decoded, header = JWT.decode token, 'foobar'
|
99
|
-
workspace_update_policy = {
|
100
|
-
'url' => 'https://taskrouter.twilio.com/v1/Workspaces/WS456/**',
|
101
|
-
'method' => 'POST',
|
102
|
-
'query_filter' => {},
|
103
|
-
'post_filter' => {},
|
104
|
-
'allow' => true
|
105
|
-
}
|
106
|
-
expect(decoded['policies'][-1]).to eq(workspace_update_policy)
|
107
|
-
expect(decoded['policies'].size).to eq(policies_size+1)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe Twilio::TwiML::Response do
|
4
|
-
it 'should render empty' do
|
5
|
-
twiml = Twilio::TwiML::Response.new
|
6
|
-
expect(twiml.text).to eq('<?xml version="1.0" encoding="UTF-8"?>' +
|
7
|
-
'<Response/>')
|
8
|
-
end
|
9
|
-
|
10
|
-
it 'should render top level tags' do
|
11
|
-
twiml = Twilio::TwiML::Response.new do |r|
|
12
|
-
r.Say 'hello world'
|
13
|
-
r.Hangup
|
14
|
-
end
|
15
|
-
expect(twiml.text).to eq('<?xml version="1.0" encoding="UTF-8"?>' +
|
16
|
-
'<Response>' +
|
17
|
-
'<Say>hello world</Say>' +
|
18
|
-
'<Hangup/>' +
|
19
|
-
'</Response>')
|
20
|
-
end
|
21
|
-
|
22
|
-
it 'should render attributes in top level tags' do
|
23
|
-
twiml = Twilio::TwiML::Response.new do |r|
|
24
|
-
r.Say 'hello world', voice: 'alice'
|
25
|
-
end
|
26
|
-
|
27
|
-
expect(twiml.text).to eq('<?xml version="1.0" encoding="UTF-8"?>' +
|
28
|
-
'<Response>' +
|
29
|
-
'<Say voice="alice">hello world</Say>' +
|
30
|
-
'</Response>')
|
31
|
-
end
|
32
|
-
|
33
|
-
it 'should render nested tags' do
|
34
|
-
twiml = Twilio::TwiML::Response.new do |r|
|
35
|
-
r.Dial callerId: '+14158675309' do |d|
|
36
|
-
d.Client 'jenny'
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
expect(twiml.text).to eq('<?xml version="1.0" encoding="UTF-8"?>' +
|
41
|
-
'<Response>' +
|
42
|
-
'<Dial callerId="+14158675309">' +
|
43
|
-
'<Client>jenny</Client>' +
|
44
|
-
'</Dial>' +
|
45
|
-
'</Response>')
|
46
|
-
end
|
47
|
-
end
|