adhearsion 2.5.4 → 2.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/CHANGELOG.md +15 -0
  4. data/README.markdown +2 -1
  5. data/Rakefile +1 -6
  6. data/adhearsion.gemspec +4 -3
  7. data/features/cli_daemon.feature +2 -4
  8. data/features/cli_restart.feature +14 -5
  9. data/features/cli_start.feature +0 -2
  10. data/features/cli_stop.feature +15 -6
  11. data/lib/adhearsion.rb +21 -23
  12. data/lib/adhearsion/call.rb +49 -5
  13. data/lib/adhearsion/call_controller.rb +29 -11
  14. data/lib/adhearsion/call_controller/dial.rb +21 -9
  15. data/lib/adhearsion/call_controller/menu_dsl.rb +12 -12
  16. data/lib/adhearsion/call_controller/menu_dsl/array_match_calculator.rb +1 -1
  17. data/lib/adhearsion/call_controller/menu_dsl/fixnum_match_calculator.rb +1 -0
  18. data/lib/adhearsion/call_controller/menu_dsl/string_match_calculator.rb +1 -1
  19. data/lib/adhearsion/call_controller/output.rb +36 -7
  20. data/lib/adhearsion/call_controller/output/abstract_player.rb +4 -0
  21. data/lib/adhearsion/call_controller/record.rb +1 -0
  22. data/lib/adhearsion/cli_commands/ahn_command.rb +7 -4
  23. data/lib/adhearsion/cli_commands/plugin_command.rb +2 -0
  24. data/lib/adhearsion/generators.rb +2 -4
  25. data/lib/adhearsion/generators/app/templates/simon_game_spec.rb +20 -20
  26. data/lib/adhearsion/initializer.rb +2 -2
  27. data/lib/adhearsion/plugin.rb +6 -6
  28. data/lib/adhearsion/punchblock_plugin.rb +3 -4
  29. data/lib/adhearsion/punchblock_plugin/initializer.rb +2 -1
  30. data/lib/adhearsion/router.rb +7 -7
  31. data/lib/adhearsion/router/route.rb +10 -4
  32. data/lib/adhearsion/rspec.rb +2 -0
  33. data/lib/adhearsion/version.rb +1 -1
  34. data/spec/adhearsion/call_controller/dial_spec.rb +589 -557
  35. data/spec/adhearsion/call_controller/input_spec.rb +91 -91
  36. data/spec/adhearsion/call_controller/menu_dsl/array_match_calculator_spec.rb +29 -29
  37. data/spec/adhearsion/call_controller/menu_dsl/calculated_match_collection_spec.rb +6 -6
  38. data/spec/adhearsion/call_controller/menu_dsl/calculated_match_spec.rb +19 -19
  39. data/spec/adhearsion/call_controller/menu_dsl/fixnum_match_calculator_spec.rb +6 -6
  40. data/spec/adhearsion/call_controller/menu_dsl/match_calculator_spec.rb +1 -1
  41. data/spec/adhearsion/call_controller/menu_dsl/menu_builder_spec.rb +21 -17
  42. data/spec/adhearsion/call_controller/menu_dsl/menu_spec.rb +96 -83
  43. data/spec/adhearsion/call_controller/menu_dsl/range_match_calculator_spec.rb +5 -5
  44. data/spec/adhearsion/call_controller/menu_dsl/string_match_calculator_spec.rb +9 -9
  45. data/spec/adhearsion/call_controller/output/async_player_spec.rb +14 -4
  46. data/spec/adhearsion/call_controller/output/formatter_spec.rb +14 -14
  47. data/spec/adhearsion/call_controller/output/player_spec.rb +15 -5
  48. data/spec/adhearsion/call_controller/output_spec.rb +126 -78
  49. data/spec/adhearsion/call_controller/record_spec.rb +38 -26
  50. data/spec/adhearsion/call_controller/utility_spec.rb +11 -11
  51. data/spec/adhearsion/call_controller_spec.rb +176 -136
  52. data/spec/adhearsion/call_spec.rb +443 -218
  53. data/spec/adhearsion/calls_spec.rb +33 -33
  54. data/spec/adhearsion/configuration_spec.rb +61 -61
  55. data/spec/adhearsion/console_spec.rb +29 -29
  56. data/spec/adhearsion/events_spec.rb +14 -14
  57. data/spec/adhearsion/generators_spec.rb +1 -1
  58. data/spec/adhearsion/initializer_spec.rb +42 -42
  59. data/spec/adhearsion/logging_spec.rb +33 -33
  60. data/spec/adhearsion/outbound_call_spec.rb +69 -55
  61. data/spec/adhearsion/plugin_spec.rb +53 -44
  62. data/spec/adhearsion/process_spec.rb +21 -21
  63. data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +68 -52
  64. data/spec/adhearsion/punchblock_plugin_spec.rb +6 -6
  65. data/spec/adhearsion/router/evented_route_spec.rb +2 -2
  66. data/spec/adhearsion/router/openended_route_spec.rb +9 -9
  67. data/spec/adhearsion/router/route_spec.rb +61 -31
  68. data/spec/adhearsion/router/unaccepting_route_spec.rb +13 -13
  69. data/spec/adhearsion/router_spec.rb +47 -33
  70. data/spec/adhearsion/statistics/dump_spec.rb +6 -6
  71. data/spec/adhearsion/statistics_spec.rb +9 -9
  72. data/spec/adhearsion_spec.rb +23 -20
  73. data/spec/spec_helper.rb +3 -6
  74. data/spec/support/call_controller_test_helpers.rb +7 -7
  75. data/spec/support/initializer_stubs.rb +1 -1
  76. data/spec/support/punchblock_mocks.rb +1 -1
  77. metadata +22 -10
  78. data/features/support/utils.rb +0 -9
