punchblock 0.9.2 → 0.10.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.
- data/.gitignore +1 -0
- data/CHANGELOG.md +34 -21
- data/Rakefile +20 -0
- data/lib/punchblock/client/component_registry.rb +2 -0
- data/lib/punchblock/client.rb +2 -2
- data/lib/punchblock/command/accept.rb +2 -0
- data/lib/punchblock/command/answer.rb +2 -0
- data/lib/punchblock/command/dial.rb +2 -0
- data/lib/punchblock/command/hangup.rb +2 -0
- data/lib/punchblock/command/join.rb +2 -0
- data/lib/punchblock/command/mute.rb +2 -0
- data/lib/punchblock/command/redirect.rb +2 -0
- data/lib/punchblock/command/reject.rb +3 -1
- data/lib/punchblock/command/unjoin.rb +2 -0
- data/lib/punchblock/command/unmute.rb +2 -0
- data/lib/punchblock/command.rb +2 -0
- data/lib/punchblock/command_node.rb +2 -0
- data/lib/punchblock/component/asterisk/agi/command.rb +4 -2
- data/lib/punchblock/component/asterisk/agi.rb +2 -0
- data/lib/punchblock/component/asterisk/ami/action.rb +4 -2
- data/lib/punchblock/component/asterisk/ami.rb +2 -0
- data/lib/punchblock/component/asterisk.rb +2 -0
- data/lib/punchblock/component/component_node.rb +2 -0
- data/lib/punchblock/component/input.rb +2 -0
- data/lib/punchblock/component/output.rb +2 -0
- data/lib/punchblock/component/record.rb +2 -0
- data/lib/punchblock/component/stop.rb +2 -0
- data/lib/punchblock/component.rb +2 -0
- data/lib/punchblock/connection/asterisk.rb +4 -1
- data/lib/punchblock/connection/connected.rb +2 -0
- data/lib/punchblock/connection/generic_connection.rb +5 -0
- data/lib/punchblock/connection/xmpp.rb +5 -6
- data/lib/punchblock/connection.rb +2 -0
- data/lib/punchblock/core_ext/blather/stanza/presence.rb +2 -0
- data/lib/punchblock/core_ext/blather/stanza.rb +2 -0
- data/lib/punchblock/core_ext/ruby.rb +1 -12
- data/lib/punchblock/disconnected_error.rb +2 -0
- data/lib/punchblock/event/answered.rb +2 -0
- data/lib/punchblock/event/asterisk/ami/event.rb +3 -1
- data/lib/punchblock/event/asterisk/ami.rb +2 -0
- data/lib/punchblock/event/asterisk.rb +2 -0
- data/lib/punchblock/event/complete.rb +3 -1
- data/lib/punchblock/event/dtmf.rb +2 -0
- data/lib/punchblock/event/end.rb +2 -0
- data/lib/punchblock/event/joined.rb +2 -0
- data/lib/punchblock/event/offer.rb +6 -0
- data/lib/punchblock/event/ringing.rb +2 -0
- data/lib/punchblock/event/unjoined.rb +2 -0
- data/lib/punchblock/event.rb +2 -0
- data/lib/punchblock/has_headers.rb +3 -1
- data/lib/punchblock/header.rb +2 -0
- data/lib/punchblock/key_value_pair_node.rb +2 -0
- data/lib/punchblock/media_container.rb +2 -0
- data/lib/punchblock/media_node.rb +2 -0
- data/lib/punchblock/protocol_error.rb +2 -0
- data/lib/punchblock/rayo_node.rb +4 -3
- data/lib/punchblock/ref.rb +2 -0
- data/lib/punchblock/translator/asterisk/call.rb +80 -26
- data/lib/punchblock/translator/asterisk/component/asterisk/agi_command.rb +3 -1
- data/lib/punchblock/translator/asterisk/component/asterisk/ami_action.rb +3 -1
- data/lib/punchblock/translator/asterisk/component/asterisk.rb +2 -0
- data/lib/punchblock/translator/asterisk/component/input.rb +4 -2
- data/lib/punchblock/translator/asterisk/component/output.rb +21 -3
- data/lib/punchblock/translator/asterisk/component.rb +2 -0
- data/lib/punchblock/translator/asterisk.rb +50 -20
- data/lib/punchblock/translator.rb +2 -0
- data/lib/punchblock/version.rb +3 -1
- data/lib/punchblock.rb +2 -0
- data/punchblock.gemspec +2 -2
- data/spec/capture_warnings.rb +32 -0
- data/spec/punchblock/client/component_registry_spec.rb +2 -0
- data/spec/punchblock/client_spec.rb +3 -1
- data/spec/punchblock/command/accept_spec.rb +3 -1
- data/spec/punchblock/command/answer_spec.rb +3 -1
- data/spec/punchblock/command/dial_spec.rb +12 -10
- data/spec/punchblock/command/hangup_spec.rb +3 -1
- data/spec/punchblock/command/join_spec.rb +11 -9
- data/spec/punchblock/command/mute_spec.rb +3 -1
- data/spec/punchblock/command/redirect_spec.rb +5 -3
- data/spec/punchblock/command/reject_spec.rb +7 -5
- data/spec/punchblock/command/unjoin_spec.rb +7 -5
- data/spec/punchblock/command/unmute_spec.rb +3 -1
- data/spec/punchblock/command_node_spec.rb +9 -7
- data/spec/punchblock/component/asterisk/agi/command_spec.rb +21 -19
- data/spec/punchblock/component/asterisk/ami/action_spec.rb +19 -17
- data/spec/punchblock/component/component_node_spec.rb +5 -3
- data/spec/punchblock/component/input_spec.rb +51 -49
- data/spec/punchblock/component/output_spec.rb +60 -58
- data/spec/punchblock/component/record_spec.rb +36 -34
- data/spec/punchblock/connection/asterisk_spec.rb +9 -4
- data/spec/punchblock/connection/xmpp_spec.rb +40 -39
- data/spec/punchblock/event/answered_spec.rb +4 -2
- data/spec/punchblock/event/asterisk/ami/event_spec.rb +9 -7
- data/spec/punchblock/event/complete_spec.rb +12 -10
- data/spec/punchblock/event/dtmf_spec.rb +6 -4
- data/spec/punchblock/event/end_spec.rb +6 -4
- data/spec/punchblock/event/joined_spec.rb +8 -6
- data/spec/punchblock/event/offer_spec.rb +7 -5
- data/spec/punchblock/event/ringing_spec.rb +4 -2
- data/spec/punchblock/event/unjoined_spec.rb +8 -6
- data/spec/punchblock/header_spec.rb +13 -11
- data/spec/punchblock/protocol_error_spec.rb +8 -6
- data/spec/punchblock/ref_spec.rb +5 -3
- data/spec/punchblock/translator/asterisk/call_spec.rb +261 -14
- data/spec/punchblock/translator/asterisk/component/asterisk/agi_command_spec.rb +13 -11
- data/spec/punchblock/translator/asterisk/component/asterisk/ami_action_spec.rb +4 -2
- data/spec/punchblock/translator/asterisk/component/input_spec.rb +10 -8
- data/spec/punchblock/translator/asterisk/component/output_spec.rb +111 -20
- data/spec/punchblock/translator/asterisk/component_spec.rb +3 -1
- data/spec/punchblock/translator/asterisk_spec.rb +107 -10
- data/spec/spec_helper.rb +23 -17
- data/spec/support/mock_connection_with_event_handler.rb +2 -0
- metadata +43 -41
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
1
3
|
require 'spec_helper'
|
|
2
4
|
|
|
3
5
|
module Punchblock
|
|
@@ -8,32 +10,32 @@ module Punchblock
|
|
|
8
10
|
let(:component_id) { 'abc123' }
|
|
9
11
|
subject { ProtocolError.new name, text, call_id, component_id }
|
|
10
12
|
|
|
11
|
-
its(:inspect) { should == '#<Punchblock::ProtocolError: name=:item_not_found text="Could not find call [id=f6d437f4-1e18-457b-99f8-b5d853f50347]" call_id="f6d437f4-1e18-457b-99f8-b5d853f50347" component_id="abc123">' }
|
|
13
|
+
its(:inspect) { should be == '#<Punchblock::ProtocolError: name=:item_not_found text="Could not find call [id=f6d437f4-1e18-457b-99f8-b5d853f50347]" call_id="f6d437f4-1e18-457b-99f8-b5d853f50347" component_id="abc123">' }
|
|
12
14
|
|
|
13
15
|
describe "comparison" do
|
|
14
16
|
context "with the same name, text, call ID and component ID" do
|
|
15
17
|
let(:comparison) { ProtocolError.new name, text, call_id, component_id }
|
|
16
|
-
it { should == comparison }
|
|
18
|
+
it { should be == comparison }
|
|
17
19
|
end
|
|
18
20
|
|
|
19
21
|
context "with a different name" do
|
|
20
22
|
let(:comparison) { ProtocolError.new :foo, text, call_id, component_id }
|
|
21
|
-
it { should_not == comparison }
|
|
23
|
+
it { should_not be == comparison }
|
|
22
24
|
end
|
|
23
25
|
|
|
24
26
|
context "with a different text" do
|
|
25
27
|
let(:comparison) { ProtocolError.new name, 'foo', call_id, component_id }
|
|
26
|
-
it { should_not == comparison }
|
|
28
|
+
it { should_not be == comparison }
|
|
27
29
|
end
|
|
28
30
|
|
|
29
31
|
context "with a different call ID" do
|
|
30
32
|
let(:comparison) { ProtocolError.new name, text, 'foo', component_id }
|
|
31
|
-
it { should_not == comparison }
|
|
33
|
+
it { should_not be == comparison }
|
|
32
34
|
end
|
|
33
35
|
|
|
34
36
|
context "with a different component ID" do
|
|
35
37
|
let(:comparison) { ProtocolError.new name, text, call_id, 'foo' }
|
|
36
|
-
it { should_not == comparison }
|
|
38
|
+
it { should_not be == comparison }
|
|
37
39
|
end
|
|
38
40
|
end
|
|
39
41
|
end
|
data/spec/punchblock/ref_spec.rb
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
1
3
|
require 'spec_helper'
|
|
2
4
|
|
|
3
5
|
module Punchblock
|
|
4
6
|
describe Ref do
|
|
5
7
|
it 'registers itself' do
|
|
6
|
-
RayoNode.class_from_registration(:ref, 'urn:xmpp:rayo:1').should == Ref
|
|
8
|
+
RayoNode.class_from_registration(:ref, 'urn:xmpp:rayo:1').should be == Ref
|
|
7
9
|
end
|
|
8
10
|
|
|
9
11
|
describe "from a stanza" do
|
|
@@ -15,13 +17,13 @@ module Punchblock
|
|
|
15
17
|
|
|
16
18
|
it_should_behave_like 'event'
|
|
17
19
|
|
|
18
|
-
its(:id) { should == 'fgh4590' }
|
|
20
|
+
its(:id) { should be == 'fgh4590' }
|
|
19
21
|
end
|
|
20
22
|
|
|
21
23
|
describe "when setting options in initializer" do
|
|
22
24
|
subject { Ref.new :id => 'foo' }
|
|
23
25
|
|
|
24
|
-
its(:id) { should == 'foo' }
|
|
26
|
+
its(:id) { should be == 'foo' }
|
|
25
27
|
end
|
|
26
28
|
end
|
|
27
29
|
end # Punchblock
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
1
3
|
require 'spec_helper'
|
|
2
4
|
|
|
3
5
|
module Punchblock
|
|
@@ -6,7 +8,6 @@ module Punchblock
|
|
|
6
8
|
describe Call do
|
|
7
9
|
let(:channel) { 'SIP/foo' }
|
|
8
10
|
let(:translator) { stub_everything 'Translator::Asterisk' }
|
|
9
|
-
let(:env) { "agi_request%3A%20async%0Aagi_channel%3A%20SIP%2F1234-00000000%0Aagi_language%3A%20en%0Aagi_type%3A%20SIP%0Aagi_uniqueid%3A%201320835995.0%0Aagi_version%3A%201.8.4.1%0Aagi_callerid%3A%205678%0Aagi_calleridname%3A%20Jane%20Smith%0Aagi_callingpres%3A%200%0Aagi_callingani2%3A%200%0Aagi_callington%3A%200%0Aagi_callingtns%3A%200%0Aagi_dnid%3A%201000%0Aagi_rdnis%3A%20unknown%0Aagi_context%3A%20default%0Aagi_extension%3A%201000%0Aagi_priority%3A%201%0Aagi_enhanced%3A%200.0%0Aagi_accountcode%3A%20%0Aagi_threadid%3A%204366221312%0A%0A" }
|
|
10
11
|
let(:agi_env) do
|
|
11
12
|
{
|
|
12
13
|
:agi_request => 'async',
|
|
@@ -57,12 +58,12 @@ module Punchblock
|
|
|
57
58
|
}
|
|
58
59
|
end
|
|
59
60
|
|
|
60
|
-
subject { Call.new channel, translator,
|
|
61
|
+
subject { Call.new channel, translator, agi_env }
|
|
61
62
|
|
|
62
63
|
its(:id) { should be_a String }
|
|
63
|
-
its(:channel) { should == channel }
|
|
64
|
+
its(:channel) { should be == channel }
|
|
64
65
|
its(:translator) { should be translator }
|
|
65
|
-
its(:agi_env) { should == agi_env }
|
|
66
|
+
its(:agi_env) { should be == agi_env }
|
|
66
67
|
|
|
67
68
|
describe '#shutdown' do
|
|
68
69
|
it 'should terminate the actor' do
|
|
@@ -93,7 +94,7 @@ module Punchblock
|
|
|
93
94
|
|
|
94
95
|
it 'should make the call identify as inbound' do
|
|
95
96
|
subject.send_offer
|
|
96
|
-
subject.direction.should == :inbound
|
|
97
|
+
subject.direction.should be == :inbound
|
|
97
98
|
subject.inbound?.should be true
|
|
98
99
|
subject.outbound?.should be false
|
|
99
100
|
end
|
|
@@ -191,12 +192,12 @@ module Punchblock
|
|
|
191
192
|
it 'sends the call ID as a response to the Dial' do
|
|
192
193
|
subject.dial dial_command
|
|
193
194
|
dial_command.response
|
|
194
|
-
dial_command.call_id.should == subject.id
|
|
195
|
+
dial_command.call_id.should be == subject.id
|
|
195
196
|
end
|
|
196
197
|
|
|
197
198
|
it 'should make the call identify as outbound' do
|
|
198
199
|
subject.dial dial_command
|
|
199
|
-
subject.direction.should == :outbound
|
|
200
|
+
subject.direction.should be == :outbound
|
|
200
201
|
subject.outbound?.should be true
|
|
201
202
|
subject.inbound?.should be false
|
|
202
203
|
end
|
|
@@ -230,10 +231,22 @@ module Punchblock
|
|
|
230
231
|
it "should cause the actor to be terminated" do
|
|
231
232
|
translator.expects(:handle_pb_event!).once
|
|
232
233
|
subject.process_ami_event ami_event
|
|
233
|
-
sleep
|
|
234
|
+
sleep 5.5
|
|
234
235
|
subject.should_not be_alive
|
|
235
236
|
end
|
|
236
237
|
|
|
238
|
+
context "with an undefined cause" do
|
|
239
|
+
let(:cause) { '0' }
|
|
240
|
+
let(:cause_txt) { 'Undefined' }
|
|
241
|
+
|
|
242
|
+
it 'should send an end (hangup) event to the translator' do
|
|
243
|
+
expected_end_event = Punchblock::Event::End.new :reason => :hangup,
|
|
244
|
+
:call_id => subject.id
|
|
245
|
+
translator.expects(:handle_pb_event!).with expected_end_event
|
|
246
|
+
subject.process_ami_event ami_event
|
|
247
|
+
end
|
|
248
|
+
end
|
|
249
|
+
|
|
237
250
|
context "with a normal clearing cause" do
|
|
238
251
|
let(:cause) { '16' }
|
|
239
252
|
let(:cause_txt) { 'Normal Clearing' }
|
|
@@ -443,6 +456,172 @@ module Punchblock
|
|
|
443
456
|
subject.process_ami_event ami_event
|
|
444
457
|
end
|
|
445
458
|
end
|
|
459
|
+
|
|
460
|
+
context 'with a BridgeExec event' do
|
|
461
|
+
let :ami_event do
|
|
462
|
+
RubyAMI::Event.new('BridgeExec').tap do |e|
|
|
463
|
+
e['Privilege'] = "call,all"
|
|
464
|
+
e['Response'] = "Success"
|
|
465
|
+
e['Channel1'] = "SIP/foo"
|
|
466
|
+
e['Channel2'] = "SIP/5678-00000000"
|
|
467
|
+
end
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
let(:other_channel) { 'SIP/5678-00000000' }
|
|
471
|
+
let(:other_call_id) { 'def567' }
|
|
472
|
+
let :command do
|
|
473
|
+
Punchblock::Command::Join.new :other_call_id => other_call_id
|
|
474
|
+
end
|
|
475
|
+
|
|
476
|
+
before do
|
|
477
|
+
subject.pending_joins[other_channel] = command
|
|
478
|
+
command.request!
|
|
479
|
+
end
|
|
480
|
+
|
|
481
|
+
it 'retrieves and sets success on the correct Join' do
|
|
482
|
+
subject.process_ami_event ami_event
|
|
483
|
+
command.response(0.5).should be == true
|
|
484
|
+
end
|
|
485
|
+
end
|
|
486
|
+
|
|
487
|
+
context 'with a Bridge event' do
|
|
488
|
+
let(:other_channel) { 'SIP/5678-00000000' }
|
|
489
|
+
let(:other_call_id) { 'def567' }
|
|
490
|
+
let :other_call do
|
|
491
|
+
Call.new other_channel, translator
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
let :ami_event do
|
|
495
|
+
RubyAMI::Event.new('Bridge').tap do |e|
|
|
496
|
+
e['Privilege'] = "call,all"
|
|
497
|
+
e['Bridgestate'] = state
|
|
498
|
+
e['Bridgetype'] = "core"
|
|
499
|
+
e['Channel1'] = channel
|
|
500
|
+
e['Channel2'] = other_channel
|
|
501
|
+
e['Uniqueid1'] = "1319717537.11"
|
|
502
|
+
e['Uniqueid2'] = "1319717537.10"
|
|
503
|
+
e['CallerID1'] = "1234"
|
|
504
|
+
e['CallerID2'] = "5678"
|
|
505
|
+
end
|
|
506
|
+
end
|
|
507
|
+
|
|
508
|
+
let :switched_ami_event do
|
|
509
|
+
RubyAMI::Event.new('Bridge').tap do |e|
|
|
510
|
+
e['Privilege'] = "call,all"
|
|
511
|
+
e['Bridgestate'] = state
|
|
512
|
+
e['Bridgetype'] = "core"
|
|
513
|
+
e['Channel1'] = other_channel
|
|
514
|
+
e['Channel2'] = channel
|
|
515
|
+
e['Uniqueid1'] = "1319717537.11"
|
|
516
|
+
e['Uniqueid2'] = "1319717537.10"
|
|
517
|
+
e['CallerID1'] = "1234"
|
|
518
|
+
e['CallerID2'] = "5678"
|
|
519
|
+
end
|
|
520
|
+
end
|
|
521
|
+
|
|
522
|
+
before do
|
|
523
|
+
translator.register_call other_call
|
|
524
|
+
translator.expects(:call_for_channel).with(other_channel).returns(other_call)
|
|
525
|
+
other_call.expects(:id).returns other_call_id
|
|
526
|
+
end
|
|
527
|
+
|
|
528
|
+
context "of state 'Link'" do
|
|
529
|
+
let(:state) { 'Link' }
|
|
530
|
+
|
|
531
|
+
let :expected_joined do
|
|
532
|
+
Punchblock::Event::Joined.new.tap do |joined|
|
|
533
|
+
joined.call_id = subject.id
|
|
534
|
+
joined.other_call_id = other_call_id
|
|
535
|
+
end
|
|
536
|
+
end
|
|
537
|
+
|
|
538
|
+
it 'sends the Joined event when the call is the first channel' do
|
|
539
|
+
translator.expects(:handle_pb_event!).with expected_joined
|
|
540
|
+
subject.process_ami_event ami_event
|
|
541
|
+
end
|
|
542
|
+
|
|
543
|
+
it 'sends the Joined event when the call is the second channel' do
|
|
544
|
+
translator.expects(:handle_pb_event!).with expected_joined
|
|
545
|
+
subject.process_ami_event switched_ami_event
|
|
546
|
+
end
|
|
547
|
+
end
|
|
548
|
+
|
|
549
|
+
context "of state 'Unlink'" do
|
|
550
|
+
let(:state) { 'Unlink' }
|
|
551
|
+
|
|
552
|
+
let :expected_unjoined do
|
|
553
|
+
Punchblock::Event::Unjoined.new.tap do |joined|
|
|
554
|
+
joined.call_id = subject.id
|
|
555
|
+
joined.other_call_id = other_call_id
|
|
556
|
+
end
|
|
557
|
+
end
|
|
558
|
+
|
|
559
|
+
it 'sends the Unjoined event when the call is the first channel' do
|
|
560
|
+
translator.expects(:handle_pb_event!).with expected_unjoined
|
|
561
|
+
subject.process_ami_event ami_event
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
it 'sends the Unjoined event when the call is the second channel' do
|
|
565
|
+
translator.expects(:handle_pb_event!).with expected_unjoined
|
|
566
|
+
subject.process_ami_event switched_ami_event
|
|
567
|
+
end
|
|
568
|
+
end
|
|
569
|
+
end
|
|
570
|
+
|
|
571
|
+
context 'with an Unlink event' do
|
|
572
|
+
let(:other_channel) { 'SIP/5678-00000000' }
|
|
573
|
+
let(:other_call_id) { 'def567' }
|
|
574
|
+
let :other_call do
|
|
575
|
+
Call.new other_channel, translator
|
|
576
|
+
end
|
|
577
|
+
|
|
578
|
+
let :ami_event do
|
|
579
|
+
RubyAMI::Event.new('Unlink').tap do |e|
|
|
580
|
+
e['Privilege'] = "call,all"
|
|
581
|
+
e['Channel1'] = channel
|
|
582
|
+
e['Channel2'] = other_channel
|
|
583
|
+
e['Uniqueid1'] = "1319717537.11"
|
|
584
|
+
e['Uniqueid2'] = "1319717537.10"
|
|
585
|
+
e['CallerID1'] = "1234"
|
|
586
|
+
e['CallerID2'] = "5678"
|
|
587
|
+
end
|
|
588
|
+
end
|
|
589
|
+
|
|
590
|
+
let :switched_ami_event do
|
|
591
|
+
RubyAMI::Event.new('Unlink').tap do |e|
|
|
592
|
+
e['Privilege'] = "call,all"
|
|
593
|
+
e['Channel1'] = other_channel
|
|
594
|
+
e['Channel2'] = channel
|
|
595
|
+
e['Uniqueid1'] = "1319717537.11"
|
|
596
|
+
e['Uniqueid2'] = "1319717537.10"
|
|
597
|
+
e['CallerID1'] = "1234"
|
|
598
|
+
e['CallerID2'] = "5678"
|
|
599
|
+
end
|
|
600
|
+
end
|
|
601
|
+
|
|
602
|
+
before do
|
|
603
|
+
translator.register_call other_call
|
|
604
|
+
translator.expects(:call_for_channel).with(other_channel).returns(other_call)
|
|
605
|
+
other_call.expects(:id).returns other_call_id
|
|
606
|
+
end
|
|
607
|
+
|
|
608
|
+
let :expected_unjoined do
|
|
609
|
+
Punchblock::Event::Unjoined.new.tap do |joined|
|
|
610
|
+
joined.call_id = subject.id
|
|
611
|
+
joined.other_call_id = other_call_id
|
|
612
|
+
end
|
|
613
|
+
end
|
|
614
|
+
|
|
615
|
+
it 'sends the Unjoined event when the call is the first channel' do
|
|
616
|
+
translator.expects(:handle_pb_event!).with expected_unjoined
|
|
617
|
+
subject.process_ami_event ami_event
|
|
618
|
+
end
|
|
619
|
+
|
|
620
|
+
it 'sends the Unjoined event when the call is the second channel' do
|
|
621
|
+
translator.expects(:handle_pb_event!).with expected_unjoined
|
|
622
|
+
subject.process_ami_event switched_ami_event
|
|
623
|
+
end
|
|
624
|
+
end
|
|
446
625
|
end
|
|
447
626
|
|
|
448
627
|
describe '#execute_command' do
|
|
@@ -465,7 +644,7 @@ module Punchblock
|
|
|
465
644
|
component = subject.execute_command command
|
|
466
645
|
component.internal.should be_true
|
|
467
646
|
agi_command = subject.wrapped_object.instance_variable_get(:'@current_agi_command')
|
|
468
|
-
agi_command.name.should == "EXEC RINGING"
|
|
647
|
+
agi_command.name.should be == "EXEC RINGING"
|
|
469
648
|
agi_command.execute!
|
|
470
649
|
agi_command.add_event expected_agi_complete_event
|
|
471
650
|
command.response(0.5).should be true
|
|
@@ -479,7 +658,7 @@ module Punchblock
|
|
|
479
658
|
component = subject.execute_command command
|
|
480
659
|
component.internal.should be_true
|
|
481
660
|
agi_command = subject.wrapped_object.instance_variable_get(:'@current_agi_command')
|
|
482
|
-
agi_command.name.should == "EXEC ANSWER"
|
|
661
|
+
agi_command.name.should be == "EXEC ANSWER"
|
|
483
662
|
agi_command.execute!
|
|
484
663
|
agi_command.add_event expected_agi_complete_event
|
|
485
664
|
command.response(0.5).should be true
|
|
@@ -492,7 +671,7 @@ module Punchblock
|
|
|
492
671
|
it "should send a Hangup AMI command and set the command's response" do
|
|
493
672
|
subject.execute_command command
|
|
494
673
|
ami_action = subject.wrapped_object.instance_variable_get(:'@current_ami_action')
|
|
495
|
-
ami_action.name.should == "hangup"
|
|
674
|
+
ami_action.name.should be == "hangup"
|
|
496
675
|
ami_action << RubyAMI::Response.new
|
|
497
676
|
command.response(0.5).should be true
|
|
498
677
|
end
|
|
@@ -566,7 +745,7 @@ module Punchblock
|
|
|
566
745
|
context "for an unknown component ID" do
|
|
567
746
|
it 'sends an error in response to the command' do
|
|
568
747
|
subject.execute_command command
|
|
569
|
-
command.response.should == ProtocolError.new('component-not-found', "Could not find a component with ID #{component_id} for call #{subject.id}", subject.id, component_id)
|
|
748
|
+
command.response.should be == ProtocolError.new('component-not-found', "Could not find a component with ID #{component_id} for call #{subject.id}", subject.id, component_id)
|
|
570
749
|
end
|
|
571
750
|
end
|
|
572
751
|
end
|
|
@@ -578,10 +757,78 @@ module Punchblock
|
|
|
578
757
|
|
|
579
758
|
it 'sends an error in response to the command' do
|
|
580
759
|
subject.execute_command command
|
|
581
|
-
command.response.should == ProtocolError.new('command-not-acceptable', "Did not understand command for call #{subject.id}", subject.id)
|
|
760
|
+
command.response.should be == ProtocolError.new('command-not-acceptable', "Did not understand command for call #{subject.id}", subject.id)
|
|
582
761
|
end
|
|
583
762
|
end
|
|
584
|
-
|
|
763
|
+
|
|
764
|
+
context "with a join command" do
|
|
765
|
+
let(:other_call_id) { "abc123" }
|
|
766
|
+
let(:other_channel) { 'SIP/bar' }
|
|
767
|
+
let(:other_translator) { stub_everything 'Translator::Asterisk' }
|
|
768
|
+
|
|
769
|
+
let :other_call do
|
|
770
|
+
Call.new other_channel, other_translator
|
|
771
|
+
end
|
|
772
|
+
|
|
773
|
+
let :command do
|
|
774
|
+
Punchblock::Command::Join.new :other_call_id => other_call_id
|
|
775
|
+
end
|
|
776
|
+
|
|
777
|
+
it "executes the proper dialplan Bridge application" do
|
|
778
|
+
translator.expects(:call_with_id).with(other_call_id).returns(other_call)
|
|
779
|
+
subject.execute_command command
|
|
780
|
+
agi_command = subject.wrapped_object.instance_variable_get(:'@current_agi_command')
|
|
781
|
+
agi_command.name.should be == "EXEC Bridge"
|
|
782
|
+
agi_command.params_array.should be == [other_channel]
|
|
783
|
+
end
|
|
784
|
+
|
|
785
|
+
it "adds the join to the @pending_joins hash" do
|
|
786
|
+
translator.expects(:call_with_id).with(other_call_id).returns(other_call)
|
|
787
|
+
subject.execute_command command
|
|
788
|
+
subject.pending_joins[other_channel].should be command
|
|
789
|
+
end
|
|
790
|
+
end
|
|
791
|
+
|
|
792
|
+
context "with an unjoin command" do
|
|
793
|
+
let(:other_call_id) { "abc123" }
|
|
794
|
+
let(:other_channel) { 'SIP/bar' }
|
|
795
|
+
|
|
796
|
+
let :other_call do
|
|
797
|
+
Call.new other_channel, translator
|
|
798
|
+
end
|
|
799
|
+
|
|
800
|
+
let :command do
|
|
801
|
+
Punchblock::Command::Unjoin.new :other_call_id => other_call_id
|
|
802
|
+
end
|
|
803
|
+
|
|
804
|
+
it "executes the unjoin through redirection" do
|
|
805
|
+
translator.expects(:call_with_id).with(other_call_id).returns(nil)
|
|
806
|
+
subject.execute_command command
|
|
807
|
+
ami_action = subject.wrapped_object.instance_variable_get(:'@current_ami_action')
|
|
808
|
+
ami_action.name.should be == "redirect"
|
|
809
|
+
ami_action.headers['Channel'].should be == channel
|
|
810
|
+
ami_action.headers['Exten'].should be == Punchblock::Translator::Asterisk::REDIRECT_EXTENSION
|
|
811
|
+
ami_action.headers['Priority'].should be == Punchblock::Translator::Asterisk::REDIRECT_PRIORITY
|
|
812
|
+
ami_action.headers['Context'].should be == Punchblock::Translator::Asterisk::REDIRECT_CONTEXT
|
|
813
|
+
end
|
|
814
|
+
|
|
815
|
+
it "executes the unjoin through redirection, on the subject call and the other call" do
|
|
816
|
+
translator.expects(:call_with_id).with(other_call_id).returns(other_call)
|
|
817
|
+
subject.execute_command command
|
|
818
|
+
ami_action = subject.wrapped_object.instance_variable_get(:'@current_ami_action')
|
|
819
|
+
ami_action.name.should be == "redirect"
|
|
820
|
+
ami_action.headers['Channel'].should be == channel
|
|
821
|
+
ami_action.headers['Exten'].should be == Punchblock::Translator::Asterisk::REDIRECT_EXTENSION
|
|
822
|
+
ami_action.headers['Priority'].should be == Punchblock::Translator::Asterisk::REDIRECT_PRIORITY
|
|
823
|
+
ami_action.headers['Context'].should be == Punchblock::Translator::Asterisk::REDIRECT_CONTEXT
|
|
824
|
+
|
|
825
|
+
ami_action.headers['ExtraChannel'].should be == other_channel
|
|
826
|
+
ami_action.headers['ExtraExten'].should be == Punchblock::Translator::Asterisk::REDIRECT_EXTENSION
|
|
827
|
+
ami_action.headers['ExtraPriority'].should be == Punchblock::Translator::Asterisk::REDIRECT_PRIORITY
|
|
828
|
+
ami_action.headers['ExtraContext'].should be == Punchblock::Translator::Asterisk::REDIRECT_CONTEXT
|
|
829
|
+
end
|
|
830
|
+
end
|
|
831
|
+
end#execute_command
|
|
585
832
|
|
|
586
833
|
describe '#send_agi_action' do
|
|
587
834
|
it 'should send an appropriate AsyncAGI AMI action' do
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
1
3
|
require 'spec_helper'
|
|
2
4
|
|
|
3
5
|
module Punchblock
|
|
@@ -118,8 +120,8 @@ module Punchblock
|
|
|
118
120
|
|
|
119
121
|
complete_event = command.complete_event 0.5
|
|
120
122
|
|
|
121
|
-
complete_event.component_id.should == component_id.to_s
|
|
122
|
-
complete_event.reason.should == expected_complete_reason
|
|
123
|
+
complete_event.component_id.should be == component_id.to_s
|
|
124
|
+
complete_event.reason.should be == expected_complete_reason
|
|
123
125
|
end
|
|
124
126
|
end
|
|
125
127
|
end
|
|
@@ -130,9 +132,9 @@ module Punchblock
|
|
|
130
132
|
|
|
131
133
|
it 'should provide the code and result' do
|
|
132
134
|
code, result, data = subject.parse_agi_result result_string
|
|
133
|
-
code.should
|
|
134
|
-
result.should == 123
|
|
135
|
-
data.should
|
|
135
|
+
code.should be == 200
|
|
136
|
+
result.should be == 123
|
|
137
|
+
data.should be == ''
|
|
136
138
|
end
|
|
137
139
|
end
|
|
138
140
|
|
|
@@ -141,9 +143,9 @@ module Punchblock
|
|
|
141
143
|
|
|
142
144
|
it 'should provide the code and result' do
|
|
143
145
|
code, result, data = subject.parse_agi_result result_string
|
|
144
|
-
code.should
|
|
145
|
-
result.should == -123
|
|
146
|
-
data.should
|
|
146
|
+
code.should be == 200
|
|
147
|
+
result.should be == -123
|
|
148
|
+
data.should be == 'timeout'
|
|
147
149
|
end
|
|
148
150
|
end
|
|
149
151
|
|
|
@@ -152,9 +154,9 @@ module Punchblock
|
|
|
152
154
|
|
|
153
155
|
it 'should provide the code and result' do
|
|
154
156
|
code, result, data = subject.parse_agi_result result_string
|
|
155
|
-
code.should
|
|
156
|
-
result.should == 123
|
|
157
|
-
data.should
|
|
157
|
+
code.should be == 200
|
|
158
|
+
result.should be == 123
|
|
159
|
+
data.should be == 'foo=bar'
|
|
158
160
|
end
|
|
159
161
|
end
|
|
160
162
|
end
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
1
3
|
require 'spec_helper'
|
|
2
4
|
|
|
3
5
|
module Punchblock
|
|
@@ -122,14 +124,14 @@ module Punchblock
|
|
|
122
124
|
action << event
|
|
123
125
|
subject.handle_response response
|
|
124
126
|
action << terminating_event
|
|
125
|
-
@event.should == event_node
|
|
127
|
+
@event.should be == event_node
|
|
126
128
|
end
|
|
127
129
|
|
|
128
130
|
it 'should send a complete event to the component node' do
|
|
129
131
|
subject.action << response
|
|
130
132
|
subject.action << terminating_event
|
|
131
133
|
|
|
132
|
-
command.complete_event(0.5).reason.should == expected_complete_reason
|
|
134
|
+
command.complete_event(0.5).reason.should be == expected_complete_reason
|
|
133
135
|
end
|
|
134
136
|
end
|
|
135
137
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
1
3
|
require 'spec_helper'
|
|
2
4
|
|
|
3
5
|
module Punchblock
|
|
@@ -98,7 +100,7 @@ module Punchblock
|
|
|
98
100
|
end
|
|
99
101
|
|
|
100
102
|
it "should send a success complete event with the relevant data" do
|
|
101
|
-
reason.should == expected_event
|
|
103
|
+
reason.should be == expected_event
|
|
102
104
|
end
|
|
103
105
|
end
|
|
104
106
|
|
|
@@ -114,7 +116,7 @@ module Punchblock
|
|
|
114
116
|
end
|
|
115
117
|
|
|
116
118
|
it "should send a nomatch complete event" do
|
|
117
|
-
reason.should == expected_event
|
|
119
|
+
reason.should be == expected_event
|
|
118
120
|
end
|
|
119
121
|
end
|
|
120
122
|
end
|
|
@@ -125,7 +127,7 @@ module Punchblock
|
|
|
125
127
|
it "should return an error and not execute any actions" do
|
|
126
128
|
subject.execute
|
|
127
129
|
error = ProtocolError.new 'option error', 'A grammar document is required.'
|
|
128
|
-
command.response(0.1).should == error
|
|
130
|
+
command.response(0.1).should be == error
|
|
129
131
|
end
|
|
130
132
|
end
|
|
131
133
|
end
|
|
@@ -136,7 +138,7 @@ module Punchblock
|
|
|
136
138
|
it "should return an error and not execute any actions" do
|
|
137
139
|
subject.execute
|
|
138
140
|
error = ProtocolError.new 'option error', 'A mode value other than DTMF is unsupported on Asterisk.'
|
|
139
|
-
command.response(0.1).should == error
|
|
141
|
+
command.response(0.1).should be == error
|
|
140
142
|
end
|
|
141
143
|
end
|
|
142
144
|
|
|
@@ -145,7 +147,7 @@ module Punchblock
|
|
|
145
147
|
it "should return an error and not execute any actions" do
|
|
146
148
|
subject.execute
|
|
147
149
|
error = ProtocolError.new 'option error', 'A mode value other than DTMF is unsupported on Asterisk.'
|
|
148
|
-
command.response(0.1).should == error
|
|
150
|
+
command.response(0.1).should be == error
|
|
149
151
|
end
|
|
150
152
|
end
|
|
151
153
|
|
|
@@ -154,7 +156,7 @@ module Punchblock
|
|
|
154
156
|
it "should return an error and not execute any actions" do
|
|
155
157
|
subject.execute
|
|
156
158
|
error = ProtocolError.new 'option error', 'A mode value other than DTMF is unsupported on Asterisk.'
|
|
157
|
-
command.response(0.1).should == error
|
|
159
|
+
command.response(0.1).should be == error
|
|
158
160
|
end
|
|
159
161
|
end
|
|
160
162
|
end
|
|
@@ -212,7 +214,7 @@ module Punchblock
|
|
|
212
214
|
it "should return an error and not execute any actions" do
|
|
213
215
|
subject.execute
|
|
214
216
|
error = ProtocolError.new 'option error', 'An initial timeout value that is negative (and not -1) is invalid.'
|
|
215
|
-
command.response(0.1).should == error
|
|
217
|
+
command.response(0.1).should be == error
|
|
216
218
|
end
|
|
217
219
|
end
|
|
218
220
|
end
|
|
@@ -264,7 +266,7 @@ module Punchblock
|
|
|
264
266
|
it "should return an error and not execute any actions" do
|
|
265
267
|
subject.execute
|
|
266
268
|
error = ProtocolError.new 'option error', 'An inter-digit timeout value that is negative (and not -1) is invalid.'
|
|
267
|
-
command.response(0.1).should == error
|
|
269
|
+
command.response(0.1).should be == error
|
|
268
270
|
end
|
|
269
271
|
end
|
|
270
272
|
end
|