adhearsion 2.5.4 → 2.6.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.
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
@@ -32,7 +32,7 @@ module Adhearsion
32
32
  subject { Adhearsion::Call.new offer }
33
33
 
34
34
  before do
35
- offer.stub(:client).and_return(mock_client)
35
+ allow(offer).to receive(:client).and_return(mock_client)
36
36
  end
37
37
 
38
38
  after do
@@ -50,49 +50,91 @@ module Adhearsion
50
50
  foo = :bar
51
51
  subject.after(1) { foo = :baz }
52
52
  sleep 1.1
53
- foo.should == :baz
53
+ expect(foo).to eq(:baz)
54
54
  end
55
55
 
56
- it { should respond_to :<< }
56
+ it { is_expected.to respond_to :<< }
57
57
 
58
- its(:end_reason) { should be == nil }
59
- it { should be_active }
58
+ describe '#end_reason' do
59
+ subject { super().end_reason }
60
+ it { is_expected.to eq(nil) }
61
+ end
62
+ it { is_expected.to be_active }
63
+
64
+ describe '#commands' do
65
+ subject { super().commands }
66
+ it { is_expected.to be_empty }
67
+ end
68
+
69
+ describe '#id' do
70
+ subject { super().id }
71
+ it { is_expected.to eq(call_id) }
72
+ end
73
+
74
+ describe '#domain' do
75
+ subject { super().domain }
76
+ it { is_expected.to eq(domain) }
77
+ end
78
+
79
+ describe '#uri' do
80
+ subject { super().uri }
81
+ it { is_expected.to eq("footransport:#{call_id}@#{domain}") }
82
+ end
83
+
84
+ describe '#to' do
85
+ subject { super().to }
86
+ it { is_expected.to eq(to) }
87
+ end
60
88
 
61
- its(:commands) { should be_empty }
89
+ describe '#from' do
90
+ subject { super().from }
91
+ it { is_expected.to eq(from) }
92
+ end
62
93
 
63
- its(:id) { should be == call_id }
64
- its(:domain) { should be == domain }
65
- its(:uri) { should be == "footransport:#{call_id}@#{domain}" }
66
- its(:to) { should be == to }
67
- its(:from) { should be == from }
94
+ describe '#auto_hangup' do
95
+ subject { super().auto_hangup }
96
+ it { is_expected.to be_truthy }
97
+ end
68
98
 
69
- its(:auto_hangup) { should be_true }
99
+ describe '#after_hangup_lifetime' do
100
+ subject { super().after_hangup_lifetime }
101
+ it { is_expected.to eq(nil) }
102
+ end
70
103
 
71
104
  context "when the ID is nil" do
72
105
  let(:call_id) { nil }
73
106
 
74
- its(:uri) { should be == nil }
107
+ describe '#uri' do
108
+ subject { super().uri }
109
+ it { is_expected.to eq(nil) }
110
+ end
75
111
  end
76
112
 
77
113
  context "when the domain is nil" do
78
114
  let(:domain) { nil }
79
115
 
80
- its(:uri) { should be == "footransport:#{call_id}" }
116
+ describe '#uri' do
117
+ subject { super().uri }
118
+ it { is_expected.to eq("footransport:#{call_id}") }
119
+ end
81
120
  end
82
121
 
83
122
  context "when the transport is nil" do
84
123
  let(:transport) { nil }
85
124
 
86
- its(:uri) { should be == "#{call_id}@#{domain}" }
125
+ describe '#uri' do
126
+ subject { super().uri }
127
+ it { is_expected.to eq("#{call_id}@#{domain}") }
128
+ end
87
129
  end
88
130
 
89
131
  it "should mark its start time" do
90
- subject.start_time.should == base_time
132
+ expect(subject.start_time).to eq(base_time)
91
133
  end
92
134
 
93
135
  describe "#commands" do
94
136
  it "should use a duplicating accessor for the command registry" do
95
- subject.commands.should_not be subject.commands
137
+ expect(subject.commands).not_to be subject.commands
96
138
  end
97
139
  end
98
140
 
@@ -100,15 +142,19 @@ module Adhearsion
100
142
  context "with an offer" do
101
143
  context "with headers" do
102
144
  let(:headers) { {'X-foo' => 'bar'} }
103
- its(:variables) { should be == {'x_foo' => 'bar'} }
145
+
146
+ describe '#variables' do
147
+ subject { super().variables }
148
+ it { is_expected.to eq({'x_foo' => 'bar'}) }
149
+ end
104
150
 
105
151
  it "should be made available via []" do
106
- subject[:x_foo].should be == 'bar'
152
+ expect(subject[:x_foo]).to eq('bar')
107
153
  end
108
154
 
109
155
  it "should be alterable using []=" do
110
156
  subject[:x_foo] = 'baz'
111
- subject[:x_foo].should be == 'baz'
157
+ expect(subject[:x_foo]).to eq('baz')
112
158
  end
113
159
 
114
160
  context "when receiving an event with headers" do
@@ -116,7 +162,7 @@ module Adhearsion
116
162
 
117
163
  it "should merge later headers" do
118
164
  subject << event
119
- subject.variables.should be == {'x_foo' => 'bar', 'x_bar' => 'foo'}
165
+ expect(subject.variables).to eq({'x_foo' => 'bar', 'x_bar' => 'foo'})
120
166
  end
121
167
 
122
168
  context "with have symbol names" do
@@ -124,7 +170,7 @@ module Adhearsion
124
170
 
125
171
  it "should merge later headers" do
126
172
  subject << event
127
- subject.variables.should be == {'x_foo' => 'bar', 'x_bar' => 'foo'}
173
+ expect(subject.variables).to eq({'x_foo' => 'bar', 'x_bar' => 'foo'})
128
174
  end
129
175
  end
130
176
  end
@@ -134,26 +180,34 @@ module Adhearsion
134
180
 
135
181
  it "should merge later headers" do
136
182
  subject.write_command command
137
- subject.variables.should be == {'x_foo' => 'bar', 'x_bar' => 'foo'}
183
+ expect(subject.variables).to eq({'x_foo' => 'bar', 'x_bar' => 'foo'})
138
184
  end
139
185
  end
140
186
  end
141
187
 
142
188
  context "without headers" do
143
189
  let(:headers) { nil }
144
- its(:variables) { should be == {} }
190
+
191
+ describe '#variables' do
192
+ subject { super().variables }
193
+ it { is_expected.to eq({}) }
194
+ end
145
195
  end
146
196
  end
147
197
 
148
198
  context "without an offer" do
149
199
  let(:offer) { nil }
150
- its(:variables) { should be == {} }
200
+
201
+ describe '#variables' do
202
+ subject { super().variables }
203
+ it { is_expected.to eq({}) }
204
+ end
151
205
  end
152
206
  end
153
207
 
154
208
  describe 'without an offer' do
155
209
  it 'should not raise an exception' do
156
- lambda { Adhearsion::Call.new }.should_not raise_error
210
+ expect { Adhearsion::Call.new }.not_to raise_error
157
211
  end
158
212
  end
159
213
 
@@ -162,8 +216,8 @@ module Adhearsion
162
216
  let(:response) { double 'Response' }
163
217
 
164
218
  it 'are called when messages are delivered' do
165
- event.should_receive(:foo?).and_return true
166
- response.should_receive(:call).once
219
+ expect(event).to receive(:foo?).and_return true
220
+ expect(response).to receive(:call).once
167
221
  subject.register_event_handler(:foo?) { response.call }
168
222
  subject << event
169
223
  end
@@ -172,18 +226,18 @@ module Adhearsion
172
226
  it 'does not cause the call actor to crash' do
173
227
  subject.register_event_handler { raise 'Boom' }
174
228
  subject << event
175
- subject.should be_alive
229
+ expect(subject).to be_alive
176
230
  end
177
231
 
178
232
  it "triggers an exception event" do
179
233
  e = StandardError.new('Boom')
180
- Events.should_receive(:trigger).once.with(:exception, [e, subject.logger])
234
+ expect(Events).to receive(:trigger).once.with(:exception, [e, subject.logger])
181
235
  subject.register_event_handler { raise e }
182
236
  subject << event
183
237
  end
184
238
 
185
239
  it 'executes all handlers for each event' do
186
- response.should_receive(:call).once
240
+ expect(response).to receive(:call).once
187
241
  subject.register_event_handler { raise 'Boom' }
188
242
  subject.register_event_handler { response.call }
189
243
  subject << event
@@ -201,33 +255,33 @@ module Adhearsion
201
255
  end
202
256
 