@@ -11,7 +11,7 @@ module Adhearsion
11
11
 
12
12
  before { subject.extend described_class }
13
13
 
14
- it { should be_evented }
14
+ it { is_expected.to be_evented }
15
15
 
16
16
  describe "dispatching a call" do
17
17
  let(:call) { Call.new }
@@ -24,7 +24,7 @@ module Adhearsion
24
24
  end
25
25
 
26
26
  it "should yield the call to the block" do
27
- call.should_receive(:foo).once
27
+ expect(call).to receive(:foo).once
28
28
  route.dispatch call
29
29
  end
30
30
  end
@@ -11,34 +11,34 @@ module Adhearsion
11
11
 
12
12
  before { subject.extend described_class }
13
13
 
14
- it { should be_openended }
14
+ it { is_expected.to be_openended }
15
15
 
16
16
  describe "dispatching a call" do
17
17
  let(:call) { Call.new }
18
18
 
19
19
  let(:latch) { CountDownLatch.new 1 }
20
20
 
21
- before { call.wrapped_object.stub :write_and_await_response }
21
+ before { allow(call.wrapped_object).to receive :write_and_await_response }
22
22
 
23
23
  context "via a call controller" do
24
24
  let(:controller) { CallController }
25
25
  subject(:route) { Route.new 'foobar', controller }
26
26
 
27
27
  it "should accept the call" do
28
- call.should_receive(:accept).once
28
+ expect(call).to receive(:accept).once
29
29
  route.dispatch call, lambda { latch.countdown! }
30
- latch.wait(2).should be true
30
+ expect(latch.wait(2)).to be true
31
31
  end
32
32
 
33
33
  it "should instruct the call to use an instance of the controller" do
34
- call.should_receive(:execute_controller).once.with kind_of(controller), kind_of(Proc)
34
+ expect(call).to receive(:execute_controller).once.with kind_of(controller), kind_of(Proc)
35
35
  route.dispatch call
36
36
  end
37
37
 
38
38
  it "should not hangup the call after all controllers have executed" do
39
- call.should_receive(:hangup).never
39
+ expect(call).to receive(:hangup).never
40
40
  route.dispatch call, lambda { latch.countdown! }
41
- latch.wait(2).should be true
41
+ expect(latch.wait(2)).to be true
42
42
  end
43
43
  end
44
44
 
@@ -50,8 +50,8 @@ module Adhearsion
50
50
  end
51
51
 
52
52
  it "should instruct the call to use a CallController with the correct block" do
