twilio-test-toolkit2 3.4.0
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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +260 -0
- data/Rakefile +38 -0
- data/lib/twilio-test-toolkit/call_in_progress.rb +56 -0
- data/lib/twilio-test-toolkit/call_scope.rb +243 -0
- data/lib/twilio-test-toolkit/dsl.rb +15 -0
- data/lib/twilio-test-toolkit/version.rb +3 -0
- data/lib/twilio-test-toolkit.rb +4 -0
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/controllers/twilio_controller.rb +8 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/app/views/layouts/twilio.layout.xml.erb +4 -0
- data/spec/dummy/app/views/twilio/test_action.xml.erb +2 -0
- data/spec/dummy/app/views/twilio/test_dial_with_action.xml.erb +3 -0
- data/spec/dummy/app/views/twilio/test_dial_with_no_action.xml.erb +3 -0
- data/spec/dummy/app/views/twilio/test_dial_with_sip.xml +6 -0
- data/spec/dummy/app/views/twilio/test_gather_finish_on_asterisk.xml.erb +3 -0
- data/spec/dummy/app/views/twilio/test_hangup.xml.erb +1 -0
- data/spec/dummy/app/views/twilio/test_play.xml.erb +1 -0
- data/spec/dummy/app/views/twilio/test_record.xml +2 -0
- data/spec/dummy/app/views/twilio/test_redirect.xml.erb +1 -0
- data/spec/dummy/app/views/twilio/test_say.xml.erb +1 -0
- data/spec/dummy/app/views/twilio/test_start.xml.erb +5 -0
- data/spec/dummy/config/application.rb +59 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +37 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +16 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/db/schema.rb +16 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/requests/call_scope_spec.rb +388 -0
- data/spec/requests/dsl_spec.rb +54 -0
- data/spec/spec_helper.rb +20 -0
- metadata +226 -0
@@ -0,0 +1,7 @@
|
|
1
|
+
# Be sure to restart your server when you modify this file.
|
2
|
+
|
3
|
+
# Your secret key for verifying the integrity of signed cookies.
|
4
|
+
# If you change this key, all old signed cookies will become invalid!
|
5
|
+
# Make sure the secret is at least 30 characters and all random,
|
6
|
+
# no regular words or you'll be exposed to dictionary attacks.
|
7
|
+
Dummy::Application.config.secret_token = 'a97e0b618b2e11a39b0c155d46c6f8e0f15a17edcd595e3baca48956a204ef15d988fd26274e0180192058ad8cbb9df002f6341acb8e92075798ea4e278d6561'
|
@@ -0,0 +1,8 @@
|
|
1
|
+
# Be sure to restart your server when you modify this file.
|
2
|
+
|
3
|
+
Dummy::Application.config.session_store :cookie_store, key: '_dummy_session'
|
4
|
+
|
5
|
+
# Use the database for sessions instead of the cookie-based default,
|
6
|
+
# which shouldn't be used to store highly confidential information
|
7
|
+
# (create the session table with "rails generate session_migration")
|
8
|
+
# Dummy::Application.config.session_store :active_record_store
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Be sure to restart your server when you modify this file.
|
2
|
+
#
|
3
|
+
# This file contains settings for ActionController::ParamsWrapper which
|
4
|
+
# is enabled by default.
|
5
|
+
|
6
|
+
# Enable parameter wrapping for JSON. You can disable this by setting :format to an empty array.
|
7
|
+
ActiveSupport.on_load(:action_controller) do
|
8
|
+
wrap_parameters format: [:json]
|
9
|
+
end
|
10
|
+
|
11
|
+
# Disable root element in JSON by default.
|
12
|
+
ActiveSupport.on_load(:active_record) do
|
13
|
+
self.include_root_in_json = false
|
14
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
Dummy::Application.routes.draw do
|
2
|
+
resources :twilio do
|
3
|
+
get "test_start", :on => :collection
|
4
|
+
post "test_start", :on => :collection
|
5
|
+
post "test_action", :on => :collection
|
6
|
+
post "test_gather_finish_on_asterisk", :on => :collection
|
7
|
+
post "test_hangup", :on => :collection
|
8
|
+
post "test_dial_with_no_action", :on => :collection
|
9
|
+
post "test_dial_with_action", :on => :collection
|
10
|
+
post "test_dial_with_sip", :on => :collection
|
11
|
+
post "test_redirect", :on => :collection
|
12
|
+
post "test_say", :on => :collection
|
13
|
+
post "test_play", :on => :collection
|
14
|
+
post "test_record", :on => :collection
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
# This file is auto-generated from the current state of the database. Instead
|
3
|
+
# of editing this file, please use the migrations feature of Active Record to
|
4
|
+
# incrementally modify your database, and then regenerate this schema definition.
|
5
|
+
#
|
6
|
+
# Note that this schema.rb definition is the authoritative source for your
|
7
|
+
# database schema. If you need to create the application database on another
|
8
|
+
# system, you should be using db:schema:load, not running all the migrations
|
9
|
+
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
|
10
|
+
# you'll amass, the slower it'll run and the greater likelihood for issues).
|
11
|
+
#
|
12
|
+
# It's strongly recommended to check this file into your version control system.
|
13
|
+
|
14
|
+
ActiveRecord::Schema.define(:version => 0) do
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>The page you were looking for doesn't exist (404)</title>
|
5
|
+
<style type="text/css">
|
6
|
+
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
+
div.dialog {
|
8
|
+
width: 25em;
|
9
|
+
padding: 0 4em;
|
10
|
+
margin: 4em auto 0 auto;
|
11
|
+
border: 1px solid #ccc;
|
12
|
+
border-right-color: #999;
|
13
|
+
border-bottom-color: #999;
|
14
|
+
}
|
15
|
+
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
+
</style>
|
17
|
+
</head>
|
18
|
+
|
19
|
+
<body>
|
20
|
+
<!-- This file lives in public/404.html -->
|
21
|
+
<div class="dialog">
|
22
|
+
<h1>The page you were looking for doesn't exist.</h1>
|
23
|
+
<p>You may have mistyped the address or the page may have moved.</p>
|
24
|
+
</div>
|
25
|
+
</body>
|
26
|
+
</html>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>The change you wanted was rejected (422)</title>
|
5
|
+
<style type="text/css">
|
6
|
+
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
+
div.dialog {
|
8
|
+
width: 25em;
|
9
|
+
padding: 0 4em;
|
10
|
+
margin: 4em auto 0 auto;
|
11
|
+
border: 1px solid #ccc;
|
12
|
+
border-right-color: #999;
|
13
|
+
border-bottom-color: #999;
|
14
|
+
}
|
15
|
+
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
+
</style>
|
17
|
+
</head>
|
18
|
+
|
19
|
+
<body>
|
20
|
+
<!-- This file lives in public/422.html -->
|
21
|
+
<div class="dialog">
|
22
|
+
<h1>The change you wanted was rejected.</h1>
|
23
|
+
<p>Maybe you tried to change something you didn't have access to.</p>
|
24
|
+
</div>
|
25
|
+
</body>
|
26
|
+
</html>
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>We're sorry, but something went wrong (500)</title>
|
5
|
+
<style type="text/css">
|
6
|
+
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
+
div.dialog {
|
8
|
+
width: 25em;
|
9
|
+
padding: 0 4em;
|
10
|
+
margin: 4em auto 0 auto;
|
11
|
+
border: 1px solid #ccc;
|
12
|
+
border-right-color: #999;
|
13
|
+
border-bottom-color: #999;
|
14
|
+
}
|
15
|
+
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
+
</style>
|
17
|
+
</head>
|
18
|
+
|
19
|
+
<body>
|
20
|
+
<!-- This file lives in public/500.html -->
|
21
|
+
<div class="dialog">
|
22
|
+
<h1>We're sorry, but something went wrong.</h1>
|
23
|
+
</div>
|
24
|
+
</body>
|
25
|
+
</html>
|
File without changes
|
@@ -0,0 +1,6 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application.
|
3
|
+
|
4
|
+
APP_PATH = File.expand_path('../../config/application', __FILE__)
|
5
|
+
require File.expand_path('../../config/boot', __FILE__)
|
6
|
+
require 'rails/commands'
|
@@ -0,0 +1,388 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe TwilioTestToolkit::CallScope do
|
4
|
+
before(:each) do
|
5
|
+
@our_number = "2065551212"
|
6
|
+
@their_number = "2065553434"
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "basics" do
|
10
|
+
before(:each) do
|
11
|
+
@call = ttt_call(test_start_twilio_index_path, @our_number, @their_number)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should be a CallScope" do
|
15
|
+
@call.should be_a(TwilioTestToolkit::CallScope)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should have the informational methods" do
|
19
|
+
@call.should respond_to(:current_path)
|
20
|
+
@call.should respond_to(:response_xml)
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should have the right path" do
|
24
|
+
@call.current_path.should == test_start_twilio_index_path
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should have a response xml value" do
|
28
|
+
@call.response_xml.should_not be_blank
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should have the right root call" do
|
32
|
+
@call.should respond_to(:root_call)
|
33
|
+
@call.root_call.should == @call
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe "redirect" do
|
38
|
+
describe "success" do
|
39
|
+
before(:each) do
|
40
|
+
@call = ttt_call(test_redirect_twilio_index_path, @our_number, @their_number)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should have the redirect methods" do
|
44
|
+
@call.should respond_to(:has_redirect?)
|
45
|
+
@call.should respond_to(:has_redirect_to?)
|
46
|
+
@call.should respond_to(:follow_redirect)
|
47
|
+
@call.should respond_to(:follow_redirect!)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should have the right value for has_redirect?" do
|
51
|
+
@call.should have_redirect
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should have the right values for has_redirect_to?" do
|
55
|
+
@call.has_redirect_to?("http://foo").should be_false
|
56
|
+
@call.has_redirect_to?(test_start_twilio_index_path).should be_true
|
57
|
+
@call.has_redirect_to?(test_start_twilio_index_path + ".xml").should be_true # Should force normalization
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should follow the redirect (immutable version)" do
|
61
|
+
# follow_redirect returns a new CallScope
|
62
|
+
newcall = @call.follow_redirect
|
63
|
+
|
64
|
+
# Make sure it followed
|
65
|
+
newcall.current_path.should == test_start_twilio_index_path
|
66
|
+
|
67
|
+
# And is not the same call
|
68
|
+
newcall.response_xml.should_not == @call.response_xml
|
69
|
+
# But it's linked
|
70
|
+
newcall.root_call.should == @call
|
71
|
+
|
72
|
+
# And we did not modify the original call
|
73
|
+
@call.current_path.should == test_redirect_twilio_index_path
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should follow the redirect (mutable version)" do
|
77
|
+
# follow_redirect! modifies the CallScope
|
78
|
+
@call.follow_redirect!
|
79
|
+
|
80
|
+
# Make sure it followed
|
81
|
+
@call.current_path.should == test_start_twilio_index_path
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should submit default params on follow_redirect" do
|
85
|
+
default_request_params = {
|
86
|
+
:format => :xml,
|
87
|
+
:From => "2065551212",
|
88
|
+
:Digits => "",
|
89
|
+
:To => "2065553434",
|
90
|
+
:AnsweredBy => "human",
|
91
|
+
:CallStatus => "in-progress"
|
92
|
+
}
|
93
|
+
Capybara.current_session.driver
|
94
|
+
.should_receive(:post)
|
95
|
+
.with("/twilio/test_start", hash_including(default_request_params))
|
96
|
+
.and_call_original
|
97
|
+
|
98
|
+
@call.follow_redirect
|
99
|
+
end
|
100
|
+
|
101
|
+
it "should consider options for follow_redirect!" do
|
102
|
+
Capybara.current_session.driver
|
103
|
+
.should_receive(:post)
|
104
|
+
.with("/twilio/test_start", hash_including(:CallStatus => "completed"))
|
105
|
+
.and_call_original
|
106
|
+
|
107
|
+
@call.follow_redirect!(call_status: "completed")
|
108
|
+
end
|
109
|
+
|
110
|
+
it "should consider options for follow_redirect" do
|
111
|
+
Capybara.current_session.driver
|
112
|
+
.should_receive(:post)
|
113
|
+
.with("/twilio/test_start", hash_including(:CallStatus => "completed"))
|
114
|
+
.and_call_original
|
115
|
+
|
116
|
+
@call.follow_redirect(call_status: "completed")
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
describe "failure" do
|
121
|
+
before(:each) do
|
122
|
+
# Initiate a call that's not on a redirect - various calls will fail
|
123
|
+
@call = ttt_call(test_say_twilio_index_path, @our_number, @their_number)
|
124
|
+
end
|
125
|
+
|
126
|
+
it "should have the right value for has_redirect?" do
|
127
|
+
@call.should_not have_redirect
|
128
|
+
end
|
129
|
+
|
130
|
+
it "should have the right values for has_redirect_to?" do
|
131
|
+
@call.has_redirect_to?("http://foo").should be_false
|
132
|
+
@call.has_redirect_to?(test_start_twilio_index_path).should be_false
|
133
|
+
@call.has_redirect_to?(test_start_twilio_index_path + ".xml").should be_false
|
134
|
+
end
|
135
|
+
|
136
|
+
it "should raise an error on follow_redirect" do
|
137
|
+
lambda {@call.follow_redirect}.should raise_error
|
138
|
+
end
|
139
|
+
|
140
|
+
it "should raise an error on follow_redirect!" do
|
141
|
+
lambda {@call.follow_redirect!}.should raise_error
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
describe "say" do
|
147
|
+
before(:each) do
|
148
|
+
@call = ttt_call(test_say_twilio_index_path, @our_number, @their_number)
|
149
|
+
end
|
150
|
+
|
151
|
+
it "should have the expected say methods" do
|
152
|
+
@call.should respond_to(:has_say?)
|
153
|
+
end
|
154
|
+
|
155
|
+
it "should have the right values for has_say?" do
|
156
|
+
@call.has_say?("Blah blah").should be_false
|
157
|
+
@call.has_say?("This is a say page.").should be_true
|
158
|
+
@call.has_say?("This is").should be_true # Partial match
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
describe "play" do
|
163
|
+
before(:each) do
|
164
|
+
@call = ttt_call(test_play_twilio_index_path, @our_number, @their_number)
|
165
|
+
end
|
166
|
+
|
167
|
+
it "should have the expected say play methods" do
|
168
|
+
@call.should respond_to(:has_play?)
|
169
|
+
end
|
170
|
+
|
171
|
+
it "should have the right values for has_say?" do
|
172
|
+
@call.has_play?("/path/to/a/different/audio/clip.mp3").should be_false
|
173
|
+
@call.has_play?("/path/to/an/audio/clip.mp3").should be_true
|
174
|
+
@call.has_play?("clip.mp3").should be_false
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
describe "dial" do
|
179
|
+
before(:each) do
|
180
|
+
@call = ttt_call(test_dial_with_action_twilio_index_path, @our_number, @their_number)
|
181
|
+
end
|
182
|
+
|
183
|
+
it "should have the expected dial methods" do
|
184
|
+
@call.should respond_to(:has_dial?)
|
185
|
+
end
|
186
|
+
|
187
|
+
it "should have the right values for has_dial?" do
|
188
|
+
@call.has_dial?("911").should be_false
|
189
|
+
@call.has_dial?("18001234567").should be_true
|
190
|
+
@call.has_dial?("12345").should be_true # Partial match
|
191
|
+
end
|
192
|
+
|
193
|
+
it "should not match the dial action if there isn't one" do
|
194
|
+
@call = ttt_call(test_dial_with_no_action_twilio_index_path, @our_number, @their_number)
|
195
|
+
|
196
|
+
@call.has_action_on_dial?("http://example.org:3000/call_me_back").should eq false
|
197
|
+
end
|
198
|
+
|
199
|
+
it "should match the action on dial if there is one" do
|
200
|
+
@call.has_action_on_dial?("http://example.org:3000/call_me_back").should be_true
|
201
|
+
end
|
202
|
+
|
203
|
+
it "should not match the action on dial if it's different than the one specified" do
|
204
|
+
@call.has_action_on_dial?("http://example.org:3000/dont_call").should be_false
|
205
|
+
end
|
206
|
+
|
207
|
+
it "should dial a sip peer with the correct structure" do
|
208
|
+
@call = ttt_call(test_dial_with_sip_twilio_index_path, @our_number, @their_number)
|
209
|
+
@call.within_dial do |dial|
|
210
|
+
dial.has_sip?.should be_true
|
211
|
+
dial.within_sip do |sip|
|
212
|
+
sip.has_uri?("18885551234@sip.foo.bar").should be_true
|
213
|
+
sip.has_username_on_uri?("foo").should be_true
|
214
|
+
sip.has_password_on_uri?("bar").should be_true
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
describe "hangup" do
|
221
|
+
describe "success" do
|
222
|
+
before(:each) do
|
223
|
+
@call = ttt_call(test_hangup_twilio_index_path, @our_number, @their_number)
|
224
|
+
end
|
225
|
+
|
226
|
+
it "should have the expected hangup methods" do
|
227
|
+
@call.should respond_to(:has_hangup?)
|
228
|
+
end
|
229
|
+
|
230
|
+
it "should have the right value for has_hangup?" do
|
231
|
+
@call.should have_hangup
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
describe "failure" do
|
236
|
+
before(:each) do
|
237
|
+
@call = ttt_call(test_start_twilio_index_path, @our_number, @their_number)
|
238
|
+
end
|
239
|
+
|
240
|
+
it "should have the right value for has_hangup?" do
|
241
|
+
@call.should_not have_hangup
|
242
|
+
end
|
243
|
+
end
|
244
|
+
end
|
245
|
+
|
246
|
+
describe "gather" do
|
247
|
+
describe "success" do
|
248
|
+
before(:each) do
|
249
|
+
@call = ttt_call(test_start_twilio_index_path, @our_number, @their_number)
|
250
|
+
end
|
251
|
+
|
252
|
+
it "should have the expected gather methods" do
|
253
|
+
@call.should respond_to(:has_gather?)
|
254
|
+
@call.should respond_to(:within_gather)
|
255
|
+
@call.should respond_to(:gather?)
|
256
|
+
@call.should respond_to(:gather_action)
|
257
|
+
@call.should respond_to(:press)
|
258
|
+
end
|
259
|
+
|
260
|
+
it "should have the right value for has_gather?" do
|
261
|
+
@call.has_gather?.should be_true
|
262
|
+
end
|
263
|
+
|
264
|
+
it "should have the right value for gather?" do
|
265
|
+
# Although we have a gather, the current call scope is not itself a gather, so this returns false.
|
266
|
+
@call.gather?.should be_false
|
267
|
+
end
|
268
|
+
|
269
|
+
it "should fail on gather-scoped methods outside of a gather scope" do
|
270
|
+
lambda {@call.gather_action}.should raise_error
|
271
|
+
lambda {@call.press "1234"}.should raise_error
|
272
|
+
end
|
273
|
+
|
274
|
+
it "should gather" do
|
275
|
+
# We should not have a say that's contained within a gather.
|
276
|
+
@call.should_not have_say("Please enter some digits.")
|
277
|
+
|
278
|
+
# Now enter the gather block.
|
279
|
+
@call.within_gather do |gather|
|
280
|
+
# We should have a say here
|
281
|
+
gather.should have_say("Please enter some digits.")
|
282
|
+
|
283
|
+
# We should be in a gather
|
284
|
+
gather.gather?.should be_true
|
285
|
+
# And we should have an action
|
286
|
+
gather.gather_action.should == test_action_twilio_index_path
|
287
|
+
|
288
|
+
# And we should have the right root call
|
289
|
+
gather.root_call.should == @call
|
290
|
+
|
291
|
+
# Press some digits.
|
292
|
+
gather.press "98765"
|
293
|
+
end
|
294
|
+
|
295
|
+
# This should update the path
|
296
|
+
@call.current_path.should == test_action_twilio_index_path
|
297
|
+
|
298
|
+
# This view says the digits we pressed - make sure
|
299
|
+
@call.should have_say "You entered 98765."
|
300
|
+
end
|
301
|
+
|
302
|
+
it "should gather without a press" do
|
303
|
+
@call.within_gather do |gather|
|
304
|
+
# Do nothing
|
305
|
+
end
|
306
|
+
|
307
|
+
# We should still be on the same page
|
308
|
+
@call.current_path.should == test_start_twilio_index_path
|
309
|
+
end
|
310
|
+
|
311
|
+
it "should respond to the default finish key of hash" do
|
312
|
+
@call.within_gather do |gather|
|
313
|
+
gather.press "98765#"
|
314
|
+
end
|
315
|
+
@call.should have_say "You entered 98765."
|
316
|
+
end
|
317
|
+
end
|
318
|
+
|
319
|
+
describe "with finishOnKey specified" do
|
320
|
+
before(:each) do
|
321
|
+
@call = ttt_call(test_gather_finish_on_asterisk_twilio_index_path, @our_number, @their_number)
|
322
|
+
end
|
323
|
+
|
324
|
+
it "should strip the finish key from the digits" do
|
325
|
+
@call.within_gather do |gather|
|
326
|
+
gather.press "98765*"
|
327
|
+
end
|
328
|
+
|
329
|
+
@call.should have_say "You entered 98765."
|
330
|
+
end
|
331
|
+
|
332
|
+
it "should still accept the digits without a finish key (due to timeout)" do
|
333
|
+
@call.within_gather do |gather|
|
334
|
+
gather.press "98765"
|
335
|
+
end
|
336
|
+
|
337
|
+
@call.should have_say "You entered 98765."
|
338
|
+
end
|
339
|
+
|
340
|
+
end
|
341
|
+
|
342
|
+
describe "failure" do
|
343
|
+
before(:each) do
|
344
|
+
@call = ttt_call(test_say_twilio_index_path, @our_number, @their_number)
|
345
|
+
end
|
346
|
+
|
347
|
+
it "should have the right value for has_gather?" do
|
348
|
+
@call.has_gather?.should be_false
|
349
|
+
end
|
350
|
+
|
351
|
+
it "should have the right value for gather?" do
|
352
|
+
@call.gather?.should be_false
|
353
|
+
end
|
354
|
+
|
355
|
+
it "should fail on within_gather if there is no gather" do
|
356
|
+
lambda {@call.within_gather do |gather|; end}.should raise_error
|
357
|
+
end
|
358
|
+
|
359
|
+
it "should fail on gather-scoped methods outside of a gather scope" do
|
360
|
+
lambda {@call.gather_action}.should raise_error
|
361
|
+
lambda {@call.press "1234"}.should raise_error
|
362
|
+
end
|
363
|
+
end
|
364
|
+
end
|
365
|
+
|
366
|
+
describe "record" do
|
367
|
+
before(:each) do
|
368
|
+
@call = ttt_call(test_record_twilio_index_path, @our_number, @their_number)
|
369
|
+
end
|
370
|
+
|
371
|
+
it "should have the expected say record methods" do
|
372
|
+
@call.should respond_to(:has_record?)
|
373
|
+
end
|
374
|
+
|
375
|
+
it "should have the right action for record" do
|
376
|
+
@call.has_action_on_record?("http://example.org:3000/record_this_call").should be_true
|
377
|
+
end
|
378
|
+
|
379
|
+
it "should have the right maxLength for record" do
|
380
|
+
@call.has_max_length_on_record?("20").should be_true
|
381
|
+
end
|
382
|
+
|
383
|
+
it "should have the right finishOnKey for record" do
|
384
|
+
@call.has_finish_on_key_on_record?("*").should be_true
|
385
|
+
end
|
386
|
+
end
|
387
|
+
end
|
388
|
+
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe TwilioTestToolkit::DSL do
|
4
|
+
before(:each) do
|
5
|
+
@our_number = "2065551212"
|
6
|
+
@their_number = "2065553434"
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "ttt_call" do
|
10
|
+
describe "basics" do
|
11
|
+
before(:each) do
|
12
|
+
@call = ttt_call(test_start_twilio_index_path, @our_number, @their_number)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should assign the call" do
|
16
|
+
@call.should_not be_nil
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should have a sid" do
|
20
|
+
@call.sid.should_not be_blank
|
21
|
+
end
|
22
|
+
|
23
|
+
it "should default the method to post" do
|
24
|
+
@call.http_method.should == :post
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should have the right properties" do
|
28
|
+
@call.initial_path.should == test_start_twilio_index_path
|
29
|
+
@call.from_number.should == @our_number
|
30
|
+
@call.to_number.should == @their_number
|
31
|
+
@call.is_machine.should be_false
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "with a sid, method and machine override" do
|
36
|
+
before(:each) do
|
37
|
+
@mysid = "1234567"
|
38
|
+
@call = ttt_call(test_start_twilio_index_path, @our_number, @their_number, :call_sid => @mysid, :is_machine => true, :method => :get)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "should have the right sid" do
|
42
|
+
@call.sid.should == @mysid
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should be a machine call" do
|
46
|
+
@call.is_machine.should be_true
|
47
|
+
end
|
48
|
+
|
49
|
+
it "should be a get call" do
|
50
|
+
@call.http_method.should == :get
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# Configure Rails Environment
|
2
|
+
ENV["RAILS_ENV"] = "test"
|
3
|
+
|
4
|
+
require File.expand_path("../dummy/config/environment.rb", __FILE__)
|
5
|
+
require "rails/test_help"
|
6
|
+
|
7
|
+
Rails.backtrace_cleaner.remove_silencers!
|
8
|
+
|
9
|
+
require 'rspec/rails'
|
10
|
+
|
11
|
+
# Set up capybara integration
|
12
|
+
require 'capybara/rspec'
|
13
|
+
require 'capybara/rails'
|
14
|
+
|
15
|
+
# Our gem
|
16
|
+
require 'twilio-test-toolkit'
|
17
|
+
|
18
|
+
RSpec.configure do |config|
|
19
|
+
config.include TwilioTestToolkit::DSL, :type => :request
|
20
|
+
end
|