203
257
  it "should trigger any on_joined callbacks set for the matching call ID" do
204
- response.should_receive(:call).once.with(event)
258
+ expect(response).to receive(:call).once.with(event)
205
259
  subject.on_joined(:call_uri => 'footransport:foobar@rayo.net') { |event| response.call event }
206
260
  subject << event
207
261
  end
208
262
 
209
263
  it "should trigger any on_joined callbacks set for the matching call ID as a string" do
210
- response.should_receive(:call).once.with(event)
264
+ expect(response).to receive(:call).once.with(event)
211
265
  subject.on_joined('foobar') { |event| response.call event }
212
266
  subject << event
213
267
  end
214
268
 
215
269
  it "should trigger any on_joined callbacks set for the matching call" do
216
- response.should_receive(:call).once.with(event)
270
+ expect(response).to receive(:call).once.with(event)
217
271
  call = Call.new
218
- call.wrapped_object.stub id: 'foobar', domain: 'rayo.net', transport: 'footransport'
272
+ allow(call.wrapped_object).to receive_messages id: 'foobar', domain: 'rayo.net', transport: 'footransport'
219
273
  subject.on_joined(call) { |event| response.call event }
220
274
  subject << event
221
275
  end
222
276
 
223
277
  it "should not trigger on_joined callbacks for other call IDs" do
224
- response.should_receive(:call).never
278
+ expect(response).to receive(:call).never
225
279
  subject.on_joined(:call_uri => 'barfoo') { |event| response.call event }
226
280
  subject << event
227
281
  end
228
282
 
229
283
  it "should not trigger on_joined callbacks for mixers" do
230
- response.should_receive(:call).never
284
+ expect(response).to receive(:call).never
231
285
  subject.on_joined(:mixer_name => 'foobar') { |event| response.call event }
232
286
  subject << event
233
287
  end
@@ -239,33 +293,33 @@ module Adhearsion
239
293
  end
240
294
 
241
295
  it "should trigger on_joined callbacks for the matching mixer name" do
242
- response.should_receive(:call).once.with(event)
296
+ expect(response).to receive(:call).once.with(event)
243
297
  subject.on_joined(:mixer_name => 'foobar') { |event| response.call event }
244
298
  subject << event
245
299
  end
246
300
 
247
301
  it "should not trigger on_joined callbacks for other mixer names" do
248
- response.should_receive(:call).never
302
+ expect(response).to receive(:call).never
249
303
  subject.on_joined(:mixer_name => 'barfoo') { |event| response.call event }
250
304
  subject << event
251
305
  end
252
306
 
253
307
  it "should not trigger any on_joined callbacks set for calls" do
254
- response.should_receive(:call).never
308
+ expect(response).to receive(:call).never
255
309
  subject.on_joined(:call_uri => 'foobar') { |event| response.call event }
256
310
  subject << event
257
311
  end
258
312
 
259
313
  it "should not trigger any on_joined callbacks set for the matching call ID as a string" do
260
- response.should_receive(:call).never
314
+ expect(response).to receive(:call).never
261
315
  subject.on_joined('foobar') { |event| response.call event }
262
316
  subject << event
263
317
  end
264
318
 
265
319
  it "should not trigger any on_joined callbacks set for the matching call" do
266
- response.should_receive(:call).never
320
+ expect(response).to receive(:call).never
267
321
  call = Call.new
268
- call.wrapped_object.stub :id => 'foobar'
322
+ allow(call.wrapped_object).to receive_messages :id => 'foobar'
269
323
  subject.on_joined(call) { |event| response.call event }
270
324
  subject << event
271
325
  end
@@ -279,33 +333,33 @@ module Adhearsion
279
333
  end
280
334
 
281
335
  it "should trigger any on_unjoined callbacks set for the matching call ID" do
282
- response.should_receive(:call).once.with(event)
336
+ expect(response).to receive(:call).once.with(event)
283
337
  subject.on_unjoined(:call_uri => 'footransport:foobar@rayo.net') { |event| response.call event }
284
338
  subject << event
285
339
  end
286
340
 
287
341
  it "should trigger any on_unjoined callbacks set for the matching call ID as a string" do
288
- response.should_receive(:call).once.with(event)
342
+ expect(response).to receive(:call).once.with(event)
289
343
  subject.on_unjoined('foobar') { |event| response.call event }
290
344
  subject << event
291
345
  end
292
346
 
293
347
  it "should trigger any on_unjoined callbacks set for the matching call" do
294
- response.should_receive(:call).once.with(event)
348
+ expect(response).to receive(:call).once.with(event)
295
349
  call = Call.new
296
- call.wrapped_object.stub id: 'foobar', domain: 'rayo.net', transport: 'footransport'
350
+ allow(call.wrapped_object).to receive_messages id: 'foobar', domain: 'rayo.net', transport: 'footransport'
297
351
  subject.on_unjoined(call) { |event| response.call event }
298
352
  subject << event
299
353
  end
300
354
 
301
355
  it "should not trigger on_unjoined callbacks for other call IDs" do
302
- response.should_receive(:call).never
356
+ expect(response).to receive(:call).never
303
357
  subject.on_unjoined(:call_uri => 'barfoo') { |event| response.call event }
304
358
  subject << event
305
359
  end
306
360
 
307
361
  it "should not trigger on_unjoined callbacks for mixers" do
308
- response.should_receive(:call).never
362
+ expect(response).to receive(:call).never
309
363
  subject.on_joined(:mixer_name => 'foobar') { |event| response.call event }
310
364
  subject << event
311
365
  end
@@ -317,33 +371,33 @@ module Adhearsion
317
371
  end
318
372
 
319
373
  it "should trigger on_unjoined callbacks for the matching mixer name" do
320
- response.should_receive(:call).once.with(event)
374
+ expect(response).to receive(:call).once.with(event)
321
375
  subject.on_unjoined(:mixer_name => 'foobar') { |event| response.call event }
322
376
  subject << event
323
377
  end
324
378
 
325
379
  it "should not trigger on_unjoined callbacks for other mixer names" do
326
- response.should_receive(:call).never
380
+ expect(response).to receive(:call).never
327
381
  subject.on_unjoined(:mixer_name => 'barfoo') { |event| response.call event }
328
382
  subject << event
329
383
  end
330
384
 
331
385
  it "should not trigger any on_unjoined callbacks set for calls" do
332
- response.should_receive(:call).never
386
+ expect(response).to receive(:call).never
333
387
  subject.on_unjoined(:call_uri => 'foobar') { |event| response.call event }
334
388
  subject << event
335
389
  end
336
390
 
337
391
  it "should not trigger any on_unjoined callbacks set for the matching call ID as a string" do
338
- response.should_receive(:call).never
392
+ expect(response).to receive(:call).never
339
393
  subject.on_unjoined('foobar') { |event| response.call event }
340
394
  subject << event
341
395
  end
342
396
 
343
397
  it "should not trigger any on_unjoined callbacks set for the matching call" do
344
- response.should_receive(:call).never
398
+ expect(response).to receive(:call).never
345
399
  call = Call.new
346
- call.wrapped_object.stub :id => 'foobar'
400
+ allow(call.wrapped_object).to receive_messages :id => 'foobar'
347
401
  subject.on_unjoined(call) { |event| response.call event }
348
402
  subject << event
349
403
  end
@@ -356,7 +410,7 @@ module Adhearsion
356
410
  end
357
411
 
358
412
  it "should trigger any on_end callbacks set" do
359
- response.should_receive(:call).once.with(event)
413
+ expect(response).to receive(:call).once.with(event)
360
414
  subject.on_end { |event| response.call event }
361
415
  subject << event
362
416
  end
@@ -365,21 +419,21 @@ module Adhearsion
365
419
  context "when raising an exception" do
366
420
  it "does not kill the call actor" do
367
421
  subject.register_event_handler { |e| raise 'foo' }
368
- lambda { subject << :foo }.should_not raise_error
422
+ expect { subject << :foo }.not_to raise_error
369
423
  sleep 1
370
- subject.should be_alive
424
+ expect(subject).to be_alive
371
425
  end
372
426
 
373
427
  it 'passes the exception through the Events system' do
374
428
  latch = CountDownLatch.new 1
375
429
  Adhearsion::Events.exception do |e, l|
376
- e.should be_a RuntimeError
377
- l.should be subject.logger
430
+ expect(e).to be_a RuntimeError
431
+ expect(l).to be subject.logger
378
432
  latch.countdown!
379
433
  end
380
434
  subject.register_event_handler { |e| raise 'foo' }