53
- call.should_receive(:execute_controller).once.with(kind_of(CallController), kind_of(Proc)).and_return do |controller|
54
- controller.block.call.should be == :foobar
53
+ expect(call).to receive(:execute_controller).once.with(kind_of(CallController), kind_of(Proc)) do |controller|
54
+ expect(controller.block.call).to eq(:foobar)
55
55
  end
56
56
  route.dispatch call
57
57
  end
@@ -16,25 +16,47 @@ module Adhearsion
16
16
 
17
17
  subject { Route.new name }
18
18
 
19
- it { should_not be_evented }
20
- it { should be_accepting }
19
+ it { is_expected.not_to be_evented }
20
+ it { is_expected.to be_accepting }
21
21
 
22
22
  describe "with a class target and guards" do
23
23
  let(:target) { CallController }
24
24
 
25
25
  subject { Route.new name, target, *guards }
26
26
 
27
- its(:name) { should be == name }
28
- its(:target) { should be == target }
29
- its(:guards) { should be == guards }
27
+ describe '#name' do
28
+ subject { super().name }
29
+ it { is_expected.to eq(name) }
30
+ end
31
+
32
+ describe '#target' do
33
+ subject { super().target }
34
+ it { is_expected.to eq(target) }
35
+ end
36
+
37
+ describe '#guards' do
38
+ subject { super().guards }
39
+ it { is_expected.to eq(guards) }
40
+ end
30
41
  end
31
42
 
32
43
  describe "with a block target and guards" do
33
44
  subject { Route.new(name, *guards) { :foo } }
34
45
 
35
- its(:name) { should be == name }
36
- its(:target) { should be_a Proc }
37
- its(:guards) { should be == guards }
46
+ describe '#name' do
47
+ subject { super().name }
48
+ it { is_expected.to eq(name) }
49
+ end
50
+
51
+ describe '#target' do
52
+ subject { super().target }
53
+ it { is_expected.to be_a Proc }
54
+ end
55
+
56
+ describe '#guards' do
57
+ subject { super().guards }
58
+ it { is_expected.to eq(guards) }
59
+ end
38
60
  end
39
61
  end
40
62
 
@@ -42,11 +64,11 @@ module Adhearsion
42
64
  subject { Route.new 'foobar', CallController, *guards }
43
65
 
44
66
  def should_match_the_call
45
- subject.match?(call).should be true
67
+ expect(subject.match?(call)).to be true
46
68
  end
47
69
 
48
70
  def should_not_match_the_call
49
- subject.match?(call).should be false
71
+ expect(subject.match?(call)).to be false
50
72
  end
51
73
 
52
74
  describe "matching calls from fred to paul" do
@@ -109,34 +131,42 @@ module Adhearsion
109
131
 
110
132
  let(:latch) { CountDownLatch.new 1 }
111
133
 
112
- before { call.wrapped_object.stub :write_and_await_response }
134
+ before { allow(call.wrapped_object).to receive :write_and_await_response }
113
135
 
114
136
  context "via a call controller" do
115
137
  let(:controller) { CallController }
116
138
  let(:route) { Route.new 'foobar', controller }
117
139
 
118
140
  it "should immediately fire the :call_routed event giving the call and route" do
119
- Adhearsion::Events.should_receive(:trigger_immediately).once.with(:call_routed, call: call, route: route)
120
- call.should_receive(:hangup).once
141
+ expect(Adhearsion::Events).to receive(:trigger_immediately).once.with(:call_routed, call: call, route: route)
142
+ expect(call).to receive(:hangup).once
121
143
  route.dispatch call, lambda { latch.countdown! }
122
- latch.wait(2).should be true
144
+ expect(latch.wait(2)).to be true
123
145
  end
124
146
 
125
147
  it "should accept the call" do
126
- call.should_receive(:accept).once
148
+ expect(call).to receive(:accept).once
127
149
  route.dispatch call, lambda { latch.countdown! }
128
- latch.wait(2).should be true
150
+ expect(latch.wait(2)).to be true
129
151
  end
130
152
 
131
153
  it "should instruct the call to use an instance of the controller" do
132
- call.should_receive(:execute_controller).once.with kind_of(controller), kind_of(Proc)
154
+ expect(call).to receive(:execute_controller).once.with kind_of(controller), kind_of(Proc)
133
155
  route.dispatch call
