twilio 1.4.0 → 2.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +28 -13
- data/VERSION.yml +2 -2
- data/lib/twilio/account.rb +2 -2
- data/lib/twilio/call.rb +8 -9
- data/lib/twilio/connection.rb +13 -6
- data/lib/twilio/incoming_phone_number.rb +5 -2
- data/lib/twilio/local_phone_number.rb +6 -3
- data/lib/twilio/notification.rb +6 -3
- data/lib/twilio/outgoing_caller_id.rb +9 -6
- data/lib/twilio/recording.rb +7 -4
- data/lib/twilio/toll_free_phone_number.rb +5 -2
- data/lib/twilio/twilio_object.rb +9 -4
- data/lib/twilio/verb.rb +292 -163
- data/test/fixtures/yml/verb_responses.yml +33 -3
- data/test/twilio/account_test.rb +17 -5
- data/test/twilio/call_test.rb +22 -9
- data/test/twilio/connection_test.rb +11 -0
- data/test/twilio/incoming_phone_number_test.rb +20 -7
- data/test/twilio/local_phone_number_test.rb +17 -5
- data/test/twilio/notification_test.rb +19 -7
- data/test/twilio/outgoing_caller_id_test.rb +19 -10
- data/test/twilio/recording_test.rb +19 -8
- data/test/twilio/toll_free_phone_number_test.rb +17 -5
- data/test/twilio/verb_test.rb +82 -4
- metadata +5 -3
data/lib/twilio/verb.rb
CHANGED
@@ -1,186 +1,315 @@
|
|
1
1
|
module Twilio
|
2
2
|
# Twilio Verbs enable your application to respond to Twilio requests (to your app) with XML responses.
|
3
|
+
# There are 5 primary verbs (say, play, gather, record, dial) and 3 secondary (hangup, pause, redirect).
|
4
|
+
# Verbs can be chained and, in some cases, nested.
|
3
5
|
#
|
4
|
-
#
|
5
|
-
#
|
6
|
-
#
|
6
|
+
# If your response consists of a single verb, you can call a Verb class method:
|
7
|
+
#
|
8
|
+
# Twilio::Verb.say('The time is 9:35 PM.')
|
9
|
+
#
|
10
|
+
# But if you need to chain several verbs together, just wrap them in an instance block and call the 'response' attribute:
|
11
|
+
#
|
12
|
+
# verb = Twilio::Verb.new { |v|
|
13
|
+
# v.dial('415-123-4567')
|
14
|
+
# v.redirect('http://www.foo.com/nextInstructions')
|
15
|
+
# }
|
16
|
+
# verb.response
|
7
17
|
class Verb
|
18
|
+
|
19
|
+
attr_reader :response
|
20
|
+
|
8
21
|
class << self
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
# Examples:
|
13
|
-
# Twilio::Verb.say('The time is 9:35 PM.')
|
14
|
-
# Twilio::Verb.say_3_times('The time is 9:35 PM.')
|
15
|
-
#
|
16
|
-
# With numbers, 12345 will be spoken as "twelve thousand three hundred forty five" while
|
17
|
-
# 1 2 3 4 5 will be spoken as "one two three four five."
|
18
|
-
#
|
19
|
-
# Twilio::Verb.say_4_times('Your PIN is 1234')
|
20
|
-
# Twilio::Verb.say_4_times('Your PIN is 1 2 3 4')
|
21
|
-
#
|
22
|
-
# If you need a longer pause between each loop, use the pause form:
|
23
|
-
#
|
24
|
-
# Twilio::Verb.say_4_times_with_pause('Your PIN is 1 2 3 4')
|
25
|
-
#
|
26
|
-
# Options (see http://www.twilio.com/docs/api_reference/TwiML/say) are passed in as a hash:
|
27
|
-
#
|
28
|
-
# Twilio::Verb.say('The time is 9:35 PM.', :voice => 'woman')
|
29
|
-
# Twilio::Verb.say('The time is 9:35 PM.', {:voice => 'woman', :language => 'es'})
|
30
|
-
def say(*args, &block)
|
31
|
-
options = {:voice => 'man', :language => 'en', :loop => 1}
|
32
|
-
args.each do |arg|
|
33
|
-
case arg
|
34
|
-
when String
|
35
|
-
options[:text_to_speak] = arg
|
36
|
-
when Hash
|
37
|
-
options.merge!(arg)
|
38
|
-
else
|
39
|
-
raise ArgumentError, 'say expects String or Hash argument'
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
xml = Builder::XmlMarkup.new
|
44
|
-
xml.instruct!
|
45
|
-
xml.Response {
|
46
|
-
if options[:pause]
|
47
|
-
loop_with_pause(options[:loop], xml) do
|
48
|
-
xml.Say(options[:text_to_speak], :voice => options[:voice], :language => options[:language])
|
49
|
-
end
|
50
|
-
else
|
51
|
-
xml.Say(options[:text_to_speak], :voice => options[:voice], :language => options[:language], :loop => options[:loop])
|
52
|
-
end
|
53
|
-
}
|
22
|
+
def method_missing(method_id, *args) #:nodoc:
|
23
|
+
v = Verb.new
|
24
|
+
v.send(method_id, *args)
|
54
25
|
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def initialize(&block)
|
29
|
+
@xml = Builder::XmlMarkup.new
|
30
|
+
@xml.instruct!
|
55
31
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
32
|
+
if block_given?
|
33
|
+
@chain = true
|
34
|
+
@response = @xml.Response { block.call(self) }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# The Say verb converts text to speech that is read back to the caller.
|
39
|
+
# Say is useful for dynamic text that is difficult to prerecord.
|
40
|
+
#
|
41
|
+
# Examples:
|
42
|
+
# Twilio::Verb.say('The time is 9:35 PM.')
|
43
|
+
# Twilio::Verb.say('The time is 9:35 PM.', :loop => 3)
|
44
|
+
#
|
45
|
+
# With numbers, 12345 will be spoken as "twelve thousand three hundred forty five" while
|
46
|
+
# 1 2 3 4 5 will be spoken as "one two three four five."
|
47
|
+
#
|
48
|
+
# Twilio::Verb.say('Your PIN is 1234', :loop => 4)
|
49
|
+
# Twilio::Verb.say('Your PIN is 1 2 3 4', :loop => 4)
|
50
|
+
#
|
51
|
+
# If you need a longer pause between each loop, instead of explicitly calling the Pause
|
52
|
+
# verb within a block, you can set the convenient pause option:
|
53
|
+
#
|
54
|
+
# Twilio::Verb.say('Your PIN is 1 2 3 4', :loop => 4, :pause => true)
|
55
|
+
#
|
56
|
+
# Options (see http://www.twilio.com/docs/api_reference/TwiML/say) are passed in as a hash:
|
57
|
+
#
|
58
|
+
# Twilio::Verb.say('The time is 9:35 PM.', :voice => 'woman')
|
59
|
+
# Twilio::Verb.say('The time is 9:35 PM.', {:voice => 'woman', :language => 'es'})
|
60
|
+
def say(*args)
|
61
|
+
options = {:voice => 'man', :language => 'en', :loop => 1}
|
62
|
+
args.each do |arg|
|
63
|
+
case arg
|
64
|
+
when String
|
65
|
+
options[:text_to_speak] = arg
|
66
|
+
when Hash
|
67
|
+
options.merge!(arg)
|
68
|
+
else
|
69
|
+
raise ArgumentError, 'say expects String or Hash argument'
|
79
70
|
end
|
80
|
-
|
81
|
-
xml = Builder::XmlMarkup.new
|
82
|
-
xml.instruct!
|
83
|
-
xml.Response {
|
84
|
-
if options[:pause]
|
85
|
-
loop_with_pause(options[:loop], xml) do
|
86
|
-
xml.Play(options[:audio_url])
|
87
|
-
end
|
88
|
-
else
|
89
|
-
xml.Play(options[:audio_url], :loop => options[:loop])
|
90
|
-
end
|
91
|
-
}
|
92
71
|
end
|
93
72
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
73
|
+
output {
|
74
|
+
if options[:pause]
|
75
|
+
loop_with_pause(options[:loop], @xml) do
|
76
|
+
@xml.Say(options[:text_to_speak], :voice => options[:voice], :language => options[:language])
|
77
|
+
end
|
78
|
+
else
|
79
|
+
@xml.Say(options[:text_to_speak], :voice => options[:voice], :language => options[:language], :loop => options[:loop])
|
80
|
+
end
|
81
|
+
}
|
82
|
+
end
|
83
|
+
|
84
|
+
# The Play verb plays an audio URL back to the caller.
|
85
|
+
# Examples:
|
86
|
+
# Twilio::Verb.play('http://foo.com/cowbell.mp3')
|
87
|
+
# Twilio::Verb.play('http://foo.com/cowbell.mp3', :loop => 3)
|
88
|
+
#
|
89
|
+
# If you need a longer pause between each loop, instead of explicitly calling the Pause
|
90
|
+
# verb within a block, you can set the convenient pause option:
|
91
|
+
#
|
92
|
+
# Twilio::Verb.play('http://foo.com/cowbell.mp3', :loop => 3, :pause => true)
|
93
|
+
#
|
94
|
+
# Options (see http://www.twilio.com/docs/api_reference/TwiML/play) are passed in as a hash,
|
95
|
+
# but only 'loop' is currently supported.
|
96
|
+
def play(*args)
|
97
|
+
options = {:loop => 1}
|
98
|
+
args.each do |arg|
|
99
|
+
case arg
|
100
|
+
when String
|
101
|
+
options[:audio_url] = arg
|
102
|
+
when Hash
|
103
|
+
options.merge!(arg)
|
104
|
+
else
|
105
|
+
raise ArgumentError, 'play expects String or Hash argument'
|
106
|
+
end
|
110
107
|
end
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
108
|
+
|
109
|
+
output {
|
110
|
+
if options[:pause]
|
111
|
+
loop_with_pause(options[:loop], @xml) do
|
112
|
+
@xml.Play(options[:audio_url])
|
113
|
+
end
|
114
|
+
else
|
115
|
+
@xml.Play(options[:audio_url], :loop => options[:loop])
|
116
|
+
end
|
117
|
+
}
|
118
|
+
end
|
119
|
+
|
120
|
+
# The Gather verb collects digits entered by a caller into their telephone keypad.
|
121
|
+
# When the caller is done entering data, Twilio submits that data to a provided URL,
|
122
|
+
# as either a HTTP GET or POST request, just like a web browser submits data from an HTML form.
|
123
|
+
#
|
124
|
+
# Options (see http://www.twilio.com/docs/api_reference/TwiML/gather) are passed in as a hash
|
125
|
+
#
|
126
|
+
# Examples:
|
127
|
+
# Twilio::Verb.gather
|
128
|
+
# Twilio::Verb.gather(:action => 'http://foobar.com')
|
129
|
+
# Twilio::Verb.gather(:finishOnKey => '*')
|
130
|
+
# Twilio::Verb.gather(:action => 'http://foobar.com', :finishOnKey => '*')
|
131
|
+
#
|
132
|
+
# Gather also lets you nest the Play, Say, and Pause verbs:
|
133
|
+
#
|
134
|
+
# verb = Twilio::Verb.new { |v|
|
135
|
+
# v.gather(:action => '/process_gather', :method => 'GET) {
|
136
|
+
# v.say('Please enter your account number followed by the pound sign')
|
137
|
+
# }
|
138
|
+
# v.say("We didn't receive any input. Goodbye!")
|
139
|
+
# }
|
140
|
+
# verb.response # represents the final xml output
|
141
|
+
def gather(*args, &block)
|
142
|
+
options = args.shift || {}
|
143
|
+
output {
|
144
|
+
if block_given?
|
145
|
+
@xml.Gather(options) { block.call }
|
146
|
+
else
|
147
|
+
@xml.Gather(options)
|
148
|
+
end
|
149
|
+
}
|
150
|
+
end
|
151
|
+
|
152
|
+
#play, say, pause
|
153
|
+
|
154
|
+
# The Record verb records the caller's voice and returns a URL that links to a file
|
155
|
+
# containing the audio recording.
|
156
|
+
#
|
157
|
+
# Options (see http://www.twilio.com/docs/api_reference/TwiML/record) are passed in as a hash
|
158
|
+
#
|
159
|
+
# Examples:
|
160
|
+
# Twilio::Verb.record
|
161
|
+
# Twilio::Verb.record(:action => 'http://foobar.com')
|
162
|
+
# Twilio::Verb.record(:finishOnKey => '*')
|
163
|
+
# Twilio::Verb.record(:transcribe => true, :transcribeCallback => '/handle_transcribe')
|
164
|
+
def record(*args)
|
165
|
+
options = args.shift
|
166
|
+
output { @xml.Record(options) }
|
167
|
+
end
|
168
|
+
|
169
|
+
# The Dial verb connects the current caller to an another phone. If the called party picks up,
|
170
|
+
# the two parties are connected and can communicate until one hangs up. If the called party does
|
171
|
+
# not pick up, if a busy signal is received, or the number doesn't exist, the dial verb will finish.
|
172
|
+
#
|
173
|
+
# If an action verb is provided, Twilio will submit the outcome of the call attempt to the action URL.
|
174
|
+
# If no action is provided, Dial will fall through to the next verb in the document.
|
175
|
+
#
|
176
|
+
# Note: this is different than the behavior of Record and Gather. Dial does not submit back to the
|
177
|
+
# current document URL if no action is provided.
|
178
|
+
#
|
179
|
+
# Options (see http://www.twilio.com/docs/api_reference/TwiML/dial) are passed in as a hash
|
180
|
+
#
|
181
|
+
# Examples:
|
182
|
+
# Twilio::Verb.dial('415-123-4567')
|
183
|
+
# Twilio::Verb.dial('415-123-4567', :action => 'http://foobar.com')
|
184
|
+
# Twilio::Verb.dial('415-123-4567', {:timeout => 10, :callerId => '858-987-6543'})
|
185
|
+
#
|
186
|
+
# Twilio also supports an alternate form in which a Number object is nested inside Dial:
|
187
|
+
#
|
188
|
+
# verb = Twilio::Verb.new { |v|
|
189
|
+
# v.dial {
|
190
|
+
# v.number('415-123-4567')
|
191
|
+
# v.number('415-123-4568')
|
192
|
+
# v.number('415-123-4569')
|
193
|
+
# }
|
194
|
+
# }
|
195
|
+
# verb.response # represents the final xml output
|
196
|
+
def dial(*args, &block)
|
197
|
+
number_to_dial = ''
|
198
|
+
options = {}
|
199
|
+
args.each do |arg|
|
200
|
+
case arg
|
201
|
+
when String
|
202
|
+
number_to_dial = arg
|
203
|
+
when Hash
|
204
|
+
options.merge!(arg)
|
205
|
+
else
|
206
|
+
raise ArgumentError, 'dial expects String or Hash argument'
|
207
|
+
end
|
127
208
|
end
|
128
209
|
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
# If no action is provided, Dial will fall through to the next verb in the document.
|
135
|
-
#
|
136
|
-
# Note: this is different than the behavior of Record and Gather. Dial does not submit back to the
|
137
|
-
# current document URL if no action is provided.
|
138
|
-
#
|
139
|
-
# Options (see http://www.twilio.com/docs/api_reference/TwiML/dial) are passed in as a hash
|
140
|
-
#
|
141
|
-
# Examples:
|
142
|
-
# Twilio::Verb.dial('415-123-4567')
|
143
|
-
# Twilio::Verb.dial('415-123-4567', :action => 'http://foobar.com')
|
144
|
-
# Twilio::Verb.dial('415-123-4567', {:timeout => 10, :callerId => '858-987-6543'})
|
145
|
-
def dial(*args, &block)
|
146
|
-
number_to_dial = ''
|
147
|
-
options = {}
|
148
|
-
args.each do |arg|
|
149
|
-
case arg
|
150
|
-
when String
|
151
|
-
number_to_dial = arg
|
152
|
-
when Hash
|
153
|
-
options.merge!(arg)
|
154
|
-
else
|
155
|
-
raise ArgumentError, 'dial expects String or Hash argument'
|
156
|
-
end
|
210
|
+
output {
|
211
|
+
if block_given?
|
212
|
+
@xml.Dial(options) { block.call }
|
213
|
+
else
|
214
|
+
@xml.Dial(number_to_dial, options)
|
157
215
|
end
|
216
|
+
}
|
217
|
+
end
|
158
218
|
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
219
|
+
# The Pause (secondary) verb waits silently for a number of seconds.
|
220
|
+
# It is normally chained with other verbs.
|
221
|
+
#
|
222
|
+
# Options (see http://www.twilio.com/docs/api_reference/TwiML/pause) are passed in as a hash
|
223
|
+
#
|
224
|
+
# Examples:
|
225
|
+
# verb = Twilio::Verb.new { |v|
|
226
|
+
# v.say('greetings')
|
227
|
+
# v.pause(:length => 2)
|
228
|
+
# v.say('have a nice day')
|
229
|
+
# }
|
230
|
+
# verb.response
|
231
|
+
def pause(*args)
|
232
|
+
options = args.shift
|
233
|
+
output { @xml.Pause(options) }
|
234
|
+
end
|
235
|
+
|
236
|
+
# The Redirect (secondary) verb transfers control to a different URL.
|
237
|
+
# It is normally chained with other verbs.
|
238
|
+
#
|
239
|
+
# Options (see http://www.twilio.com/docs/api_reference/TwiML/redirect) are passed in as a hash
|
240
|
+
#
|
241
|
+
# Examples:
|
242
|
+
# verb = Twilio::Verb.new { |v|
|
243
|
+
# v.dial('415-123-4567')
|
244
|
+
# v.redirect('http://www.foo.com/nextInstructions')
|
245
|
+
# }
|
246
|
+
# verb.response
|
247
|
+
def redirect(*args)
|
248
|
+
redirect_to_url = ''
|
249
|
+
options = {}
|
250
|
+
args.each do |arg|
|
251
|
+
case arg
|
252
|
+
when String
|
253
|
+
redirect_to_url = arg
|
254
|
+
when Hash
|
255
|
+
options.merge!(arg)
|
170
256
|
else
|
171
|
-
raise
|
257
|
+
raise ArgumentError, 'dial expects String or Hash argument'
|
172
258
|
end
|
173
259
|
end
|
174
|
-
|
175
|
-
private
|
176
260
|
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
261
|
+
output { @xml.Redirect(redirect_to_url, options) }
|
262
|
+
end
|
263
|
+
|
264
|
+
# The Hangup (secondary) verb ends the call.
|
265
|
+
#
|
266
|
+
# Examples:
|
267
|
+
# If your response is only a hangup:
|
268
|
+
#
|
269
|
+
# Twilio::Verb.hangup
|
270
|
+
#
|
271
|
+
# If your response is chained:
|
272
|
+
#
|
273
|
+
# verb = Twilio::Verb.new { |v|
|
274
|
+
# v.say("The time is #{Time.now}")
|
275
|
+
# v.hangup
|
276
|
+
# }
|
277
|
+
# verb.response
|
278
|
+
def hangup
|
279
|
+
output { @xml.Hangup }
|
280
|
+
end
|
281
|
+
|
282
|
+
# The Number element specifies a phone number. The number element has two optional attributes: sendDigits and url.
|
283
|
+
# Number elements can only be nested in Dial verbs
|
284
|
+
def number(*args)
|
285
|
+
number_to_dial = ''
|
286
|
+
options = {}
|
287
|
+
args.each do |arg|
|
288
|
+
case arg
|
289
|
+
when String
|
290
|
+
number_to_dial = arg
|
291
|
+
when Hash
|
292
|
+
options.merge!(arg)
|
293
|
+
else
|
294
|
+
raise ArgumentError, 'dial expects String or Hash argument'
|
183
295
|
end
|
296
|
+
end
|
297
|
+
|
298
|
+
output { @xml.Number(number_to_dial, options) }
|
184
299
|
end
|
300
|
+
|
301
|
+
private
|
302
|
+
|
303
|
+
def output
|
304
|
+
@chain ? yield : @xml.Response { yield }
|
305
|
+
end
|
306
|
+
|
307
|
+
def loop_with_pause(loop_count, xml, &verb_action)
|
308
|
+
last_iteration = loop_count-1
|
309
|
+
loop_count.times do |i|
|
310
|
+
yield verb_action
|
311
|
+
xml.Pause unless i == last_iteration
|
312
|
+
end
|
313
|
+
end
|
185
314
|
end
|
186
315
|
end
|
@@ -13,6 +13,18 @@ say_hi_three_times:
|
|
13
13
|
say_hi_three_times_with_pause:
|
14
14
|
response: <?xml version="1.0" encoding="UTF-8"?><Response><Say language="en" voice="man">hi</Say><Pause/><Say language="en" voice="man">hi</Say><Pause/><Say language="en" voice="man">hi</Say></Response>
|
15
15
|
|
16
|
+
say_hi_with_pause:
|
17
|
+
response: <?xml version="1.0" encoding="UTF-8"?><Response><Say loop="1" language="en" voice="man">hi</Say><Pause/></Response>
|
18
|
+
|
19
|
+
say_hi_with_pause_and_say_bye:
|
20
|
+
response: <?xml version="1.0" encoding="UTF-8"?><Response><Say loop="1" language="en" voice="man">hi</Say><Pause></Pause><Say loop="1" language="en" voice="man">bye</Say></Response>
|
21
|
+
|
22
|
+
say_hi_with_2_second_pause_and_say_bye:
|
23
|
+
response: <?xml version="1.0" encoding="UTF-8"?><Response><Say loop="1" language="en" voice="man">hi</Say><Pause length="2"/><Say loop="1" language="en" voice="man">bye</Say></Response>
|
24
|
+
|
25
|
+
say_hi_and_hangup:
|
26
|
+
response: <?xml version="1.0" encoding="UTF-8"?><Response><Say loop="1" language="en" voice="man">hi</Say><Hangup/></Response>
|
27
|
+
|
16
28
|
play_mp3:
|
17
29
|
response: <?xml version="1.0" encoding="UTF-8"?><Response><Play loop="1">http://foo.com/cowbell.mp3</Play></Response>
|
18
30
|
|
@@ -23,7 +35,7 @@ play_mp3_two_times_with_pause:
|
|
23
35
|
response: <?xml version="1.0" encoding="UTF-8"?><Response><Play>http://foo.com/cowbell.mp3</Play><Pause/><Play>http://foo.com/cowbell.mp3</Play></Response>
|
24
36
|
|
25
37
|
gather:
|
26
|
-
response: <?xml version="1.0" encoding="UTF-8"?><Response><Gather
|
38
|
+
response: <?xml version="1.0" encoding="UTF-8"?><Response><Gather/></Response>
|
27
39
|
|
28
40
|
gather_with_action:
|
29
41
|
response: <?xml version="1.0" encoding="UTF-8"?><Response><Gather action="http://foobar.com"/></Response>
|
@@ -41,8 +53,14 @@ gather_with_num_digits:
|
|
41
53
|
response: <?xml version="1.0" encoding="UTF-8"?><Response><Gather numDigits="5"/></Response>
|
42
54
|
|
43
55
|
gather_with_all_options_set:
|
44
|
-
response: <?xml version="1.0" encoding="UTF-8"?><Response><Gather finishOnKey="*"
|
56
|
+
response: <?xml version="1.0" encoding="UTF-8"?><Response><Gather finishOnKey="*" action="http://foobar.com" method="GET" numDigits="5" timeout="10"/></Response>
|
57
|
+
|
58
|
+
gather_and_say_instructions:
|
59
|
+
response: <?xml version="1.0" encoding="UTF-8"?><Response><Gather><Say loop="1" language="en" voice="man">Please enter your account number followed by the pound sign</Say></Gather><Say loop="1" language="en" voice="man">We didn't receive any input. Goodbye!</Say></Response>
|
45
60
|
|
61
|
+
gather_with_timeout_and_say_instructions:
|
62
|
+
response: <?xml version="1.0" encoding="UTF-8"?><Response><Gather timeout="10"><Say loop="1" language="en" voice="man">Please enter your account number followed by the pound sign</Say></Gather><Say loop="1" language="en" voice="man">We didn't receive any input. Goodbye!</Say></Response>
|
63
|
+
|
46
64
|
record:
|
47
65
|
response: <?xml version="1.0" encoding="UTF-8"?><Response><Record></Record></Response>
|
48
66
|
|
@@ -86,4 +104,16 @@ dial_with_caller_id:
|
|
86
104
|
response: <?xml version="1.0" encoding="UTF-8"?><Response><Dial callerId="858-987-6543">415-123-4567</Dial></Response>
|
87
105
|
|
88
106
|
dial_with_timeout_and_caller_id:
|
89
|
-
response: <?xml version="1.0" encoding="UTF-8"?><Response><Dial callerId="858-987-6543" timeout="10">415-123-4567</Dial></Response>
|
107
|
+
response: <?xml version="1.0" encoding="UTF-8"?><Response><Dial callerId="858-987-6543" timeout="10">415-123-4567</Dial></Response>
|
108
|
+
|
109
|
+
dial_with_redirect:
|
110
|
+
response: <?xml version="1.0" encoding="UTF-8"?><Response><Dial>415-123-4567</Dial><Redirect>http://www.foo.com/nextInstructions</Redirect></Response>
|
111
|
+
|
112
|
+
dial_with_number_and_send_digits:
|
113
|
+
response: <?xml version="1.0" encoding="UTF-8"?><Response><Dial><Number sendDigits="wwww1928">415-123-4567</Number></Dial></Response>
|
114
|
+
|
115
|
+
dial_multiple_numbers:
|
116
|
+
response: <?xml version="1.0" encoding="UTF-8"?><Response><Dial><Number>415-123-4567</Number><Number>415-123-4568</Number><Number>415-123-4569</Number></Dial></Response>
|
117
|
+
|
118
|
+
hangup:
|
119
|
+
response: <?xml version="1.0" encoding="UTF-8"?><Response><Hangup/></Response>
|
data/test/twilio/account_test.rb
CHANGED
@@ -3,21 +3,33 @@ require File.dirname(__FILE__) + '/../test_helper'
|
|
3
3
|
class AccountTest < Test::Unit::TestCase #:nodoc: all
|
4
4
|
context "An account" do
|
5
5
|
setup do
|
6
|
-
|
7
|
-
@account = Twilio::Account.new(@connection)
|
6
|
+
Twilio.connect('mysid', 'mytoken')
|
8
7
|
end
|
9
8
|
|
10
9
|
should "be retrievable" do
|
11
10
|
fake_response = fixture(:account)
|
12
11
|
FakeWeb.register_uri(:get, twilio_url, :string => fake_response)
|
13
|
-
assert_equal
|
12
|
+
assert_equal Twilio::Account.get, fake_response
|
14
13
|
end
|
15
14
|
|
16
15
|
should "be able to update name" do
|
17
16
|
fake_response = fixture(:account_renamed)
|
18
17
|
FakeWeb.register_uri(:put, twilio_url, :string => fake_response)
|
19
|
-
|
20
|
-
assert_equal response, fake_response
|
18
|
+
assert_equal Twilio::Account.update_name('Bubba'), fake_response
|
21
19
|
end
|
20
|
+
|
21
|
+
context "using deprecated API" do
|
22
|
+
setup do
|
23
|
+
@connection = Twilio::Connection.new('mysid', 'mytoken')
|
24
|
+
@account = Twilio::Account.new(@connection)
|
25
|
+
end
|
26
|
+
|
27
|
+
should "be retrievable" do
|
28
|
+
fake_response = fixture(:account)
|
29
|
+
FakeWeb.register_uri(:get, twilio_url, :string => fake_response)
|
30
|
+
assert_equal @account.get, fake_response
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
22
34
|
end
|
23
35
|
end
|
data/test/twilio/call_test.rb
CHANGED
@@ -3,26 +3,25 @@ require File.dirname(__FILE__) + '/../test_helper'
|
|
3
3
|
class CallTest < Test::Unit::TestCase #:nodoc: all
|
4
4
|
context "A call" do
|
5
5
|
setup do
|
6
|
-
|
7
|
-
@call = Twilio::Call.new(@connection)
|
6
|
+
Twilio.connect('mysid', 'mytoken')
|
8
7
|
end
|
9
8
|
|
10
9
|
should "be retrievable as a list" do
|
11
10
|
fake_response = fixture(:calls)
|
12
11
|
FakeWeb.register_uri(:get, twilio_url('Calls'), :string => fake_response)
|
13
|
-
assert_equal
|
12
|
+
assert_equal Twilio::Call.list, fake_response
|
14
13
|
end
|
15
14
|
|
16
15
|
should "be retrievable individually" do
|
17
16
|
fake_response = fixture(:call)
|
18
17
|
FakeWeb.register_uri(:get, twilio_url('Calls/CA42ed11f93dc08b952027ffbc406d0868'), :string => fake_response)
|
19
|
-
assert_equal
|
18
|
+
assert_equal Twilio::Call.get('CA42ed11f93dc08b952027ffbc406d0868'), fake_response
|
20
19
|
end
|
21
20
|
|
22
21
|
should "be made" do
|
23
22
|
fake_response = fixture(:call_new)
|
24
23
|
FakeWeb.register_uri(:post, twilio_url('Calls'), :string => fake_response)
|
25
|
-
response =
|
24
|
+
response = Twilio::Call.make('4158675309', '4155551212', 'http://test.local/call_handler')
|
26
25
|
assert_equal response, fake_response
|
27
26
|
end
|
28
27
|
|
@@ -30,13 +29,13 @@ class CallTest < Test::Unit::TestCase #:nodoc: all
|
|
30
29
|
should "returns a list of Call resources that were segments created in the same call" do
|
31
30
|
fake_response = fixture(:calls)
|
32
31
|
FakeWeb.register_uri(:get, twilio_url('Calls/CA42ed11f93dc08b952027ffbc406d0868/Segments'), :string => fake_response)
|
33
|
-
assert_equal
|
32
|
+
assert_equal Twilio::Call.segments('CA42ed11f93dc08b952027ffbc406d0868'), fake_response
|
34
33
|
end
|
35
34
|
|
36
35
|
should "returns a single Call resource for the CallSid and CallSegmentSid provided" do
|
37
36
|
fake_response = fixture(:calls)
|
38
37
|
FakeWeb.register_uri(:get, twilio_url('Calls/CA42ed11f93dc08b952027ffbc406d0868/Segments/abc123'), :string => fake_response)
|
39
|
-
assert_equal
|
38
|
+
assert_equal Twilio::Call.segments('CA42ed11f93dc08b952027ffbc406d0868', 'abc123'), fake_response
|
40
39
|
end
|
41
40
|
end
|
42
41
|
|
@@ -44,7 +43,7 @@ class CallTest < Test::Unit::TestCase #:nodoc: all
|
|
44
43
|
should "returns a list of recordings that were generated during the call" do
|
45
44
|
fake_response = fixture(:recordings)
|
46
45
|
FakeWeb.register_uri(:get, twilio_url('Calls/CA42ed11f93dc08b952027ffbc406d0868/Recordings'), :string => fake_response)
|
47
|
-
assert_equal
|
46
|
+
assert_equal Twilio::Call.recordings('CA42ed11f93dc08b952027ffbc406d0868'), fake_response
|
48
47
|
end
|
49
48
|
end
|
50
49
|
|
@@ -52,8 +51,22 @@ class CallTest < Test::Unit::TestCase #:nodoc: all
|
|
52
51
|
should "description" do
|
53
52
|
fake_response = fixture(:notifications)
|
54
53
|
FakeWeb.register_uri(:get, twilio_url('Calls/CA42ed11f93dc08b952027ffbc406d0868/Notifications'), :string => fake_response)
|
55
|
-
assert_equal
|
54
|
+
assert_equal Twilio::Call.notifications('CA42ed11f93dc08b952027ffbc406d0868'), fake_response
|
56
55
|
end
|
57
56
|
end
|
57
|
+
|
58
|
+
context "using deprecated API" do
|
59
|
+
setup do
|
60
|
+
@connection = Twilio::Connection.new('mysid', 'mytoken')
|
61
|
+
@call = Twilio::Call.new(@connection)
|
62
|
+
end
|
63
|
+
|
64
|
+
should "be made" do
|
65
|
+
fake_response = fixture(:call_new)
|
66
|
+
FakeWeb.register_uri(:post, twilio_url('Calls'), :string => fake_response)
|
67
|
+
assert_equal @call.make('4158675309', '4155551212', 'http://test.local/call_handler'), fake_response
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
58
71
|
end
|
59
72
|
end
|