twilio-ruby 5.0.0.rc21 → 5.0.0.rc22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. checksums.yaml +4 -4
  2. data/Makefile +3 -0
  3. data/lib/twilio-ruby.rb +7 -3
  4. data/lib/twilio-ruby/framework/domain.rb +5 -1
  5. data/lib/twilio-ruby/framework/page.rb +4 -4
  6. data/lib/twilio-ruby/framework/serialize.rb +3 -2
  7. data/lib/twilio-ruby/framework/values.rb +7 -0
  8. data/lib/twilio-ruby/framework/version.rb +4 -6
  9. data/lib/twilio-ruby/jwt/access_token.rb +160 -134
  10. data/lib/twilio-ruby/jwt/client_capability.rb +98 -0
  11. data/lib/twilio-ruby/jwt/jwt.rb +56 -0
  12. data/lib/twilio-ruby/jwt/task_router.rb +108 -139
  13. data/lib/twilio-ruby/rest/accounts.rb +1 -1
  14. data/lib/twilio-ruby/rest/accounts/v1/credential.rb +1 -1
  15. data/lib/twilio-ruby/rest/accounts/v1/credential/public_key.rb +30 -17
  16. data/lib/twilio-ruby/rest/api.rb +2 -2
  17. data/lib/twilio-ruby/rest/api/v2010/account.rb +31 -18
  18. data/lib/twilio-ruby/rest/api/v2010/account/address.rb +32 -19
  19. data/lib/twilio-ruby/rest/api/v2010/account/address/dependent_phone_number.rb +18 -5
  20. data/lib/twilio-ruby/rest/api/v2010/account/application.rb +32 -19
  21. data/lib/twilio-ruby/rest/api/v2010/account/authorized_connect_app.rb +20 -7
  22. data/lib/twilio-ruby/rest/api/v2010/account/available_phone_number.rb +20 -7
  23. data/lib/twilio-ruby/rest/api/v2010/account/available_phone_number/local.rb +20 -7
  24. data/lib/twilio-ruby/rest/api/v2010/account/available_phone_number/mobile.rb +20 -7
  25. data/lib/twilio-ruby/rest/api/v2010/account/available_phone_number/toll_free.rb +20 -7
  26. data/lib/twilio-ruby/rest/api/v2010/account/call.rb +33 -20
  27. data/lib/twilio-ruby/rest/api/v2010/account/call/feedback.rb +13 -13
  28. data/lib/twilio-ruby/rest/api/v2010/account/call/feedback_summary.rb +8 -8
  29. data/lib/twilio-ruby/rest/api/v2010/account/call/notification.rb +23 -10
  30. data/lib/twilio-ruby/rest/api/v2010/account/call/recording.rb +23 -10
  31. data/lib/twilio-ruby/rest/api/v2010/account/conference.rb +27 -14
  32. data/lib/twilio-ruby/rest/api/v2010/account/conference/participant.rb +32 -19
  33. data/lib/twilio-ruby/rest/api/v2010/account/connect_app.rb +25 -12
  34. data/lib/twilio-ruby/rest/api/v2010/account/incoming_phone_number.rb +32 -19
  35. data/lib/twilio-ruby/rest/api/v2010/account/incoming_phone_number/assigned_add_on.rb +24 -11
  36. data/lib/twilio-ruby/rest/api/v2010/account/incoming_phone_number/assigned_add_on/assigned_add_on_extension.rb +20 -7
  37. data/lib/twilio-ruby/rest/api/v2010/account/incoming_phone_number/local.rb +24 -11
  38. data/lib/twilio-ruby/rest/api/v2010/account/incoming_phone_number/mobile.rb +24 -11
  39. data/lib/twilio-ruby/rest/api/v2010/account/incoming_phone_number/toll_free.rb +24 -11
  40. data/lib/twilio-ruby/rest/api/v2010/account/key.rb +26 -13
  41. data/lib/twilio-ruby/rest/api/v2010/account/message.rb +30 -17
  42. data/lib/twilio-ruby/rest/api/v2010/account/message/feedback.rb +5 -5
  43. data/lib/twilio-ruby/rest/api/v2010/account/message/media.rb +23 -10
  44. data/lib/twilio-ruby/rest/api/v2010/account/new_key.rb +5 -5
  45. data/lib/twilio-ruby/rest/api/v2010/account/new_signing_key.rb +5 -5
  46. data/lib/twilio-ruby/rest/api/v2010/account/notification.rb +23 -10
  47. data/lib/twilio-ruby/rest/api/v2010/account/outgoing_caller_id.rb +28 -15
  48. data/lib/twilio-ruby/rest/api/v2010/account/queue.rb +30 -17
  49. data/lib/twilio-ruby/rest/api/v2010/account/queue/member.rb +23 -10
  50. data/lib/twilio-ruby/rest/api/v2010/account/recording.rb +23 -10
  51. data/lib/twilio-ruby/rest/api/v2010/account/recording/add_on_result.rb +21 -8
  52. data/lib/twilio-ruby/rest/api/v2010/account/recording/add_on_result/payload.rb +21 -8
  53. data/lib/twilio-ruby/rest/api/v2010/account/recording/transcription.rb +21 -8
  54. data/lib/twilio-ruby/rest/api/v2010/account/short_code.rb +27 -14
  55. data/lib/twilio-ruby/rest/api/v2010/account/signing_key.rb +26 -13
  56. data/lib/twilio-ruby/rest/api/v2010/account/sip.rb +1 -1
  57. data/lib/twilio-ruby/rest/api/v2010/account/sip/credential_list.rb +27 -14
  58. data/lib/twilio-ruby/rest/api/v2010/account/sip/credential_list/credential.rb +29 -16
  59. data/lib/twilio-ruby/rest/api/v2010/account/sip/domain.rb +30 -17
  60. data/lib/twilio-ruby/rest/api/v2010/account/sip/domain/credential_list_mapping.rb +24 -11
  61. data/lib/twilio-ruby/rest/api/v2010/account/sip/domain/ip_access_control_list_mapping.rb +24 -11
  62. data/lib/twilio-ruby/rest/api/v2010/account/sip/ip_access_control_list.rb +27 -14
  63. data/lib/twilio-ruby/rest/api/v2010/account/sip/ip_access_control_list/ip_address.rb +29 -16
  64. data/lib/twilio-ruby/rest/api/v2010/account/token.rb +5 -5
  65. data/lib/twilio-ruby/rest/api/v2010/account/transcription.rb +21 -8
  66. data/lib/twilio-ruby/rest/api/v2010/account/usage.rb +1 -1
  67. data/lib/twilio-ruby/rest/api/v2010/account/usage/record.rb +20 -7
  68. data/lib/twilio-ruby/rest/api/v2010/account/usage/record/all_time.rb +20 -7
  69. data/lib/twilio-ruby/rest/api/v2010/account/usage/record/daily.rb +20 -7
  70. data/lib/twilio-ruby/rest/api/v2010/account/usage/record/last_month.rb +20 -7
  71. data/lib/twilio-ruby/rest/api/v2010/account/usage/record/monthly.rb +20 -7
  72. data/lib/twilio-ruby/rest/api/v2010/account/usage/record/this_month.rb +20 -7
  73. data/lib/twilio-ruby/rest/api/v2010/account/usage/record/today.rb +20 -7
  74. data/lib/twilio-ruby/rest/api/v2010/account/usage/record/yearly.rb +20 -7
  75. data/lib/twilio-ruby/rest/api/v2010/account/usage/record/yesterday.rb +20 -7
  76. data/lib/twilio-ruby/rest/api/v2010/account/usage/trigger.rb +32 -19
  77. data/lib/twilio-ruby/rest/api/v2010/account/validation_request.rb +5 -5
  78. data/lib/twilio-ruby/rest/chat.rb +4 -4
  79. data/lib/twilio-ruby/rest/chat/v1/credential.rb +30 -17
  80. data/lib/twilio-ruby/rest/chat/v1/service.rb +29 -16
  81. data/lib/twilio-ruby/rest/chat/v1/service/channel.rb +32 -19
  82. data/lib/twilio-ruby/rest/chat/v1/service/channel/invite.rb +27 -14
  83. data/lib/twilio-ruby/rest/chat/v1/service/channel/member.rb +32 -19
  84. data/lib/twilio-ruby/rest/chat/v1/service/channel/message.rb +32 -19
  85. data/lib/twilio-ruby/rest/chat/v1/service/role.rb +27 -14
  86. data/lib/twilio-ruby/rest/chat/v1/service/user.rb +30 -17
  87. data/lib/twilio-ruby/rest/chat/v1/service/user/user_channel.rb +18 -5
  88. data/lib/twilio-ruby/rest/chat/v2/credential.rb +30 -17
  89. data/lib/twilio-ruby/rest/chat/v2/service.rb +29 -16
  90. data/lib/twilio-ruby/rest/chat/v2/service/channel.rb +32 -19
  91. data/lib/twilio-ruby/rest/chat/v2/service/channel/invite.rb +27 -14
  92. data/lib/twilio-ruby/rest/chat/v2/service/channel/member.rb +32 -19
  93. data/lib/twilio-ruby/rest/chat/v2/service/channel/message.rb +32 -19
  94. data/lib/twilio-ruby/rest/chat/v2/service/role.rb +27 -14
  95. data/lib/twilio-ruby/rest/chat/v2/service/user.rb +30 -17
  96. data/lib/twilio-ruby/rest/chat/v2/service/user/user_channel.rb +18 -5
  97. data/lib/twilio-ruby/rest/fax.rb +2 -2
  98. data/lib/twilio-ruby/rest/fax/v1/fax.rb +32 -19
  99. data/lib/twilio-ruby/rest/fax/v1/fax/fax_media.rb +21 -8
  100. data/lib/twilio-ruby/rest/ip_messaging.rb +4 -4
  101. data/lib/twilio-ruby/rest/ip_messaging/v1/credential.rb +30 -17
  102. data/lib/twilio-ruby/rest/ip_messaging/v1/service.rb +29 -16
  103. data/lib/twilio-ruby/rest/ip_messaging/v1/service/channel.rb +32 -19
  104. data/lib/twilio-ruby/rest/ip_messaging/v1/service/channel/invite.rb +27 -14
  105. data/lib/twilio-ruby/rest/ip_messaging/v1/service/channel/member.rb +32 -19
  106. data/lib/twilio-ruby/rest/ip_messaging/v1/service/channel/message.rb +32 -19
  107. data/lib/twilio-ruby/rest/ip_messaging/v1/service/role.rb +27 -14
  108. data/lib/twilio-ruby/rest/ip_messaging/v1/service/user.rb +30 -17
  109. data/lib/twilio-ruby/rest/ip_messaging/v1/service/user/user_channel.rb +18 -5
  110. data/lib/twilio-ruby/rest/ip_messaging/v2/credential.rb +30 -17
  111. data/lib/twilio-ruby/rest/ip_messaging/v2/service.rb +29 -16
  112. data/lib/twilio-ruby/rest/ip_messaging/v2/service/channel.rb +32 -19
  113. data/lib/twilio-ruby/rest/ip_messaging/v2/service/channel/invite.rb +27 -14
  114. data/lib/twilio-ruby/rest/ip_messaging/v2/service/channel/member.rb +32 -19
  115. data/lib/twilio-ruby/rest/ip_messaging/v2/service/channel/message.rb +32 -19
  116. data/lib/twilio-ruby/rest/ip_messaging/v2/service/role.rb +27 -14
  117. data/lib/twilio-ruby/rest/ip_messaging/v2/service/user.rb +30 -17
  118. data/lib/twilio-ruby/rest/ip_messaging/v2/service/user/user_channel.rb +18 -5
  119. data/lib/twilio-ruby/rest/lookups.rb +2 -2
  120. data/lib/twilio-ruby/rest/lookups/v1/phone_number.rb +6 -6
  121. data/lib/twilio-ruby/rest/messaging.rb +2 -2
  122. data/lib/twilio-ruby/rest/messaging/v1/service.rb +30 -17
  123. data/lib/twilio-ruby/rest/messaging/v1/service/alpha_sender.rb +24 -11
  124. data/lib/twilio-ruby/rest/messaging/v1/service/phone_number.rb +24 -11
  125. data/lib/twilio-ruby/rest/messaging/v1/service/short_code.rb +24 -11
  126. data/lib/twilio-ruby/rest/monitor.rb +4 -4
  127. data/lib/twilio-ruby/rest/monitor/v1/alert.rb +23 -10
  128. data/lib/twilio-ruby/rest/monitor/v1/event.rb +22 -9
  129. data/lib/twilio-ruby/rest/notify.rb +4 -4
  130. data/lib/twilio-ruby/rest/notify/v1/credential.rb +30 -17
  131. data/lib/twilio-ruby/rest/notify/v1/service.rb +32 -19
  132. data/lib/twilio-ruby/rest/notify/v1/service/binding.rb +27 -14
  133. data/lib/twilio-ruby/rest/notify/v1/service/notification.rb +5 -5
  134. data/lib/twilio-ruby/rest/notify/v1/service/segment.rb +18 -5
  135. data/lib/twilio-ruby/rest/notify/v1/service/user.rb +27 -14
  136. data/lib/twilio-ruby/rest/notify/v1/service/user/segment_memberships.rb +7 -7
  137. data/lib/twilio-ruby/rest/notify/v1/service/user/user_binding.rb +27 -14
  138. data/lib/twilio-ruby/rest/preview.rb +18 -18
  139. data/lib/twilio-ruby/rest/preview/bulk_exports/export.rb +3 -3
  140. data/lib/twilio-ruby/rest/preview/bulk_exports/export/day.rb +18 -5
  141. data/lib/twilio-ruby/rest/preview/bulk_exports/export_configuration.rb +8 -8
  142. data/lib/twilio-ruby/rest/preview/hosted_numbers/hosted_number_order.rb +32 -19
  143. data/lib/twilio-ruby/rest/preview/marketplace/available_add_on.rb +20 -7
  144. data/lib/twilio-ruby/rest/preview/marketplace/available_add_on/available_add_on_extension.rb +20 -7
  145. data/lib/twilio-ruby/rest/preview/marketplace/installed_add_on.rb +30 -17
  146. data/lib/twilio-ruby/rest/preview/marketplace/installed_add_on/installed_add_on_extension.rb +23 -10
  147. data/lib/twilio-ruby/rest/preview/proxy/service.rb +30 -17
  148. data/lib/twilio-ruby/rest/preview/proxy/service/phone_number.rb +24 -11
  149. data/lib/twilio-ruby/rest/preview/proxy/service/session.rb +32 -19
  150. data/lib/twilio-ruby/rest/preview/proxy/service/session/interaction.rb +22 -9
  151. data/lib/twilio-ruby/rest/preview/proxy/service/session/participant.rb +32 -19
  152. data/lib/twilio-ruby/rest/preview/proxy/service/session/participant/message_interaction.rb +24 -11
  153. data/lib/twilio-ruby/rest/preview/proxy/service/short_code.rb +24 -11
  154. data/lib/twilio-ruby/rest/preview/sync/service.rb +30 -17
  155. data/lib/twilio-ruby/rest/preview/sync/service/document.rb +28 -15
  156. data/lib/twilio-ruby/rest/preview/sync/service/document/document_permission.rb +24 -11
  157. data/lib/twilio-ruby/rest/preview/sync/service/sync_list.rb +25 -12
  158. data/lib/twilio-ruby/rest/preview/sync/service/sync_list/sync_list_item.rb +29 -16
  159. data/lib/twilio-ruby/rest/preview/sync/service/sync_list/sync_list_permission.rb +24 -11
  160. data/lib/twilio-ruby/rest/preview/sync/service/sync_map.rb +25 -12
  161. data/lib/twilio-ruby/rest/preview/sync/service/sync_map/sync_map_item.rb +29 -16
  162. data/lib/twilio-ruby/rest/preview/sync/service/sync_map/sync_map_permission.rb +24 -11
  163. data/lib/twilio-ruby/rest/preview/wireless/command.rb +26 -13
  164. data/lib/twilio-ruby/rest/preview/wireless/rate_plan.rb +30 -17
  165. data/lib/twilio-ruby/rest/preview/wireless/sim.rb +28 -15
  166. data/lib/twilio-ruby/rest/preview/wireless/sim/usage.rb +6 -6
  167. data/lib/twilio-ruby/rest/pricing.rb +3 -3
  168. data/lib/twilio-ruby/rest/pricing/v1/messaging.rb +1 -1
  169. data/lib/twilio-ruby/rest/pricing/v1/messaging/country.rb +20 -7
  170. data/lib/twilio-ruby/rest/pricing/v1/phone_number.rb +1 -1
  171. data/lib/twilio-ruby/rest/pricing/v1/phone_number/country.rb +20 -7
  172. data/lib/twilio-ruby/rest/pricing/v1/voice.rb +1 -1
  173. data/lib/twilio-ruby/rest/pricing/v1/voice/country.rb +20 -7
  174. data/lib/twilio-ruby/rest/pricing/v1/voice/number.rb +3 -3
  175. data/lib/twilio-ruby/rest/sync.rb +2 -2
  176. data/lib/twilio-ruby/rest/sync/v1/service.rb +30 -17
  177. data/lib/twilio-ruby/rest/sync/v1/service/document.rb +28 -15
  178. data/lib/twilio-ruby/rest/sync/v1/service/document/document_permission.rb +24 -11
  179. data/lib/twilio-ruby/rest/sync/v1/service/sync_list.rb +25 -12
  180. data/lib/twilio-ruby/rest/sync/v1/service/sync_list/sync_list_item.rb +29 -16
  181. data/lib/twilio-ruby/rest/sync/v1/service/sync_list/sync_list_permission.rb +24 -11
  182. data/lib/twilio-ruby/rest/sync/v1/service/sync_map.rb +25 -12
  183. data/lib/twilio-ruby/rest/sync/v1/service/sync_map/sync_map_item.rb +29 -16
  184. data/lib/twilio-ruby/rest/sync/v1/service/sync_map/sync_map_permission.rb +24 -11
  185. data/lib/twilio-ruby/rest/taskrouter.rb +2 -2
  186. data/lib/twilio-ruby/rest/taskrouter/v1/workspace.rb +33 -20
  187. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/activity.rb +32 -19
  188. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/event.rb +22 -9
  189. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task.rb +32 -19
  190. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task/reservation.rb +27 -14
  191. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_channel.rb +20 -7
  192. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue.rb +33 -20
  193. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue/task_queue_statistics.rb +6 -6
  194. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/task_queue/task_queues_statistics.rb +20 -7
  195. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker.rb +33 -20
  196. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/reservation.rb +27 -14
  197. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/worker_channel.rb +25 -12
  198. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/worker_statistics.rb +6 -6
  199. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/worker/workers_statistics.rb +6 -6
  200. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workflow.rb +33 -20
  201. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workflow/workflow_statistics.rb +6 -6
  202. data/lib/twilio-ruby/rest/taskrouter/v1/workspace/workspace_statistics.rb +6 -6
  203. data/lib/twilio-ruby/rest/trunking.rb +2 -2
  204. data/lib/twilio-ruby/rest/trunking/v1/trunk.rb +30 -17
  205. data/lib/twilio-ruby/rest/trunking/v1/trunk/credential_list.rb +24 -11
  206. data/lib/twilio-ruby/rest/trunking/v1/trunk/ip_access_control_list.rb +24 -11
  207. data/lib/twilio-ruby/rest/trunking/v1/trunk/origination_url.rb +29 -16
  208. data/lib/twilio-ruby/rest/trunking/v1/trunk/phone_number.rb +24 -11
  209. data/lib/twilio-ruby/rest/video.rb +4 -4
  210. data/lib/twilio-ruby/rest/video/v1/recording.rb +23 -10
  211. data/lib/twilio-ruby/rest/video/v1/room.rb +29 -16
  212. data/lib/twilio-ruby/rest/video/v1/room/recording.rb +20 -7
  213. data/lib/twilio-ruby/rest/wireless.rb +6 -6
  214. data/lib/twilio-ruby/rest/wireless/v1/command.rb +26 -13
  215. data/lib/twilio-ruby/rest/wireless/v1/rate_plan.rb +30 -17
  216. data/lib/twilio-ruby/rest/wireless/v1/sim.rb +27 -14
  217. data/lib/twilio-ruby/rest/wireless/v1/sim/usage_record.rb +20 -7
  218. data/lib/twilio-ruby/twiml/messaging_response.rb +147 -0
  219. data/lib/twilio-ruby/twiml/twiml.rb +77 -0
  220. data/lib/twilio-ruby/twiml/voice_response.rb +925 -0
  221. data/lib/twilio-ruby/version.rb +1 -1
  222. data/spec/holodeck/hologram.rb +0 -1
  223. data/spec/jwt/access_token_spec.rb +126 -182
  224. data/spec/jwt/client_capability_spec.rb +104 -0
  225. data/spec/jwt/task_router_spec.rb +164 -97
  226. data/spec/twiml/messaging_response_spec.rb +62 -0
  227. data/spec/twiml/voice_response_spec.rb +452 -0
  228. data/twilio-ruby.gemspec +4 -2
  229. metadata +36 -23
  230. data/lib/twilio-ruby/compatibility/v2010/account/call/feedback.rb +0 -15
  231. data/lib/twilio-ruby/compatibility/v2010/account/queue/member.rb +0 -23
  232. data/lib/twilio-ruby/jwt/capability.rb +0 -64
  233. data/lib/twilio-ruby/twiml/response.rb +0 -16
  234. data/spec/jwt/capability_spec.rb +0 -186
  235. data/spec/jwt/task_router_taskqueue_spec.rb +0 -111
  236. data/spec/jwt/task_router_worker_spec.rb +0 -146
  237. data/spec/jwt/task_router_workspace_spec.rb +0 -110
  238. data/spec/twiml/twiml_response_spec.rb +0 -47