381
- lambda { subject << :foo }.should_not raise_error
382
- latch.wait(3).should be true
435
+ expect { subject << :foo }.not_to raise_error
436
+ expect(latch.wait(3)).to be true
383
437
  Adhearsion::Events.clear_handlers :exception
384
438
  end
385
439
  end
@@ -389,7 +443,7 @@ module Adhearsion
389
443
  let(:other_call_uri) { 'xmpp:foobar@example.com' }
390
444
  let(:other_call) { Call.new }
391
445
 
392
- before { other_call.stub uri: other_call_uri }
446
+ before { allow(other_call).to receive_messages uri: other_call_uri }
393
447
 
394
448
  let :joined_event do
395
449
  Punchblock::Event::Joined.new call_uri: other_call_uri
@@ -405,7 +459,7 @@ module Adhearsion
405
459
 
406
460
  it "should add the peer to its registry" do
407
461
  subject << joined_event
408
- subject.peers.should == {'xmpp:foobar@example.com' => other_call}
462
+ expect(subject.peers).to eq({'xmpp:foobar@example.com' => other_call})
409
463
  end
410
464
 
411
465
  context "in a handler for the joined event" do
@@ -418,7 +472,7 @@ module Adhearsion
418
472
 
419
473
  subject << joined_event
420
474
 
421
- peer.should == other_call_uri
475
+ expect(peer).to eq(other_call_uri)
422
476
  end
423
477
  end
424
478
 
@@ -426,9 +480,9 @@ module Adhearsion
426
480
  before { subject << joined_event }
427
481
 
428
482
  it "should remove the peer from its registry" do
429
- subject.peers.should_not eql({})
483
+ expect(subject.peers).not_to eql({})
430
484
  subject << unjoined_event
431
- subject.peers.should eql({})
485
+ expect(subject.peers).to eql({})
432
486
  end
433
487
 
434
488
  context "in a handler for the unjoined event" do
@@ -441,7 +495,7 @@ module Adhearsion
441
495
 
442
496
  subject << unjoined_event
443
497
 
444
- peer_count.should == 0
498
+ expect(peer_count).to eq(0)
445
499
  end
446
500
  end
447
501
  end
@@ -450,7 +504,7 @@ module Adhearsion
450
504
  context "when we don't know about the joined call" do
451
505
  it "should add a nil entry to its registry" do
452
506
  subject << joined_event
453
- subject.peers.should == {'xmpp:foobar@example.com' => nil}
507
+ expect(subject.peers).to eq({'xmpp:foobar@example.com' => nil})
454
508
  end
455
509
 
456
510
  context "in a handler for the joined event" do
@@ -463,7 +517,7 @@ module Adhearsion
463
517
 
464
518
  subject << joined_event
465
519
 
466
- peer.should == other_call_uri
520
+ expect(peer).to eq(other_call_uri)
467
521
  end
468
522
  end
469
523
 
@@ -471,9 +525,9 @@ module Adhearsion
471
525
  before { subject << joined_event }
472
526
 
473
527
  it "should remove the peer from its registry" do
474
- subject.peers.should_not eql({})
528
+ expect(subject.peers).not_to eql({})
475
529
  subject << unjoined_event
476
- subject.peers.should eql({})
530
+ expect(subject.peers).to eql({})
477
531
  end
478
532
 
479
533
  context "in a handler for the unjoined event" do
@@ -486,14 +540,14 @@ module Adhearsion
486
540
 
487
541
  subject << unjoined_event
488
542
 
489
- peer_count.should == 0
543
+ expect(peer_count).to eq(0)
490
544
  end
491
545
  end
492
546
  end
493
547
  end
494
548
 
495
549
  it "should not return the same registry every call" do
496
- subject.peers.should_not be subject.peers
550
+ expect(subject.peers).not_to be subject.peers
497
551
  end
498
552
  end
499
553
 
@@ -505,25 +559,25 @@ module Adhearsion
505
559
 
506
560
  it "should mark the call as ended" do
507
561
  subject << end_event
508
- subject.should_not be_active
562
+ expect(subject).not_to be_active
509
563
  end
510
564
 
511
565
  it "should set the end reason" do
512
566
  subject << end_event
513
- subject.end_reason.should be == :hangup
567
+ expect(subject.end_reason).to eq(:hangup)
514
568
  end
515
569
 
516
570
  it "should set the end code" do
517
571
  subject << end_event
518
- subject.end_code.should be == 'arbitrary_code'
572
+ expect(subject.end_code).to eq('arbitrary_code')
519
573
  end
520
574
 
521
575
  it "should set the end time" do
522
576
  finish_time = Time.local(2008, 9, 1, 12, 1, 3)
523
577
  Timecop.freeze finish_time
524
- subject.end_time.should == nil
578
+ expect(subject.end_time).to eq(nil)
525
579
  subject << end_event
526
- subject.end_time.should == finish_time
580
+ expect(subject.end_time).to eq(finish_time)
527
581
  end
528
582
 
529
583
  it "should set the call duration" do
@@ -534,7 +588,7 @@ module Adhearsion
534
588
  mid_point_time = Time.local(2008, 9, 1, 12, 0, 37)
535
589
  Timecop.freeze mid_point_time
536
590
 
537
- subject.duration.should == 37.0
591
+ expect(subject.duration).to eq(37.0)
538
592
 
539
593
  finish_time = Time.local(2008, 9, 1, 12, 1, 3)
540
594
  Timecop.freeze finish_time
@@ -544,7 +598,7 @@ module Adhearsion
544
598
  future_time = Time.local(2008, 9, 1, 12, 2, 3)
545
599
  Timecop.freeze finish_time
546
600
 
547
- subject.duration.should == 63.0
601
+ expect(subject.duration).to eq(63.0)
548
602
  end
549
603
 
550
604
  it "should instruct the command registry to terminate" do
@@ -552,25 +606,58 @@ module Adhearsion
552
606
  command.request!
553
607
  subject.future.write_and_await_response command
554
608
  subject << end_event
555
- command.response(1).should be_a Call::Hangup
609
+ expect(command.response(1)).to be_a Call::Hangup
556
610
  end
557
611
 
558
612
  it "removes itself from the active calls" do
559
613
  size_before = Adhearsion.active_calls.size
560
614
 
561
615
  Adhearsion.active_calls << subject
562
- Adhearsion.active_calls.size.should be > size_before
616
+ expect(Adhearsion.active_calls.size).to be > size_before
563
617
 
564
618
  subject << end_event
565
- Adhearsion.active_calls.size.should be == size_before
619
+ expect(Adhearsion.active_calls.size).to eq(size_before)
566
620
  end
567
621
 
568
- it "shuts down the actor" do
569
- Adhearsion.config.platform.after_hangup_lifetime = 2
570
- subject << end_event
571
- sleep 2.1
572
- subject.should_not be_alive
573
- lambda { subject.id }.should raise_error Call::ExpiredError, /expired and is no longer accessible/
622
+ context "with no custom lifetime" do
623
+ around do |example|
624
+ old_val = Adhearsion.config.platform.after_hangup_lifetime
625
+ begin
626
+ example.run
627
+ rescue
628
+ Adhearsion.config.platform.after_hangup_lifetime = old_val
629
+ end
630
+ end
631
+
632
+ it "shuts down the actor using platform config" do
633
+ Adhearsion.config.platform.after_hangup_lifetime = 2
634
+ subject << end_event
635
+ sleep 2.1
636
+ expect(subject.alive?).to be false
637
+ expect { subject.id }.to raise_error Call::ExpiredError, /expired and is no longer accessible/
638
+ end
639
+ end
640
+
641
+ context "with a custom lifetime" do
642
+ around do |example|
643
+ old_val = Adhearsion.config.platform.after_hangup_lifetime
644
+ begin
645
+ example.run
646
+ rescue
647
+ Adhearsion.config.platform.after_hangup_lifetime = old_val
648
+ end
649
+ end
650
+
651
+ it "shuts down the actor using the Call#after_hangup_lifetime" do
652
+ Adhearsion.config.platform.after_hangup_lifetime = 1
653
+ subject.after_hangup_lifetime = 2
654
+ subject << end_event
655
+ sleep 1.1
656
+ expect(subject.alive?).to be true
657
+ sleep 1
658
+ expect(subject.alive?).to be false
659
+ expect { subject.id }.to raise_error Call::ExpiredError, /expired and is no longer accessible/
660
+ end
574
661
  end
575
662
  end
576
663
  end
@@ -584,7 +671,7 @@ module Adhearsion
584
671
  before { subject << end_event }