134
156
  end
135
157
 
136
158
  it "should hangup the call after all controllers have executed" do
137
- call.should_receive(:hangup).once
159
+ expect(call).to receive(:hangup).once
138
160
  route.dispatch call, lambda { latch.countdown! }
139
- latch.wait(2).should be true
161
+ expect(latch.wait(2)).to be true
162
+ end
163
+
164
+ context "when the call has already ended before routing can begin" do
165
+ before { Celluloid::Actor.kill call }
166
+
167
+ it "should fall through cleanly" do
168
+ expect { route.dispatch call }.not_to raise_error
169
+ end
140
170
  end
141
171
 
142
172
  context "when the call has already ended before routing can begin" do
@@ -162,7 +192,7 @@ module Adhearsion
162
192
 
163
193
  it "gives the next call fresh metadata" do
164
194
  expected_controller = controller.new call, nil
165
- call.should_receive(:execute_controller).once.with expected_controller, kind_of(Proc)
195
+ expect(call).to receive(:execute_controller).once.with expected_controller, kind_of(Proc)
166
196
  route.dispatch call
167
197
  end
168
198
  end
@@ -171,20 +201,20 @@ module Adhearsion
171
201
  before { call.auto_hangup = false }
172
202
 
173
203
  it "should not hangup the call after controller execution" do
174
- call.should_receive(:hangup).never
204
+ expect(call).to receive(:hangup).never
175
205
  route.dispatch call, lambda { latch.countdown! }
176
- latch.wait(2).should be true
206
+ expect(latch.wait(2)).to be true
177
207
  end
178
208
  end
179
209
 
180
210
  context "if hangup raises a Call::Hangup" do
181
- before { call.should_receive(:hangup).once.and_raise Call::Hangup }
211
+ before { expect(call).to receive(:hangup).once.and_raise Call::Hangup }
182
212
 
183
213
  it "should not raise an exception" do
184
- lambda do
214
+ expect do
185
215
  route.dispatch call, lambda { latch.countdown! }
186
- latch.wait(2).should be true
187
- end.should_not raise_error
216
+ expect(latch.wait(2)).to be true
217
+ end.not_to raise_error
188
218
  end
189
219
  end
190
220
 
@@ -198,10 +228,10 @@ module Adhearsion
198
228
  end
199
229
 
200
230
  it "should not raise an exception" do
201
- lambda do
231
+ expect do
202
232
  route.dispatch call, lambda { latch.countdown! }
203
- latch.wait(2).should be true
204
- end.should_not raise_error
233
+ expect(latch.wait(2)).to be true
234
+ end.not_to raise_error
205
235
  end
206
236
  end
207
237
  end
@@ -214,8 +244,8 @@ module Adhearsion
214
244
  end
215
245
 
216
246
  it "should instruct the call to use a CallController with the correct block" do
217
- call.should_receive(:execute_controller).once.with(kind_of(CallController), kind_of(Proc)).and_return do |controller|
218
- controller.block.call.should be == :foobar
247
+ expect(call).to receive(:execute_controller).once.with(kind_of(CallController), kind_of(Proc)) do |controller|
248
+ expect(controller.block.call).to eq(:foobar)
219
249
  end
220
250
  route.dispatch call
221
251
  end
@@ -11,44 +11,44 @@ module Adhearsion
11
11
 
12
12
  before { subject.extend described_class }
13
13
 
14
- it { should_not be_accepting }
14
+ it { is_expected.not_to be_accepting }
15
15
 
16
16
  describe "dispatching a call" do
17
17
  let(:call) { Call.new }
18
18
 
19
19
  let(:latch) { CountDownLatch.new 1 }
20
20
 
21
- before { call.wrapped_object.stub :write_and_await_response }
21
+ before { allow(call.wrapped_object).to receive :write_and_await_response }
22
22
 
23
23
  context "via a call controller" do
24
24
  let(:controller) { CallController }
25
25
  subject(:route) { Route.new 'foobar', controller }
26
26
 
27
27
  it "should not accept the call" do
28
- call.should_receive(:accept).never
28
+ expect(call).to receive(:accept).never
29
29
  route.dispatch call, lambda { latch.countdown! }