@@ -0,0 +1,62 @@
1
+ require 'spec_helper'
2
+
3
+ describe Twilio::TwiML::MessagingResponse do
4
+ context 'Testing Response' do
5
+ it 'should allow empty response' do
6
+ r = Twilio::TwiML::MessagingResponse.new
7
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response/>')
8
+ end
9
+
10
+ it 'should allow populated response' do
11
+ r = Twilio::TwiML::MessagingResponse.new
12
+ r.message 'Hello'
13
+ r.redirect('example.com')
14
+
15
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Message>Hello</Message><Redirect>example.com</Redirect></Response>')
16
+ end
17
+
18
+ it 'should allow chaining' do
19
+ r = Twilio::TwiML::MessagingResponse.new.message('Hello').redirect('example.com')
20
+
21
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Message>Hello</Message><Redirect>example.com</Redirect></Response>')
22
+ end
23
+ end
24
+
25
+ context 'Testing Message' do
26
+ it 'should allow a body' do
27
+ r = Twilio::TwiML::MessagingResponse.new
28
+ r.message 'Hello'
29
+
30
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Message>Hello</Message></Response>')
31
+ end
32
+
33
+ it 'should allow appending Body' do
34
+ b = Twilio::TwiML::Body.new('Hello World')
35
+
36
+ r = Twilio::TwiML::MessagingResponse.new
37
+ r.append(b)
38
+
39
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Body>Hello World</Body></Response>')
40
+ end
41
+
42
+ it 'should allow appending Body and Media' do
43
+ b = Twilio::TwiML::Body.new('Hello World')
44
+ m = Twilio::TwiML::Media.new('hey.jpg')
45
+
46
+ r = Twilio::TwiML::MessagingResponse.new
47
+ r.append(b)
48
+ r.append(m)
49
+
50
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Body>Hello World</Body><Media>hey.jpg</Media></Response>')
51
+ end
52
+ end
53
+
54
+ context 'Testing Redirect' do
55
+ it 'should allow MessagingResponse.redirect' do
56
+ r = Twilio::TwiML::MessagingResponse.new
57
+ r.redirect('example.com')
58
+
59
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Redirect>example.com</Redirect></Response>')
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,452 @@
1
+ require 'spec_helper'
2
+
3
+ describe Twilio::TwiML::VoiceResponse do
4
+ context 'Testing Response' do
5
+ it 'should allow empty response' do
6
+ r = Twilio::TwiML::VoiceResponse.new
7
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response/>')
8
+ end
9
+
10
+ it 'should allow populated response' do
11
+ r = Twilio::TwiML::VoiceResponse.new
12
+ r.hangup
13
+ r.leave
14
+ r.sms('twilio sms', to: '+11234567890', from: '+10987654321')
15
+
16
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Hangup/><Leave/><Sms from="+10987654321" to="+11234567890">twilio sms</Sms></Response>')
17
+ end
18
+
19
+ it 'should allow chaining' do
20
+ r = Twilio::TwiML::VoiceResponse.new.hangup.leave.sms(
21
+ 'twilio sms',
22
+ to: '+11234567890',
23
+ from: '+10987654321'
24
+ )
25
+
26
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Hangup/><Leave/><Sms from="+10987654321" to="+11234567890">twilio sms</Sms></Response>')
27
+ end
28
+ end
29
+
30
+ context 'Testing Say' do
31
+ it 'should allow empty say' do
32
+ r = Twilio::TwiML::VoiceResponse.new
33
+ r.say ''
34
+
35
+ # For Ruby 2.0, 2.1, 2.2 both opening and closing tags are generated
36
+ # Ruby 2.4 generates an empty tag
37
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Say></Say></Response>')
38
+ .or(eq('<?xml version="1.0" encoding="UTF-8"?><Response><Say/></Response>'))
39
+ end
40
+
41
+ it 'should allow populated say' do
42
+ r = Twilio::TwiML::VoiceResponse.new
43
+ r.say 'Hello World'
44
+
45
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Say>Hello World</Say></Response>')
46
+ end
47
+
48
+ it 'should allow unicode say' do
49
+ r = Twilio::TwiML::VoiceResponse.new
50
+ r.say 'nécessaire et d\'autres'
51
+
52
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Say>nécessaire et d\'autres</Say></Response>')
53
+ end
54
+
55
+ it 'should allow looping' do
56
+ r = Twilio::TwiML::VoiceResponse.new
57
+ r.say 'Hello Monkey', loop: 3
58
+
59
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Say loop="3">Hello Monkey</Say></Response>')
60
+ end
61
+
62
+ it 'should allow languages' do
63
+ r = Twilio::TwiML::VoiceResponse.new
64
+ r.say 'Hello Monkey', language: 'en-gb'
65
+
66
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Say language="en-gb">Hello Monkey</Say></Response>')
67
+ end
68
+
69
+ it 'should allow all attributes' do
70
+ r = Twilio::TwiML::VoiceResponse.new
71
+ r.say 'Hello Monkey', loop: 3, voice: 'man', language: 'fr'
72
+
73
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Say language="fr" loop="3" voice="man">Hello Monkey</Say></Response>')
74
+ end
75
+ end
76
+
77
+ context 'Testing Play' do
78
+ it 'should allow empty play' do
79
+ r = Twilio::TwiML::VoiceResponse.new
80
+ r.play ''
81
+
82
+ # For Ruby 2.0, 2.1, 2.2 both opening and closing tags are generated
83
+ # Ruby 2.4 generates an empty tag
84
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Play></Play></Response>')
85
+ .or(eq('<?xml version="1.0" encoding="UTF-8"?><Response><Play/></Response>'))
86
+ end
87
+
88
+ it 'should play hello' do
89
+ r = Twilio::TwiML::VoiceResponse.new
90
+ r.play 'http://hellomonkey.mp3'
91
+
92
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Play>http://hellomonkey.mp3</Play></Response>')
93
+ end
94
+
95
+ it 'should play hello on loop' do
96
+ r = Twilio::TwiML::VoiceResponse.new
97
+ r.play 'http://hellomonkey.mp3', loop: 3
98
+
99
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Play loop="3">http://hellomonkey.mp3</Play></Response>')
100
+ end
101
+
102
+ it 'should play digits' do
103
+ r = Twilio::TwiML::VoiceResponse.new
104
+ r.play '', digits: 'w123'
105
+
106
+ # For Ruby 2.0, 2.1, 2.2 both opening and closing tags are generated
107
+ # Ruby 2.4 generates an empty tag
108
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Play digits="w123"></Play></Response>')
109
+ .or(eq('<?xml version="1.0" encoding="UTF-8"?><Response><Play digits="w123"/></Response>'))
110
+ end
111
+ end
112
+
113
+ context 'Testing Record' do
114
+ it 'should allow empty record' do
115
+ r = Twilio::TwiML::VoiceResponse.new
116
+ r.record
117
+
118
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Record/></Response>')
119
+ end
120
+
121
+ it 'should allow action and method' do
122
+ r = Twilio::TwiML::VoiceResponse.new
123
+ r.record action: 'example.com', method: 'GET'
124
+
125
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Record action="example.com" method="GET"/></Response>')
126
+ end
127
+
128
+ it 'should allow max_length, finish_on_key, and timeout' do
129
+ r = Twilio::TwiML::VoiceResponse.new
130
+ r.record timeout: 4, finish_on_key: '#', max_length: 30
131
+
132
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Record finishOnKey="#" maxLength="30" timeout="4"/></Response>')
133
+ end
134
+
135
+ it 'should allow transcribe' do
136
+ r = Twilio::TwiML::VoiceResponse.new
137
+ r.record transcribe_callback: 'example.com'
138
+
139
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Record transcribeCallback="example.com"/></Response>')
140
+ end
141
+ end
142
+
143
+ context 'Testing Redirect' do
144
+ it 'should allow empty redirect' do
145
+ r = Twilio::TwiML::VoiceResponse.new
146
+ r.redirect ''
147
+
148
+ # For Ruby 2.0, 2.1, 2.2 both opening and closing tags are generated
149
+ # Ruby 2.4 generates an empty tag
150
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Redirect></Redirect></Response>')
151
+ .or(eq('<?xml version="1.0" encoding="UTF-8"?><Response><Redirect/></Response>'))
152
+ end
153
+
154
+ it 'should allow method' do
155
+ r = Twilio::TwiML::VoiceResponse.new
156
+ r.redirect 'example.com', method: 'POST'
157
+
158
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Redirect method="POST">example.com</Redirect></Response>')
159
+ end
160
+
161
+ it 'should allow method and params' do
162
+ r = Twilio::TwiML::VoiceResponse.new
163
+ r.redirect 'example.com?id=34&action=hey', method: 'POST'
164
+
165
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Redirect method="POST">example.com?id=34&amp;action=hey</Redirect></Response>')
166
+ end
167
+ end
168
+
169
+ context 'Testing Hangup' do
170
+ it 'should allow hangup' do
171
+ r = Twilio::TwiML::VoiceResponse.new
172
+ r.hangup
173
+
174
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Hangup/></Response>')
175
+ end
176
+ end
177
+
178
+ context 'Testing Leave' do
179
+ it 'should allow leave' do
180
+ r = Twilio::TwiML::VoiceResponse.new
181
+ r.leave
182
+
183
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Leave/></Response>')
184
+ end
185
+ end
186
+
187
+ context 'Testing Reject' do
188
+ it 'should reject with a default reason' do
189
+ r = Twilio::TwiML::VoiceResponse.new
190
+ r.reject
191
+
192
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Reject/></Response>')
193
+ end
194
+ end
195
+
196
+ context 'Testing SMS' do
197
+ it 'should allow empty SMS' do
198
+ r = Twilio::TwiML::VoiceResponse.new
199
+ r.sms ''
200
+
201
+ # For Ruby 2.0, 2.1, 2.2 both opening and closing tags are generated
202
+ # Ruby 2.4 generates an empty tag
203
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Sms></Sms></Response>')
204
+ .or(eq('<?xml version="1.0" encoding="UTF-8"?><Response><Sms/></Response>'))
205
+ end
206
+
207
+ it 'should allow SMS body' do
208
+ r = Twilio::TwiML::VoiceResponse.new
209
+ r.sms 'Hello, World'
210
+
211
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Sms>Hello, World</Sms></Response>')
212
+ end
213
+
214
+ it 'should allow to, from, action, and status_callback' do
215
+ r = Twilio::TwiML::VoiceResponse.new
216
+ r.sms('Hello, World', to: 1231231234, from: 3453453456, status_callback: 'example.com?id=34&action=hey')
217
+
218
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Sms from="3453453456" statusCallback="example.com?id=34&amp;action=hey" to="1231231234">Hello, World</Sms></Response>')
219
+ end
220
+
221
+ it 'should allow action and method' do
222
+ r = Twilio::TwiML::VoiceResponse.new
223
+ r.sms('Hello', method: 'POST', action: 'example.com?id=34&action=hey')
224
+
225
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Sms action="example.com?id=34&amp;action=hey" method="POST">Hello</Sms></Response>')
226
+ end
227
+ end
228
+
229
+ context 'Testing Conference' do
230
+ it 'should allow basic conferencing' do
231
+ d = Twilio::TwiML::Dial.new
232
+ d.conference(
233
+ 'TestConferenceAttributes',
234
+ beep: false,
235
+ wait_url: '',
236
+ start_conference_on_enter: true,
237
+ end_conference_on_exit: true
238
+ )
239
+
240
+ r = Twilio::TwiML::VoiceResponse.new
241
+ r.append(d)
242
+
243
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Conference beep="false" endConferenceOnExit="true" startConferenceOnEnter="true" waitUrl="">TestConferenceAttributes</Conference></Dial></Response>')
244
+ end
245
+
246
+ it 'should allow muted conferencing' do
247
+ d = Twilio::TwiML::Dial.new
248
+ d.conference(
249
+ 'TestConferenceMutedAttribute',
250
+ beep: false,
251
+ muted: true,
252
+ wait_url: '',
253
+ start_conference_on_enter: true,
254
+ end_conference_on_exit: true
255
+ )
256
+
257
+ r = Twilio::TwiML::VoiceResponse.new
258
+ r.append(d)
259
+
260
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Conference beep="false" endConferenceOnExit="true" muted="true" startConferenceOnEnter="true" waitUrl="">TestConferenceMutedAttribute</Conference></Dial></Response>')
261
+ end
262
+ end
263
+
264
+ context 'Testing Queue' do
265
+ it 'should allow queues in VoiceResponse' do
266
+ d = Twilio::TwiML::Dial.new
267
+ d.queue('TestQueueAttribute', url: '', method: 'GET')
268
+
269
+ r = Twilio::TwiML::VoiceResponse.new
270
+ r.append(d)
271
+
272
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Queue method="GET" url="">TestQueueAttribute</Queue></Dial></Response>')
273
+ end
274
+ end
275
+
276
+ context 'Testing Echo' do
277
+ it 'should allow VoiceResponse Echo' do
278
+ r = Twilio::TwiML::VoiceResponse.new
279
+ r.echo
280
+
281
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Echo/></Response>')
282
+ end
283
+ end
284
+
285
+ context 'Testing Enqueue' do
286
+ it 'should allow VoiceResponse.enqueue' do
287
+ r = Twilio::TwiML::VoiceResponse.new
288
+ r.enqueue(
289
+ 'TestEnqueueAttribute',
290
+ action: 'act',
291
+ method: 'GET',
292
+ wait_url: 'wait',
293
+ wait_url_method: 'POST'
294
+ )
295
+
296
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Enqueue action="act" method="GET" waitUrl="wait" waitUrlMethod="POST">TestEnqueueAttribute</Enqueue></Response>')
297
+ end
298
+
299
+ it 'should allow Enqueue.task and appending Enqueue' do
300
+ e = Twilio::TwiML::Enqueue.new(nil, workflow_sid: '123123123')
301
+ e.task('{"account_sid": "AC123123123"}')
302
+
303
+ r = Twilio::TwiML::VoiceResponse.new
304
+ r.append(e)
305
+
306
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Enqueue workflowSid="123123123"><Task>{"account_sid": "AC123123123"}</Task></Enqueue></Response>')
307
+ end
308
+
309
+ it 'should allow Enqueue.task with a dictionary and appending Enqueue' do
310
+ e = Twilio::TwiML::Enqueue.new(nil, workflow_sid: '123123123')
311
+ e.task({account_sid: 'AC123123123'})
312
+
313
+ r = Twilio::TwiML::VoiceResponse.new
314
+ r.append(e)
315
+
316
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Enqueue workflowSid="123123123"><Task>{"account_sid":"AC123123123"}</Task></Enqueue></Response>')
317
+ end
318
+ end
319
+
320
+ context 'Testing Dial' do
321
+ it 'should allow VoiceResponse.dial' do
322
+ r = Twilio::TwiML::VoiceResponse.new
323
+ r.dial '1231231234'
324
+
325
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Dial>1231231234</Dial></Response>')
326
+ end
327
+
328
+ it 'should allow Dial.sim' do
329
+ d = Twilio::TwiML::Dial.new
330
+ d.sim '123123123'
331
+
332
+ r = Twilio::TwiML::VoiceResponse.new
333
+ r.append(d)
334
+
335
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Sim>123123123</Sim></Dial></Response>')
336
+ end
337
+
338
+ it 'should allow Dial.sip' do
339
+ d = Twilio::TwiML::Dial.new
340
+ d.sip 'foo@example.com'
341
+
342
+ r = Twilio::TwiML::VoiceResponse.new
343
+ r.append(d)
344
+
345
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Sip>foo@example.com</Sip></Dial></Response>')
346
+ end
347
+
348
+ it 'should allow Dial.sip with username, password' do
349
+ d = Twilio::TwiML::Dial.new
350
+ d.sip('foo@example.com', username: 'foo', password: 'bar')
351
+
352
+ r = Twilio::TwiML::VoiceResponse.new
353
+ r.append(d)
354
+
355
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Sip password="bar" username="foo">foo@example.com</Sip></Dial></Response>')
356
+ end
357
+
358
+ it 'should allow Dial.number' do
359
+ d = Twilio::TwiML::Dial.new
360
+ d.number '1231231234'
361
+
362
+ r = Twilio::TwiML::VoiceResponse.new
363
+ r.append(d)
364
+
365
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Number>1231231234</Number></Dial></Response>')
366
+ end
367
+
368
+ it 'should allow Dial.number with params' do
369
+ d = Twilio::TwiML::Dial.new
370
+ d.number('1231231234', status_callback: 'http://example.com', status_callback_event: 'initiated completed')
371
+
372
+ r = Twilio::TwiML::VoiceResponse.new
373
+ r.append(d)
374
+
375
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Number statusCallback="http://example.com" statusCallbackEvent="initiated completed">1231231234</Number></Dial></Response>')
376
+ end
377
+
378
+ it 'should allow Dial.conference' do
379
+ d = Twilio::TwiML::Dial.new
380
+ d.conference 'My Room'
381
+
382
+ r = Twilio::TwiML::VoiceResponse.new
383
+ r.append(d)
384
+
385
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Conference>My Room</Conference></Dial></Response>')
386
+ end
387
+
388
+ it 'should allow Dial.queue' do
389
+ d = Twilio::TwiML::Dial.new
390
+ d.queue 'The Cute Queue'
391
+
392
+ r = Twilio::TwiML::VoiceResponse.new
393
+ r.append(d)
394
+
395
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Queue>The Cute Queue</Queue></Dial></Response>')
396
+ end
397
+
398
+ it 'should allow empty Dial.client' do
399
+ d = Twilio::TwiML::Dial.new
400
+ d.client ''
401
+
402
+ r = Twilio::TwiML::VoiceResponse.new
403
+ r.append(d)
404
+
405
+ # For Ruby 2.0, 2.1, 2.2 both opening and closing tags are generated
406
+ # Ruby 2.4 generates an empty tag
407
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Client></Client></Dial></Response>')
408
+ .or(eq('<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Client/></Dial></Response>'))
409
+ end
410
+
411
+ it 'should allow populated Dial.client' do
412
+ d = Twilio::TwiML::Dial.new
413
+ d.client 'alice'
414
+
415
+ r = Twilio::TwiML::VoiceResponse.new
416
+ r.append(d)
417
+
418
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Dial><Client>alice</Client></Dial></Response>')
419
+ end
420
+ end
421
+
422
+ context 'Testing Gather' do
423
+ it 'should allow empty Gather' do
424
+ r = Twilio::TwiML::VoiceResponse.new
425
+ r.gather
426
+
427
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Gather/></Response>')
428
+ end
429
+
430
+ it 'should allow Gather.say' do
431
+ g = Twilio::TwiML::Gather.new
432
+ g.say 'Hello'
433
+
434
+ r = Twilio::TwiML::VoiceResponse.new
435
+ r.append(g)
436
+
437
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Gather><Say>Hello</Say></Gather></Response>')
438
+ end
439
+
440
+ it 'should allow nested play and pause' do
441
+ g = Twilio::TwiML::Gather.new
442
+ g.say 'Hey'
443
+ g.play 'hey.mp3'
444
+ g.pause
445
+
446
+ r = Twilio::TwiML::VoiceResponse.new
447
+ r.append(g)
448
+
449
+ expect(r.to_s).to eq('<?xml version="1.0" encoding="UTF-8"?><Response><Gather><Say>Hey</Say><Play>hey.mp3</Play><Pause/></Gather></Response>')
450
+ end
451
+ end
452
+ end