585
672
 
586
673
  it "should return the end reason" do
587
- subject.wait_for_end.should == :hangup
674
+ expect(subject.wait_for_end).to eq(:hangup)
588
675
  end
589
676
  end
590
677
 
@@ -593,35 +680,35 @@ module Adhearsion
593
680
  fut = subject.future.wait_for_end
594
681
 
595
682
  sleep 0.5
596
- fut.should_not be_ready
683
+ expect(fut).not_to be_ready
597
684
 
598
685
  subject << end_event
599
686
 
600
- fut.value.should == :hangup
687
+ expect(fut.value).to eq(:hangup)
601
688
  end
602
689
  end
603
690
  end
604
691
 
605
692
  describe "tagging a call" do
606
693
  it 'with a single Symbol' do
607
- lambda {
694
+ expect {
608
695
  subject.tag :moderator
609
- }.should_not raise_error
696
+ }.not_to raise_error
610
697
  end
611
698
 
612
699
  it 'with multiple Symbols' do
613
- lambda {
700
+ expect {
614
701
  subject.tag :moderator
615
702
  subject.tag :female
616
- }.should_not raise_error
703
+ }.not_to raise_error
617
704
  end
618
705
 
619
706
  it 'with a non-Symbol, non-String object' do
620
707
  bad_objects = [123, Object.new, 888.88, nil, true, false, StringIO.new]
621
708
  bad_objects.each do |bad_object|
622
- lambda {
709
+ expect {
623
710
  subject.tag bad_object
624
- }.should raise_error ArgumentError
711
+ }.to raise_error ArgumentError
625
712
  end
626
713
  end
627
714
  end
@@ -631,21 +718,21 @@ module Adhearsion
631
718
  subject.tag :female
632
719
  subject.remove_tag :female
633
720
  subject.tag :male
634
- subject.tags.should be == [:moderator, :male]
721
+ expect(subject.tags).to eq([:moderator, :male])
635
722
  end
636
723
 
637
724
  describe "#tagged_with?" do
638
725
  it 'with one tag' do
639
726
  subject.tag :guest
640
- subject.tagged_with?(:guest).should be true
641
- subject.tagged_with?(:authorized).should be false
727
+ expect(subject.tagged_with?(:guest)).to be true
728
+ expect(subject.tagged_with?(:authorized)).to be false
642
729
  end
643
730
 
644
731
  it 'with many tags' do
645
732
  subject.tag :customer
646
733
  subject.tag :authorized
647
- subject.tagged_with?(:customer).should be true
648
- subject.tagged_with?(:authorized).should be true
734
+ expect(subject.tagged_with?(:customer)).to be true
735
+ expect(subject.tagged_with?(:authorized)).to be true
649
736
  end
650
737
  end
651
738
 
@@ -653,25 +740,25 @@ module Adhearsion
653
740
  let(:command) { Punchblock::Command::Answer.new }
654
741
 
655
742
  it "should write the command to the Punchblock connection" do
656
- subject.wrapped_object.should_receive(:client).once.and_return mock_client
657
- mock_client.should_receive(:execute_command).once.with(Punchblock::Command::Answer.new(target_call_id: call_id, domain: domain)).and_return true
743
+ expect(subject.wrapped_object).to receive(:client).once.and_return mock_client
744
+ expect(mock_client).to receive(:execute_command).once.with(Punchblock::Command::Answer.new(target_call_id: call_id, domain: domain)).and_return true
658
745
  subject.write_command command
659
746
  end
660
747
 
661
748
  describe "with a hungup call" do
662
749
  before do
663
- subject.wrapped_object.should_receive(:active?).and_return(false)
750
+ expect(subject.wrapped_object).to receive(:active?).and_return(false)
664
751
  end
665
752
 
666
753
  it "should raise a Hangup exception" do
667
- lambda { subject.write_command command }.should raise_error(Call::Hangup)
754
+ expect { subject.write_command command }.to raise_error(Call::Hangup)
668
755
  end
669
756
 
670
757
  describe "if the command is a Hangup" do
671
758
  let(:command) { Punchblock::Command::Hangup.new }
672
759
 
673
760
  it "should not raise a Hangup exception" do
674
- lambda { subject.write_command command }.should_not raise_error
761
+ expect { subject.write_command command }.not_to raise_error
675
762
  end
676
763
  end
677
764
  end
@@ -682,18 +769,18 @@ module Adhearsion
682
769
  let(:response) { :foo }
683
770
 
684
771
  before do
685
- message.should_receive(:execute!).and_return true
772
+ expect(message).to receive(:execute!).and_return true
686
773
  message.response = response
687
774
  end
688
775
 
689
776
  it "writes a command to the call" do
690
- subject.wrapped_object.should_receive(:write_command).once.with(message)
777
+ expect(subject.wrapped_object).to receive(:write_command).once.with(message)
691
778
  subject.write_and_await_response message
692
779
  end
693
780
 
694
781
  it "removes the command from the registry after execution" do
695
782
  subject.write_and_await_response message
696
- subject.commands.should be_empty
783
+ expect(subject.commands).to be_empty
697
784
  end
698
785
 
699
786
  it "blocks until a response is received" do
@@ -705,7 +792,7 @@ module Adhearsion
705
792
  end
706
793
  starting_time = Time.now
707
794
  subject.write_and_await_response slow_command
708
- (Time.now - starting_time).should >= 0.5
795
+ expect(Time.now - starting_time).to be >= 0.5
709
796
  end
710
797
 
711
798
  context "while waiting for a response" do
@@ -715,7 +802,7 @@ module Adhearsion
715
802
 
716
803
  it "does not block the whole actor while waiting for a response" do
717
804
  fut = subject.future.write_and_await_response slow_command
718
- subject.id.should == call_id
805
+ expect(subject.id).to eq(call_id)
719
806
  slow_command.response = response
720
807
  fut.value
721
808
  end
@@ -723,14 +810,14 @@ module Adhearsion
723
810
  it "adds the command to the registry" do
724
811
  subject.future.write_and_await_response slow_command
725
812
  sleep 0.2
726
- subject.commands.should_not be_empty
727
- subject.commands.first.should be slow_command
813
+ expect(subject.commands).not_to be_empty
814
+ expect(subject.commands.first).to be slow_command
728
815
  end
729
816
  end
730
817
 
731
818
  describe "with a successful response" do
732
819
  it "returns the executed command" do
733
- subject.write_and_await_response(message).should be message
820
+ expect(subject.write_and_await_response(message)).to be message
734
821
  end
735
822
  end
736
823
 
@@ -739,16 +826,16 @@ module Adhearsion
739
826
  let(:response) { new_exception.new }
740
827
 
741
828
  it "raises the error" do
742
- Events.should_receive(:trigger).never
743
- lambda { subject.write_and_await_response message }.should raise_error new_exception
829
+ expect(Events).to receive(:trigger).never
830
+ expect { subject.write_and_await_response message }.to raise_error new_exception
744
831
  end
745
832
 
746
833
  context "where the name is :item_not_found" do
747
834
  let(:response) { new_exception.new.setup :item_not_found }
748
835
 
749
836
  it "should raise a Hangup exception" do
750
- Events.should_receive(:trigger).never
751
- lambda { subject.write_and_await_response message }.should raise_error Call::Hangup
837
+ expect(Events).to receive(:trigger).never
838
+ expect { subject.write_and_await_response message }.to raise_error Call::Hangup
752
839
  end
753
840
  end
754
841
  end
@@ -757,34 +844,34 @@ module Adhearsion
757
844
  before do
758
845
  message.target_call_id = call_id
759
846
  message.domain = domain
760
- message.should_receive(:response).and_raise Timeout::Error
847
+ expect(message).to receive(:response).and_raise Timeout::Error
761
848
  end
762
849
 
763
850
  it "should raise the error in the caller but not crash the actor" do
764
- lambda { subject.write_and_await_response message }.should raise_error Call::CommandTimeout, message.to_s
851
+ expect { subject.write_and_await_response message }.to raise_error Call::CommandTimeout, message.to_s
765
852
  sleep 0.5
766
- subject.should be_alive
853
+ expect(subject).to be_alive
767
854
  end
768
855
  end
769
856
  end
770
857
 
771
858
  describe "#send_message" do
772
859
  it "should send a message through the Punchblock connection using the call ID and domain" do