30
- latch.wait(2).should be true
30
+ expect(latch.wait(2)).to be true
31
31
  end
32
32
 
33
33
  it "should instruct the call to use an instance of the controller" do
34
- call.should_receive(:execute_controller).once.with kind_of(controller), kind_of(Proc)
34
+ expect(call).to receive(:execute_controller).once.with kind_of(controller), kind_of(Proc)
35
35
  route.dispatch call
36
36
  end
37
37
 
38
38
  it "should hangup the call after all controllers have executed" do
39
- call.should_receive(:hangup).once
39
+ expect(call).to receive(:hangup).once
40
40
  route.dispatch call, lambda { latch.countdown! }
41
- latch.wait(2).should be true
41
+ expect(latch.wait(2)).to be true
42
42
  end
43
43
 
44
44
  context "if hangup raises a Call::Hangup" do
45
- before { call.should_receive(:hangup).once.and_raise Call::Hangup }
45
+ before { expect(call).to receive(:hangup).once.and_raise Call::Hangup }
46
46
 
47
47
  it "should not raise an exception" do
48
- lambda do
48
+ expect do
49
49
  route.dispatch call, lambda { latch.countdown! }
50
- latch.wait(2).should be true
51
- end.should_not raise_error
50
+ expect(latch.wait(2)).to be true
51
+ end.not_to raise_error
52
52
  end
53
53
  end
54
54
  end
@@ -61,8 +61,8 @@ module Adhearsion
61
61
  end
62
62
 
63
63
  it "should instruct the call to use a CallController with the correct block" do
64
- call.should_receive(:execute_controller).once.with(kind_of(CallController), kind_of(Proc)).and_return do |controller|
65
- controller.block.call.should be == :foobar
64
+ expect(call).to receive(:execute_controller).once.with(kind_of(CallController), kind_of(Proc)) do |controller|
65
+ expect(controller.block.call).to eq(:foobar)
66
66
  end
67
67
  route.dispatch call
68
68
  end
@@ -10,14 +10,14 @@ module Adhearsion
10
10
  subject { Router.new {} }
11
11
 
12
12
  let(:call) { double 'Adhearsion::Call' }
13
- before { call.stub id: 'abc123' }
13
+ before { allow(call).to receive_messages id: 'abc123' }
14
14
 
15
15
  it "should make the router available to the block" do
16
16
  foo = nil
17
17
  Router.new do
18
18
  foo = self
19
19
  end
20
- foo.should be_a Router
20
+ expect(foo).to be_a Router
21
21
  end
22
22
 
23
23
  describe "defining routes in the block" do
@@ -35,26 +35,28 @@ module Adhearsion
35
35
 
36
36
  subject { router.routes }
37
37
 
38
- it { should have(3).elements }
38
+ it 'has 3 elements' do
39
+ expect(subject.size).to eq(3)
40
+ end
39
41
 
40
42
  it "should contain Routes" do
41
43
  subject.each do |route|
42
- route.should be_a Router::Route
44
+ expect(route).to be_a Router::Route
43
45
  end
44
46
  end
45
47
 
46
48
  it "should build up the routes with the correct data" do
47
- subject[0].name.should be == 'calls from fred'
48
- subject[0].guards.should be == [{:from => 'fred'}]
49
- subject[0].target.should be == FooBarController
49
+ expect(subject[0].name).to eq('calls from fred')
50
+ expect(subject[0].guards).to eq([{:from => 'fred'}])
51
+ expect(subject[0].target).to eq(FooBarController)
50
52
 
51
- subject[1].name.should be == 'calls from paul'
52
- subject[1].guards.should be == [{:from => 'paul'}]
53
- subject[1].target.should be_a Proc
53
+ expect(subject[1].name).to eq('calls from paul')
54
+ expect(subject[1].guards).to eq([{:from => 'paul'}])
55
+ expect(subject[1].target).to be_a Proc
54
56
 
55
- subject[2].name.should be == 'catchall'
56
- subject[2].guards.should be == []
57
- subject[2].target.should be_a Proc
57
+ expect(subject[2].name).to eq('catchall')
58
+ expect(subject[2].guards).to eq([])
59
+ expect(subject[2].target).to be_a Proc
58
60
  end