773
- subject.wrapped_object.should_receive(:client).once.and_return mock_client
774
- mock_client.should_receive(:send_message).once.with(subject.id, subject.domain, "Hello World!", {})
860
+ expect(subject.wrapped_object).to receive(:client).once.and_return mock_client
861
+ expect(mock_client).to receive(:send_message).once.with(subject.id, subject.domain, "Hello World!", {})
775
862
  subject.send_message "Hello World!"
776
863
  end
777
864
 
778
865
  it "should send a message with the given subject" do
779
- subject.wrapped_object.should_receive(:client).once.and_return mock_client
780
- mock_client.should_receive(:send_message).once.with(subject.id, subject.domain, nil, :subject => "Important Message")
866
+ expect(subject.wrapped_object).to receive(:client).once.and_return mock_client
867
+ expect(mock_client).to receive(:send_message).once.with(subject.id, subject.domain, nil, :subject => "Important Message")
781
868
  subject.send_message nil, :subject => "Important Message"
782
869
  end
783
870
  end
784
871
 
785
872
  describe "basic control commands" do
786
873
  def expect_message_waiting_for_response(message = nil, fail = false, &block)
787
- expectation = subject.wrapped_object.should_receive(:write_and_await_response, &block).once
874
+ expectation = expect(subject.wrapped_object).to receive(:write_and_await_response, &block).once
788
875
  expectation = expectation.with message if message
789
876
  if fail
790
877
  expectation.and_raise fail
@@ -816,6 +903,16 @@ module Adhearsion
816
903
  subject.accept
817
904
  end
818
905
  end
906
+
907
+ context "with a failure response" do
908
+ it 'should raise the error but not crash the actor' do
909
+ error = Punchblock::ProtocolError.new.setup(:service_unavailable)
910
+ expect_message_waiting_for_response Punchblock::Command::Accept.new, error
911
+ expect { subject.accept }.to raise_error error
912
+ sleep 0.2
913
+ expect(subject.alive?).to be true
914
+ end
915
+ end
819
916
  end
820
917
 
821
918
  describe '#answer' do
@@ -833,6 +930,16 @@ module Adhearsion
833
930
  subject.answer headers
834
931
  end
835
932
  end
933
+
934
+ context "with a failure response" do
935
+ it 'should raise the error but not crash the actor' do
936
+ error = Punchblock::ProtocolError.new.setup(:service_unavailable)
937
+ expect_message_waiting_for_response Punchblock::Command::Answer.new, error
938
+ expect { subject.answer }.to raise_error error
939
+ sleep 0.2
940
+ expect(subject.alive?).to be true
941
+ end
942
+ end
836
943
  end
837
944
 
838
945
  describe '#reject' do
@@ -871,20 +978,74 @@ module Adhearsion
871
978
 
872
979
  it "should immediately fire the :call_rejected event giving the call and the reason" do
873
980
  expect_message_waiting_for_response kind_of(Punchblock::Command::Reject)
874
- Adhearsion::Events.should_receive(:trigger_immediately).once.with(:call_rejected, :call => subject, :reason => :decline)
981
+ expect(Adhearsion::Events).to receive(:trigger_immediately).once.with(:call_rejected, :call => subject, :reason => :decline)
875
982
  subject.reject :decline
876
983
  end
984
+
985
+ context "with a failure response" do
986
+ it 'should raise the error but not crash the actor' do
987
+ error = Punchblock::ProtocolError.new.setup(:service_unavailable)
988
+ expect_message_waiting_for_response Punchblock::Command::Reject.new(reason: :busy), error
989
+ expect { subject.reject }.to raise_error error
990
+ sleep 0.2
991
+ expect(subject.alive?).to be true
992
+ end
993
+ end
994
+ end
995
+
996
+ describe '#redirect' do
997
+ describe "with a target given" do
998
+ it 'should send a Redirect message with the correct target' do
999
+ expect_message_waiting_for_response Punchblock::Command::Redirect.new(to: 'sip:foo@bar.com')
1000
+ subject.redirect 'sip:foo@bar.com'
1001
+ end
1002
+ end
1003
+
1004
+ describe "with no target given" do
1005
+ it 'should raise with ArgumentError' do
1006
+ expect { subject.redirect }.to raise_error(ArgumentError)
1007
+ end
1008
+ end
1009
+
1010
+ describe "with no headers" do
1011
+ it 'should send a Redirect message' do
1012
+ expect_message_waiting_for_response do |c|
1013
+ c.is_a?(Punchblock::Command::Redirect) && c.headers == {}
1014
+ end
1015
+ subject.redirect 'sip:foo@bar.com'
1016
+ end
1017
+ end
1018
+
1019
+ describe "with headers set" do
1020
+ it 'should send a Redirect message with the correct headers' do
1021
+ headers = {:foo => 'bar'}
1022
+ expect_message_waiting_for_response do |c|
1023
+ c.is_a?(Punchblock::Command::Redirect) && c.headers == headers
1024
+ end
1025
+ subject.redirect 'sip:foo@bar.com', headers
1026
+ end
1027
+ end
1028
+
1029
+ context "with a failure response" do
1030
+ it 'should raise the error but not crash the actor' do
1031
+ error = Punchblock::ProtocolError.new.setup(:service_unavailable)
1032
+ expect_message_waiting_for_response Punchblock::Command::Redirect.new(to: 'sip:foo@bar.com'), error
1033
+ expect { subject.redirect 'sip:foo@bar.com' }.to raise_error error
1034
+ sleep 0.2
1035
+ expect(subject.alive?).to be true
1036
+ end
1037
+ end
877
1038
  end
878
1039
 
879
1040
  describe "#hangup" do
880
1041
  describe "if the call is not active" do
881
1042
  before do
882
- subject.wrapped_object.should_receive(:active?).and_return false
1043
+ expect(subject.wrapped_object).to receive(:active?).and_return false
883
1044
  end
884
1045
 
885
1046
  it "should do nothing and return false" do
886
- subject.should_receive(:write_and_await_response).never
887
- subject.hangup.should be false
1047
+ expect(subject).to receive(:write_and_await_response).never
1048
+ expect(subject.hangup).to be false
888
1049
  end
889
1050
  end
890
1051
 
@@ -892,7 +1053,7 @@ module Adhearsion
892
1053
  it "should mark the call inactive" do
893
1054
  expect_message_waiting_for_response Punchblock::Command::Hangup.new
894
1055
  subject.hangup
895
- subject.should_not be_active
1056
+ expect(subject).not_to be_active
896
1057
  end
897
1058
 
898
1059
  describe "with no headers" do
@@ -910,6 +1071,16 @@ module Adhearsion
910
1071
  end
911
1072
  end
912
1073
  end
1074
+
1075
+ context "with a failure response" do
1076
+ it 'should raise the error but not crash the actor' do
1077
+ error = Punchblock::ProtocolError.new.setup(:service_unavailable)
1078
+ expect_message_waiting_for_response Punchblock::Command::Hangup.new, error
1079
+ expect { subject.hangup }.to raise_error error
1080
+ sleep 0.2
1081
+ expect(subject.alive?).to be true
1082
+ end
1083
+ end
913
1084
  end
914
1085
 
915
1086
  describe "#join" do
@@ -925,7 +1096,7 @@ module Adhearsion
925
1096
  let(:uri) { "footransport:#{call_id}@#{domain}" }
926
1097
  let(:target) { described_class.new }
927
1098
 
928
- before { target.wrapped_object.stub uri: uri }
1099
+ before { allow(target.wrapped_object).to receive_messages uri: uri }
929
1100
 
930
1101
  it "should send a join command joining to the provided call ID" do
931
1102
  expect_join_with_options call_uri: uri
@@ -942,45 +1113,45 @@ module Adhearsion
942
1113
  it "should return the command" do
943
1114
  expect_join_with_options :call_id => uri, :media => :bridge, :direction => :recv
944
1115
  result = subject.join target, :media => :bridge, :direction => :recv
945
- result[:command].should be_a Punchblock::Command::Join
946
- result[:command].call_uri.should eql(uri)
947
- result[:command].media.should eql(:bridge)
948
- result[:command].direction.should eql(:recv)
1116
+ expect(result[:command]).to be_a Punchblock::Command::Join
1117
+ expect(result[:command].call_uri).to eql(uri)
1118
+ expect(result[:command].media).to eql(:bridge)
1119
+ expect(result[:command].direction).to eql(:recv)
949
1120
  end
950
1121
 
951
1122
  it "should return something that can be blocked on until the join is complete" do
952
1123
  expect_join_with_options :call_id => uri, :media => :bridge, :direction => :recv
953
1124
  result = subject.join target, :media => :bridge, :direction => :recv
954
1125
 
955
- result[:joined_condition].wait(0.5).should be_false
1126
+ expect(result[:joined_condition].wait(0.5)).to be_falsey
956
1127
 
957
1128
  subject << Punchblock::Event::Joined.new(call_uri: uri)
958
- result[:joined_condition].wait(0.5).should be_true
1129
+ expect(result[:joined_condition].wait(0.5)).to be_truthy
959
1130
  end
960
1131
 
961
1132
  it "should return something that can be blocked on until the entities are unjoined" do
962
1133
  expect_join_with_options :call_id => uri, :media => :bridge, :direction => :recv
963
1134
  result = subject.join target, :media => :bridge, :direction => :recv
964
1135
 
965
- result[:unjoined_condition].wait(0.5).should be_false
1136
+ expect(result[:unjoined_condition].wait(0.5)).to be_falsey
966
1137
 
967
1138
  subject << Punchblock::Event::Joined.new(call_uri: uri)
968
- result[:unjoined_condition].wait(0.5).should be_false
1139
+ expect(result[:unjoined_condition].wait(0.5)).to be_falsey
969
1140
 
970
1141
  subject << Punchblock::Event::Unjoined.new(call_uri: uri)
971
- result[:unjoined_condition].wait(0.5).should be_true
1142
+ expect(result[:unjoined_condition].wait(0.5)).to be_truthy
972
1143
  end
973
1144
 
974
1145
  it "should unblock all conditions on call end if no joined/unjoined events are received" do
975
1146
  expect_join_with_options :call_id => uri, :media => :bridge, :direction => :recv
976
1147
  result = subject.join target, :media => :bridge, :direction => :recv
977
1148
 
978
- result[:joined_condition].wait(0.5).should be_false
979
- result[:unjoined_condition].wait(0.5).should be_false
1149
+ expect(result[:joined_condition].wait(0.5)).to be_falsey
1150
+ expect(result[:unjoined_condition].wait(0.5)).to be_falsey
980
1151
 
981
1152
  subject << Punchblock::Event::End.new
982
- result[:joined_condition].wait(0.5).should be_true
983
- result[:unjoined_condition].wait(0.5).should be_true
1153
+ expect(result[:joined_condition].wait(0.5)).to be_truthy
1154
+ expect(result[:unjoined_condition].wait(0.5)).to be_truthy
984
1155
  end
985
1156
 
986
1157
  it "should not error on call end when joined/unjoined events are received correctly" do
@@ -1000,7 +1171,7 @@ module Adhearsion
1000
1171
  subject << Punchblock::Event::Joined.new(call_uri: uri)
1001
1172
  subject << Punchblock::Event::Joined.new(call_uri: uri)
1002
1173
 
1003
- subject.should be_alive
1174
+ expect(subject).to be_alive
1004
1175
  end
1005
1176
  end
1006
1177
 
@@ -1023,45 +1194,45 @@ module Adhearsion
1023
1194
  it "should return the command" do
1024
1195
  expect_join_with_options :call_id => uri, :media => :bridge, :direction => :recv
1025
1196
  result = subject.join target, :media => :bridge, :direction => :recv
1026
- result[:command].should be_a Punchblock::Command::Join
1027
- result[:command].call_uri.should eql(uri)
1028
- result[:command].media.should eql(:bridge)
1029
- result[:command].direction.should eql(:recv)
1197
+ expect(result[:command]).to be_a Punchblock::Command::Join
1198
+ expect(result[:command].call_uri).to eql(uri)
1199
+ expect(result[:command].media).to eql(:bridge)
1200
+ expect(result[:command].direction).to eql(:recv)
1030
1201
  end
1031
1202
 
1032
1203
  it "should return something that can be blocked on until the join is complete" do
1033
1204
  expect_join_with_options :call_id => uri, :media => :bridge, :direction => :recv
1034
1205
  result = subject.join target, :media => :bridge, :direction => :recv
1035
1206
 
1036
- result[:joined_condition].wait(0.5).should be_false
1207
+ expect(result[:joined_condition].wait(0.5)).to be_falsey
1037
1208
 
1038
1209
  subject << Punchblock::Event::Joined.new(call_uri: uri)
1039
- result[:joined_condition].wait(0.5).should be_true
1210
+ expect(result[:joined_condition].wait(0.5)).to be_truthy
1040
1211
  end
1041
1212
 
1042
1213
  it "should return something that can be blocked on until the entities are unjoined" do
1043
1214
  expect_join_with_options :call_id => uri, :media => :bridge, :direction => :recv
1044
1215
  result = subject.join target, :media => :bridge, :direction => :recv
1045
1216
 
1046
- result[:unjoined_condition].wait(0.5).should be_false
1217
+ expect(result[:unjoined_condition].wait(0.5)).to be_falsey
1047
1218
 
1048
1219
  subject << Punchblock::Event::Joined.new(call_uri: uri)
1049
- result[:unjoined_condition].wait(0.5).should be_false
1220
+ expect(result[:unjoined_condition].wait(0.5)).to be_falsey
1050
1221
 
1051
1222
  subject << Punchblock::Event::Unjoined.new(call_uri: uri)
1052
- result[:unjoined_condition].wait(0.5).should be_true
1223
+ expect(result[:unjoined_condition].wait(0.5)).to be_truthy
1053
1224
  end
1054
1225
 
1055
1226
  it "should unblock all conditions on call end if no joined/unjoined events are received" do
1056
1227
  expect_join_with_options :call_id => uri, :media => :bridge, :direction => :recv
1057
1228
  result = subject.join target, :media => :bridge, :direction => :recv
1058
1229
 
1059
- result[:joined_condition].wait(0.5).should be_false
1060
- result[:unjoined_condition].wait(0.5).should be_false
1230
+ expect(result[:joined_condition].wait(0.5)).to be_falsey
1231
+ expect(result[:unjoined_condition].wait(0.5)).to be_falsey
1061
1232
 
1062
1233
  subject << Punchblock::Event::End.new
1063
- result[:joined_condition].wait(0.5).should be_true
1064
- result[:unjoined_condition].wait(0.5).should be_true
1234
+ expect(result[:joined_condition].wait(0.5)).to be_truthy
1235
+ expect(result[:unjoined_condition].wait(0.5)).to be_truthy
1065
1236
  end
1066
1237
 
1067
1238
  it "should not error on call end when joined/unjoined events are received correctly" do
@@ -1081,7 +1252,7 @@ module Adhearsion
1081
1252
  subject << Punchblock::Event::Joined.new(call_uri: uri)
1082
1253
  subject << Punchblock::Event::Joined.new(call_uri: uri)
1083
1254
 
1084
- subject.should be_alive
1255
+ expect(subject).to be_alive
1085
1256
  end
1086
1257
  end
1087
1258
 
@@ -1105,45 +1276,45 @@ module Adhearsion
1105
1276
  it "should return the command" do
1106
1277
  expect_join_with_options :call_id => uri, :media => :bridge, :direction => :recv
1107
1278
  result = subject.join target.merge({:media => :bridge, :direction => :recv})
1108
- result[:command].should be_a Punchblock::Command::Join
1109
- result[:command].call_uri.should eql(uri)
1110
- result[:command].media.should eql(:bridge)
1111
- result[:command].direction.should eql(:recv)
1279
+ expect(result[:command]).to be_a Punchblock::Command::Join
1280
+ expect(result[:command].call_uri).to eql(uri)
1281
+ expect(result[:command].media).to eql(:bridge)
1282
+ expect(result[:command].direction).to eql(:recv)
1112
1283
  end
1113
1284
 
1114
1285
  it "should return something that can be blocked on until the join is complete" do
1115
1286
  expect_join_with_options :call_id => uri, :media => :bridge, :direction => :recv
1116
1287
  result = subject.join target.merge({:media => :bridge, :direction => :recv})
1117
1288
 
1118
- result[:joined_condition].wait(0.5).should be_false
1289
+ expect(result[:joined_condition].wait(0.5)).to be_falsey
1119
1290
 
1120
1291
  subject << Punchblock::Event::Joined.new(call_uri: uri)
1121
- result[:joined_condition].wait(0.5).should be_true
1292
+ expect(result[:joined_condition].wait(0.5)).to be_truthy
1122
1293
  end
1123
1294
 
1124
1295
  it "should return something that can be blocked on until the entities are unjoined" do
1125
1296
  expect_join_with_options :call_id => uri, :media => :bridge, :direction => :recv
1126
1297
  result = subject.join target.merge({:media => :bridge, :direction => :recv})
1127
1298
 