59
61
 
60
62
  context "as evented" do
@@ -70,8 +72,8 @@ module Adhearsion
70
72
  end
71
73
 
72
74
  it "should create a route which is evented" do
73
- subject[0].should_not be_evented
74
- subject[1].should be_evented
75
+ expect(subject[0]).not_to be_evented
76
+ expect(subject[1]).to be_evented
75
77
  end
76
78
  end
77
79
 
@@ -88,8 +90,8 @@ module Adhearsion
88
90
  end
89
91
 
90
92
  it "should create a route with is unaccepting" do
91
- subject[0].should be_accepting
92
- subject[1].should_not be_accepting
93
+ expect(subject[0]).to be_accepting
94
+ expect(subject[1]).not_to be_accepting
93
95
  end
94
96
  end
95
97
 
@@ -106,8 +108,8 @@ module Adhearsion
106
108
  end
107
109
 
108
110
  it "should create a route which is openended" do
109
- subject[0].should_not be_openended
110
- subject[1].should be_openended
111
+ expect(subject[0]).not_to be_openended
112
+ expect(subject[1]).to be_openended
111
113
  end
112
114
  end
113
115
 
@@ -126,10 +128,10 @@ module Adhearsion
126
128
  end
127
129
 
128
130
  it "should create a route which is evented and unaccepting" do
129
- subject[0].should be_accepting
130
- subject[0].should_not be_evented
131
- subject[1].should be_evented
132
- subject[1].should_not be_accepting
131
+ expect(subject[0]).to be_accepting
132
+ expect(subject[0]).not_to be_evented
133
+ expect(subject[1]).to be_evented
134
+ expect(subject[1]).not_to be_accepting
133
135
  end
134
136
  end
135
137
  end
@@ -153,18 +155,30 @@ module Adhearsion
153
155
  subject { router.match call }
154
156
 
155
157
  context 'with a call from fred' do
156
- before { call.stub :from => 'fred' }
157
- its(:name) { should be == 'calls from fred' }
158
+ before { allow(call).to receive_messages :from => 'fred' }
159
+
160
+ describe '#name' do
161
+ subject { super().name }
162
+ it { is_expected.to eq('calls from fred') }
163
+ end
158
164
  end
159
165
 
160
166
  context 'with a call from paul' do
161
- before { call.stub :from => 'paul' }
162
- its(:name) { should be == 'calls from paul' }
167
+ before { allow(call).to receive_messages :from => 'paul' }
168
+
169
+ describe '#name' do
170
+ subject { super().name }
171
+ it { is_expected.to eq('calls from paul') }
172
+ end
163
173
  end
164
174
 
165
175
  context 'with a call from frank' do
166
- before { call.stub :from => 'frank' }
167
- its(:name) { should be == 'catchall' }
176
+ before { allow(call).to receive_messages :from => 'frank' }
177
+
178
+ describe '#name' do
179
+ subject { super().name }
180
+ it { is_expected.to eq('catchall') }
181
+ end
168
182
  end
169
183
  end
170
184
 
@@ -178,7 +192,7 @@ module Adhearsion
178
192
  let(:route) { subject.routes.first }
179
193
 
180
194
  it "should dispatch via the route" do
181
- route.should_receive(:dispatch).once.with call
195
+ expect(route).to receive(:dispatch).once.with call
182
196
  subject.handle call
183
197
  end
184
198
 
@@ -188,7 +202,7 @@ module Adhearsion
188
202
  end
189
203
 
190
204
  it "should return a dispatcher which rejects the call as an error" do
191
- call.should_receive(:reject).once.with(:error)
205
+ expect(call).to receive(:reject).once.with(:error)
192
206
  subject.handle call
193
207
  end
194
208
  end
@@ -200,10 +214,10 @@ module Adhearsion
200
214
  end
201
215
  end
202
216
 
203
- before { call.stub to: 'bar' }
217
+ before { allow(call).to receive_messages to: 'bar' }
204
218
 
205
219
  it "should return a dispatcher which rejects the call as an error" do
206
- call.should_receive(:reject).once.with(:error)
220
+ expect(call).to receive(:reject).once.with(:error)
207
221
  subject.handle call
208
222
  end
209
223
  end