1128
- result[:unjoined_condition].wait(0.5).should be_false
1299
+ expect(result[:unjoined_condition].wait(0.5)).to be_falsey
1129
1300
 
1130
1301
  subject << Punchblock::Event::Joined.new(call_uri: uri)
1131
- result[:unjoined_condition].wait(0.5).should be_false
1302
+ expect(result[:unjoined_condition].wait(0.5)).to be_falsey
1132
1303
 
1133
1304
  subject << Punchblock::Event::Unjoined.new(call_uri: uri)
1134
- result[:unjoined_condition].wait(0.5).should be_true
1305
+ expect(result[:unjoined_condition].wait(0.5)).to be_truthy
1135
1306
  end
1136
1307
 
1137
1308
  it "should unblock all conditions on call end if no joined/unjoined events are received" do
1138
1309
  expect_join_with_options :call_id => uri, :media => :bridge, :direction => :recv
1139
1310
  result = subject.join target.merge({:media => :bridge, :direction => :recv})
1140
1311
 
1141
- result[:joined_condition].wait(0.5).should be_false
1142
- result[:unjoined_condition].wait(0.5).should be_false
1312
+ expect(result[:joined_condition].wait(0.5)).to be_falsey
1313
+ expect(result[:unjoined_condition].wait(0.5)).to be_falsey
1143
1314
 
1144
1315
  subject << Punchblock::Event::End.new
1145
- result[:joined_condition].wait(0.5).should be_true
1146
- result[:unjoined_condition].wait(0.5).should be_true
1316
+ expect(result[:joined_condition].wait(0.5)).to be_truthy
1317
+ expect(result[:unjoined_condition].wait(0.5)).to be_truthy
1147
1318
  end
1148
1319
 
1149
1320
  it "should not error on call end when joined/unjoined events are received correctly" do
@@ -1163,7 +1334,7 @@ module Adhearsion
1163
1334
  subject << Punchblock::Event::Joined.new(call_uri: uri)
1164
1335
  subject << Punchblock::Event::Joined.new(call_uri: uri)
1165
1336
 
1166
- subject.should be_alive
1337
+ expect(subject).to be_alive
1167
1338
  end
1168
1339
  end
1169
1340
 
@@ -1186,45 +1357,45 @@ module Adhearsion
1186
1357
  it "should return the command" do
1187
1358
  expect_join_with_options :mixer_name => mixer_name, :media => :bridge, :direction => :recv
1188
1359
  result = subject.join target.merge({:media => :bridge, :direction => :recv})
1189
- result[:command].should be_a Punchblock::Command::Join
1190
- result[:command].mixer_name.should eql(mixer_name)
1191
- result[:command].media.should eql(:bridge)
1192
- result[:command].direction.should eql(:recv)
1360
+ expect(result[:command]).to be_a Punchblock::Command::Join
1361
+ expect(result[:command].mixer_name).to eql(mixer_name)
1362
+ expect(result[:command].media).to eql(:bridge)
1363
+ expect(result[:command].direction).to eql(:recv)
1193
1364
  end
1194
1365
 
1195
1366
  it "should return something that can be blocked on until the join is complete" do
1196
1367
  expect_join_with_options :mixer_name => mixer_name, :media => :bridge, :direction => :recv
1197
1368
  result = subject.join target.merge({:media => :bridge, :direction => :recv})
1198
1369
 
1199
- result[:joined_condition].wait(0.5).should be_false
1370
+ expect(result[:joined_condition].wait(0.5)).to be_falsey
1200
1371
 
1201
1372
  subject << Punchblock::Event::Joined.new(mixer_name: mixer_name)
1202
- result[:joined_condition].wait(0.5).should be_true
1373
+ expect(result[:joined_condition].wait(0.5)).to be_truthy
1203
1374
  end
1204
1375
 
1205
1376
  it "should return something that can be blocked on until the entities are unjoined" do
1206
1377
  expect_join_with_options :mixer_name => mixer_name, :media => :bridge, :direction => :recv
1207
1378
  result = subject.join target.merge({:media => :bridge, :direction => :recv})
1208
1379
 
1209
- result[:unjoined_condition].wait(0.5).should be_false
1380
+ expect(result[:unjoined_condition].wait(0.5)).to be_falsey
1210
1381
 
1211
1382
  subject << Punchblock::Event::Joined.new(mixer_name: mixer_name)
1212
- result[:unjoined_condition].wait(0.5).should be_false
1383
+ expect(result[:unjoined_condition].wait(0.5)).to be_falsey
1213
1384
 
1214
1385
  subject << Punchblock::Event::Unjoined.new(mixer_name: mixer_name)
1215
- result[:unjoined_condition].wait(0.5).should be_true
1386
+ expect(result[:unjoined_condition].wait(0.5)).to be_truthy
1216
1387
  end
1217
1388
 
1218
1389
  it "should unblock all conditions on call end if no joined/unjoined events are received" do
1219
1390
  expect_join_with_options :mixer_name => mixer_name, :media => :bridge, :direction => :recv
1220
1391
  result = subject.join target.merge({:media => :bridge, :direction => :recv})
1221
1392
 
1222
- result[:joined_condition].wait(0.5).should be_false
1223
- result[:unjoined_condition].wait(0.5).should be_false
1393
+ expect(result[:joined_condition].wait(0.5)).to be_falsey
1394
+ expect(result[:unjoined_condition].wait(0.5)).to be_falsey
1224
1395
 
1225
1396
  subject << Punchblock::Event::End.new
1226
- result[:joined_condition].wait(0.5).should be_true
1227
- result[:unjoined_condition].wait(0.5).should be_true
1397
+ expect(result[:joined_condition].wait(0.5)).to be_truthy
1398
+ expect(result[:unjoined_condition].wait(0.5)).to be_truthy
1228
1399
  end
1229
1400
 
1230
1401
  it "should not error on call end when joined/unjoined events are received correctly" do
@@ -1244,7 +1415,7 @@ module Adhearsion
1244
1415
  subject << Punchblock::Event::Joined.new(mixer_name: mixer_name)
1245
1416
  subject << Punchblock::Event::Joined.new(mixer_name: mixer_name)
1246
1417
 
1247
- subject.should be_alive
1418
+ expect(subject).to be_alive
1248
1419
  end
1249
1420
  end
1250
1421
 
@@ -1254,7 +1425,17 @@ module Adhearsion
1254
1425
  let(:target) { { :call_uri => call_id, :mixer_name => mixer_name } }
1255
1426
 
1256
1427
  it "should raise an ArgumentError" do
1257
- lambda { subject.join target }.should raise_error ArgumentError, /call URI and mixer name/
1428
+ expect { subject.join target }.to raise_error ArgumentError, /call URI and mixer name/
1429
+ end
1430
+ end
1431
+
1432
+ context "with a failure response" do
1433
+ it 'should raise the error but not crash the actor' do
1434
+ error = Punchblock::ProtocolError.new.setup(:service_unavailable)
1435
+ expect_message_waiting_for_response Punchblock::Command::Join.new(call_id: 'footransport:foo@rayo.net'), error
1436
+ expect { subject.join 'foo' }.to raise_error error
1437
+ sleep 0.2
1438
+ expect(subject.alive?).to be true
1258
1439
  end
1259
1440
  end
1260
1441
  end
@@ -1266,13 +1447,20 @@ module Adhearsion
1266
1447
  end
1267
1448
  end
1268
1449
 
1450
+ context "without a target" do
1451
+ it "should send an unjoin command unjoining from every existing join" do
1452
+ expect_unjoin_with_options nil
1453
+ subject.unjoin
1454
+ end
1455
+ end
1456
+
1269
1457
  context "with a call" do
1270
1458
  let(:call_id) { rand.to_s }
1271
1459
  let(:domain) { 'rayo.net' }
1272
1460
  let(:uri) { "footransport:#{call_id}@#{domain}" }
1273
1461
  let(:target) { described_class.new }
1274
1462
 
1275
- before { target.wrapped_object.stub uri: uri }
1463
+ before { allow(target.wrapped_object).to receive_messages uri: uri }
1276
1464
 
1277
1465
  it "should send an unjoin command unjoining from the provided call ID" do
1278
1466
  expect_unjoin_with_options call_uri: "footransport:#{call_id}@#{domain}"
@@ -1315,7 +1503,17 @@ module Adhearsion
1315
1503
  let(:target) { { call_uri: call_id, mixer_name: mixer_name } }
1316
1504
 
1317
1505
  it "should raise an ArgumentError" do
1318
- lambda { subject.unjoin target }.should raise_error ArgumentError, /call URI and mixer name/
1506
+ expect { subject.unjoin target }.to raise_error ArgumentError, /call URI and mixer name/
1507
+ end
1508
+ end
1509
+
1510
+ context "with a failure response" do
1511
+ it 'should raise the error but not crash the actor' do
1512
+ error = Punchblock::ProtocolError.new.setup(:service_unavailable)
1513
+ expect_message_waiting_for_response Punchblock::Command::Unjoin.new(call_id: 'footransport:foo@rayo.net'), error
1514
+ expect { subject.unjoin 'foo' }.to raise_error error
1515
+ sleep 0.2
1516
+ expect(subject.alive?).to be true
1319
1517
  end
1320
1518
  end
1321
1519
  end
@@ -1325,6 +1523,16 @@ module Adhearsion
1325
1523
  expect_message_waiting_for_response Punchblock::Command::Mute.new
1326
1524
  subject.mute
1327
1525
  end
1526
+
1527
+ context "with a failure response" do
1528
+ it 'should raise the error but not crash the actor' do
1529
+ error = Punchblock::ProtocolError.new.setup(:service_unavailable)
1530
+ expect_message_waiting_for_response Punchblock::Command::Mute.new, error
1531
+ expect { subject.mute }.to raise_error error
1532
+ sleep 0.2
1533
+ expect(subject.alive?).to be true
1534
+ end
1535
+ end
1328
1536
  end
1329
1537
 
1330
1538
  describe "#unmute" do
@@ -1332,6 +1540,16 @@ module Adhearsion
1332
1540
  expect_message_waiting_for_response Punchblock::Command::Unmute.new
1333
1541
  subject.unmute
1334
1542
  end
1543
+
1544
+ context "with a failure response" do
1545
+ it 'should raise the error but not crash the actor' do
1546
+ error = Punchblock::ProtocolError.new.setup(:service_unavailable)
1547
+ expect_message_waiting_for_response Punchblock::Command::Unmute.new, error
1548
+ expect { subject.unmute }.to raise_error error
1549
+ sleep 0.2
1550
+ expect(subject.alive?).to be true
1551
+ end
1552
+ end
1335
1553
  end
1336
1554
 
1337
1555
  describe "#execute_controller" do
@@ -1339,52 +1557,59 @@ module Adhearsion
1339
1557
  let(:mock_controller) { CallController.new(subject) }
1340
1558
 
1341
1559
  before do
1342
- subject.wrapped_object.stub :write_and_await_response => true
1560
+ allow(subject.wrapped_object).to receive_messages :write_and_await_response => true
1343
1561
  end
1344
1562
 
1345
1563
  it "should call #bg_exec on the controller instance" do
1346
- mock_controller.should_receive(:exec).once
1564
+ expect(mock_controller).to receive(:exec).once
1347
1565
  subject.execute_controller mock_controller, lambda { |call| latch.countdown! }
1348
- latch.wait(3).should be_true
1566
+ expect(latch.wait(3)).to be_truthy
1349
1567
  end
1350
1568
 
1351
1569
  it "should use the passed block as a controller if none is specified" do
1352
- mock_controller.should_receive(:exec).once
1353
- CallController.should_receive(:new).once.and_return mock_controller
1570
+ expect(mock_controller).to receive(:exec).once
1571
+ expect(CallController).to receive(:new).once.and_return mock_controller
1354
1572
  subject.execute_controller nil, lambda { |call| latch.countdown! } do
1355
1573
  foo
1356
1574
  end
1357
- latch.wait(3).should be_true
1575
+ expect(latch.wait(3)).to be_truthy
1358
1576
  end
1359
1577
 
1360
1578
  it "should raise ArgumentError if both a controller and a block are passed" do
1361
- lambda { subject.execute_controller(mock_controller) { foo } }.should raise_error(ArgumentError)
1579
+ expect { subject.execute_controller(mock_controller) { foo } }.to raise_error(ArgumentError)
1362
1580
  end
1363
1581
 
1364
1582
  it "should pass the exception to the events system" do
1365
1583
  latch = CountDownLatch.new 1
1366
1584
  Adhearsion::Events.exception do |e, l|
1367
- e.should be_a RuntimeError
1368
- l.should be subject.logger
1585
+ expect(e).to be_a RuntimeError
1586
+ expect(l).to be subject.logger
1369
1587
  latch.countdown!
1370
1588
  end
1371
1589
  subject.execute_controller BrokenController.new(subject), lambda { |call| latch.countdown! }
1372
- latch.wait(3).should be true
1590
+ expect(latch.wait(3)).to be true
1373
1591
  Adhearsion::Events.clear_handlers :exception
1374
1592
  end
1375
1593
 
1376
1594
  it "should execute a callback after the controller executes" do
1377
1595
  foo = nil
1378
1596
  subject.execute_controller mock_controller, lambda { |call| foo = call; latch.countdown! }
1379
- latch.wait(3).should be_true
1380
- foo.should be subject
1597
+ expect(latch.wait(3)).to be_truthy
1598
+ expect(foo).to be subject
1599
+ end
1600
+
1601
+ it "should prevent exceptions in controllers from being raised" do
1602
+ expect(mock_controller).to receive(:run).once.ordered.and_raise StandardError
1603
+ expect { subject.execute_controller mock_controller, lambda { |call| latch.countdown! } }.to_not raise_error
1604
+ expect(latch.wait(3)).to be_truthy
1605
+ expect(subject.alive?).to be true
1381
1606
  end
1382
1607
  end
1383
1608
 
1384
1609
  describe "#register_controller" do
1385
1610
  it "should add the controller to a list on the call" do
1386
1611
  subject.register_controller :foo
1387
- subject.controllers.should include :foo
1612
+ expect(subject.controllers).to include :foo
1388
1613
  end
1389
1614
  end
1390
1615
 
@@ -1396,8 +1621,8 @@ module Adhearsion
1396
1621
 
1397
1622
  describe "#pause_controllers" do
1398
1623
  it "should pause each of the registered controllers" do
1399
- controller1.should_receive(:pause!).once
1400
- controller2.should_receive(:pause!).once
1624
+ expect(controller1).to receive(:pause!).once
1625
+ expect(controller2).to receive(:pause!).once
1401
1626
 
1402
1627
  subject.pause_controllers
1403
1628
  end
@@ -1405,8 +1630,8 @@ module Adhearsion
1405
1630
 
1406
1631
  describe "#resume_controllers" do
1407
1632
  it "should resume each of the registered controllers" do
1408
- controller1.should_receive(:resume!).once
1409
- controller2.should_receive(:resume!).once
1633
+ expect(controller1).to receive(:resume!).once
1634
+ expect(controller2).to receive(:resume!).once
1410
1635
 
1411
1636
  subject.resume_controllers
1412
1637
  end
@@ -1417,7 +1642,7 @@ module Adhearsion
1417
1642
  it "should delete its logger" do
1418
1643
  logger = subject.logger
1419
1644
  subject.terminate
1420
- ::Logging::Repository.instance[logger.name].should be_nil
1645
+ expect(::Logging::Repository.instance[logger.name]).to be_nil
1421
1646
  end
1422
1647
  end
1423
1648
  end
@@ -1425,21 +1650,21 @@ module Adhearsion
1425
1650
  describe Call::CommandRegistry do
1426
1651
  subject { Call::CommandRegistry.new }
1427
1652
 
1428
- it { should be_empty }
1653
+ it { is_expected.to be_empty }
1429
1654
 
1430
1655
  describe "#<<" do
1431
1656
  it "should add a command to the registry" do
1432
1657
  subject << :foo
1433
- subject.should_not be_empty
1658
+ expect(subject).not_to be_empty
1434
1659
  end
1435
1660
  end
1436
1661
 
1437
1662
  describe "#delete" do
1438
1663
  it "should remove a command from the registry" do
1439
1664
  subject << :foo
1440
- subject.should_not be_empty
1665
+ expect(subject).not_to be_empty
1441
1666
  subject.delete :foo
1442
- subject.should be_empty
1667
+ expect(subject).to be_empty
1443
1668
  end
1444
1669
  end
1445
1670
 
@@ -1462,9 +1687,9 @@ module Adhearsion
1462
1687
  end
1463
1688
  subject.terminate
1464
1689
  commands.each do |command|
1465
- command.response.should be_a Call::Hangup
1690
+ expect(command.response).to be_a Call::Hangup
1466
1691
  end
1467
- finished_command.response.should be == :foo
1692
+ expect(finished_command.response).to eq(:foo)
1468
1693
  end
1469
1694
  end
1470
1695
  end