punchblock 2.5.2 → 2.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.hound.yml +2 -0
- data/CHANGELOG.md +6 -0
- data/README.markdown +2 -1
- data/lib/punchblock/translator/asterisk/call.rb +3 -3
- data/lib/punchblock/translator/asterisk/component/mrcp_recog_prompt.rb +15 -9
- data/lib/punchblock/translator/asterisk/component/output.rb +8 -1
- data/lib/punchblock/translator/input_component.rb +2 -0
- data/lib/punchblock/version.rb +1 -1
- data/punchblock.gemspec +1 -1
- data/spec/punchblock/client/component_registry_spec.rb +3 -3
- data/spec/punchblock/client_spec.rb +22 -15
- data/spec/punchblock/command/accept_spec.rb +17 -7
- data/spec/punchblock/command/answer_spec.rb +19 -9
- data/spec/punchblock/command/dial_spec.rb +76 -27
- data/spec/punchblock/command/hangup_spec.rb +17 -7
- data/spec/punchblock/command/join_spec.rb +78 -24
- data/spec/punchblock/command/mute_spec.rb +3 -3
- data/spec/punchblock/command/redirect_spec.rb +33 -12
- data/spec/punchblock/command/reject_spec.rb +41 -14
- data/spec/punchblock/command/unjoin_spec.rb +29 -12
- data/spec/punchblock/command/unmute_spec.rb +3 -3
- data/spec/punchblock/command_node_spec.rb +43 -20
- data/spec/punchblock/component/asterisk/agi/command_spec.rb +52 -12
- data/spec/punchblock/component/asterisk/ami/action_spec.rb +69 -21
- data/spec/punchblock/component/component_node_spec.rb +12 -12
- data/spec/punchblock/component/input_spec.rb +304 -87
- data/spec/punchblock/component/output_spec.rb +434 -173
- data/spec/punchblock/component/prompt_spec.rb +63 -20
- data/spec/punchblock/component/receive_fax_spec.rb +43 -14
- data/spec/punchblock/component/record_spec.rb +215 -71
- data/spec/punchblock/component/send_fax_spec.rb +54 -15
- data/spec/punchblock/connection/asterisk_spec.rb +34 -24
- data/spec/punchblock/connection/freeswitch_spec.rb +9 -9
- data/spec/punchblock/connection/xmpp_spec.rb +92 -83
- data/spec/punchblock/event/answered_spec.rb +14 -4
- data/spec/punchblock/event/asterisk/ami/event_spec.rb +34 -12
- data/spec/punchblock/event/complete_spec.rb +36 -16
- data/spec/punchblock/event/dtmf_spec.rb +9 -3
- data/spec/punchblock/event/end_spec.rb +43 -10
- data/spec/punchblock/event/input_timers_started_spec.rb +1 -1
- data/spec/punchblock/event/joined_spec.rb +29 -7
- data/spec/punchblock/event/offer_spec.rb +41 -10
- data/spec/punchblock/event/ringing_spec.rb +14 -4
- data/spec/punchblock/event/started_speaking_spec.rb +9 -3
- data/spec/punchblock/event/stopped_speaking_spec.rb +9 -3
- data/spec/punchblock/event/unjoined_spec.rb +24 -6
- data/spec/punchblock/protocol_error_spec.rb +16 -13
- data/spec/punchblock/ref_spec.rb +90 -26
- data/spec/punchblock/translator/asterisk/call_spec.rb +176 -161
- data/spec/punchblock/translator/asterisk/component/asterisk/agi_command_spec.rb +18 -18
- data/spec/punchblock/translator/asterisk/component/asterisk/ami_action_spec.rb +9 -9
- data/spec/punchblock/translator/asterisk/component/composed_prompt_spec.rb +14 -14
- data/spec/punchblock/translator/asterisk/component/input_spec.rb +57 -36
- data/spec/punchblock/translator/asterisk/component/mrcp_native_prompt_spec.rb +50 -50
- data/spec/punchblock/translator/asterisk/component/mrcp_prompt_spec.rb +59 -48
- data/spec/punchblock/translator/asterisk/component/output_spec.rb +231 -221
- data/spec/punchblock/translator/asterisk/component/record_spec.rb +82 -82
- data/spec/punchblock/translator/asterisk/component/stop_by_redirect_spec.rb +10 -10
- data/spec/punchblock/translator/asterisk/component_spec.rb +4 -4
- data/spec/punchblock/translator/asterisk_spec.rb +89 -82
- data/spec/punchblock/translator/freeswitch/call_spec.rb +114 -99
- data/spec/punchblock/translator/freeswitch/component/flite_output_spec.rb +19 -19
- data/spec/punchblock/translator/freeswitch/component/input_spec.rb +24 -24
- data/spec/punchblock/translator/freeswitch/component/output_spec.rb +23 -23
- data/spec/punchblock/translator/freeswitch/component/record_spec.rb +78 -78
- data/spec/punchblock/translator/freeswitch/component/tts_output_spec.rb +19 -19
- data/spec/punchblock/translator/freeswitch/component_spec.rb +8 -8
- data/spec/punchblock/translator/freeswitch_spec.rb +66 -59
- data/spec/punchblock/uri_list_spec.rb +45 -10
- data/spec/punchblock_spec.rb +13 -13
- data/spec/spec_helper.rb +18 -11
- data/spec/support/mock_connection_with_event_handler.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 63ef1da0eed86d39e520b4e10984e068c8dc62e6
|
|
4
|
+
data.tar.gz: 6b48e400972ac2516337faae2a52f85089dab0cc
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: f8b33066c0816e1ac83c9911e3a8ba5b9ca717344d9bd970709a3555ba92e52f3170886ba3261d5b9b66ed95dd49e4edee63311723dc026f4f302d60c7e058d8
|
|
7
|
+
data.tar.gz: 6156cb56046135c814b3e11fe1844236d075a227e12972c2efa63a56ad5079314791a131b2e22136222a7626497af1f23beca04596f0200bb0732ec67b4448cd
|
data/.hound.yml
ADDED
data/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# [develop](https://github.com/adhearsion/punchblock)
|
|
2
2
|
|
|
3
|
+
# [v2.5.3](https://github.com/adhearsion/punchblock/compare/v2.5.2...v2.5.3) - [2014-09-22](https://rubygems.org/gems/punchblock/versions/2.5.3)
|
|
4
|
+
* Bugfix: Prevent Asterisk translator death due to dead DTMF recognizers ([#221](https://github.com/adhearsion/punchblock/pull/221), [adhearsion/adhearsion#479](https://github.com/adhearsion/adhearsion/issues/479))
|
|
5
|
+
* Bugfix: Be more intelligent about only stripping true file extensions off filenames for playback on Asterisk ([adhearsion/adhearsion#482](https://github.com/adhearsion/adhearsion/issues/482))
|
|
6
|
+
* Bugfix: Handle a corner case crash where a recognition request is interrupted directly after a successful recognition has completed
|
|
7
|
+
* Bugfix: Avoid cases where executing AGI commands (reported as sending SIP messages) might block indefinitely due to a race condition in fetching their response value
|
|
8
|
+
|
|
3
9
|
# [v2.5.2](https://github.com/adhearsion/punchblock/compare/v2.5.1...v2.5.2) - [2014-04-03](https://rubygems.org/gems/punchblock/versions/2.5.2)
|
|
4
10
|
* Bugfix: No longer confound start and stop beeps on record commands (#220)
|
|
5
11
|
|
data/README.markdown
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
[](https://gemnasium.com/adhearsion/punchblock)
|
|
4
4
|
[](https://codeclimate.com/github/adhearsion/punchblock)
|
|
5
5
|
[](https://coveralls.io/r/adhearsion/punchblock)
|
|
6
|
+
[](http://inch-ci.org/github/adhearsion/punchblock)
|
|
6
7
|
|
|
7
8
|
# Punchblock
|
|
8
9
|
Punchblock is a middleware library for telephony applications. Like Rack is to Rails and Sinatra, Punchblock provides a consistent API on top of several underlying third-party call control protocols.
|
|
@@ -38,4 +39,4 @@ The best available usage documentation available for Punchblock is by example, i
|
|
|
38
39
|
|
|
39
40
|
## Copyright
|
|
40
41
|
|
|
41
|
-
Copyright (c)
|
|
42
|
+
Copyright (c) 2014 Adhearsion Foundation Inc. MIT licence (see LICENSE for details).
|
|
@@ -254,12 +254,12 @@ module Punchblock
|
|
|
254
254
|
# @raises RubyAMI::Error, ChannelGoneError
|
|
255
255
|
def execute_agi_command(command, *params)
|
|
256
256
|
agi = AGICommand.new Punchblock.new_uuid, channel, command, *params
|
|
257
|
-
|
|
257
|
+
response = Celluloid::Future.new
|
|
258
258
|
register_tmp_handler :ami, name: 'AsyncAGI', [:[], 'SubEvent'] => 'Exec', [:[], 'CommandID'] => agi.id do |event|
|
|
259
|
-
|
|
259
|
+
response.signal Celluloid::SuccessResponse.new(nil, event)
|
|
260
260
|
end
|
|
261
261
|
agi.execute @ami_client
|
|
262
|
-
event =
|
|
262
|
+
event = response.value
|
|
263
263
|
return unless event
|
|
264
264
|
agi.parse_result event
|
|
265
265
|
end
|
|
@@ -38,7 +38,6 @@ module Punchblock
|
|
|
38
38
|
|
|
39
39
|
def execute_app(app, *args)
|
|
40
40
|
UniMRCPApp.new(app, *args, unimrcp_app_options).execute @call
|
|
41
|
-
raise UniMRCPError if @call.channel_var('RECOG_STATUS') == 'ERROR'
|
|
42
41
|
end
|
|
43
42
|
|
|
44
43
|
def unimrcp_app_options
|
|
@@ -85,14 +84,21 @@ module Punchblock
|
|
|
85
84
|
end
|
|
86
85
|
|
|
87
86
|
def complete
|
|
88
|
-
|
|
89
|
-
when '
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
87
|
+
case @call.channel_var('RECOG_STATUS')
|
|
88
|
+
when 'INTERRUPTED'
|
|
89
|
+
send_complete_event Punchblock::Component::Input::Complete::NoMatch.new
|
|
90
|
+
when 'ERROR'
|
|
91
|
+
raise UniMRCPError
|
|
92
|
+
else
|
|
93
|
+
send_complete_event case @call.channel_var('RECOG_COMPLETION_CAUSE')
|
|
94
|
+
when '000'
|
|
95
|
+
nlsml = RubySpeech.parse URI.decode(@call.channel_var('RECOG_RESULT'))
|
|
96
|
+
Punchblock::Component::Input::Complete::Match.new nlsml: nlsml
|
|
97
|
+
when '001'
|
|
98
|
+
Punchblock::Component::Input::Complete::NoMatch.new
|
|
99
|
+
when '002'
|
|
100
|
+
Punchblock::Component::Input::Complete::NoInput.new
|
|
101
|
+
end
|
|
96
102
|
end
|
|
97
103
|
end
|
|
98
104
|
end
|
|
@@ -126,7 +126,14 @@ module Punchblock
|
|
|
126
126
|
end
|
|
127
127
|
|
|
128
128
|
def path_for_audio_node(node)
|
|
129
|
-
node.src.sub('file://', '')
|
|
129
|
+
path = node.src.sub('file://', '')
|
|
130
|
+
dir = File.dirname(path)
|
|
131
|
+
basename = File.basename(path, '.*')
|
|
132
|
+
if dir == '.'
|
|
133
|
+
basename
|
|
134
|
+
else
|
|
135
|
+
File.join(dir, basename)
|
|
136
|
+
end
|
|
130
137
|
end
|
|
131
138
|
|
|
132
139
|
def filenames(doc, check_audio_only_policy = -> {})
|
data/lib/punchblock/version.rb
CHANGED
data/punchblock.gemspec
CHANGED
|
@@ -28,7 +28,7 @@ Gem::Specification.new do |s|
|
|
|
28
28
|
s.add_runtime_dependency %q<state_machine>, ["~> 1.0"]
|
|
29
29
|
s.add_runtime_dependency %q<future-resource>, ["~> 1.0"]
|
|
30
30
|
s.add_runtime_dependency %q<has-guarded-handlers>, ["~> 1.5"]
|
|
31
|
-
s.add_runtime_dependency %q<celluloid>, ["~> 0.
|
|
31
|
+
s.add_runtime_dependency %q<celluloid>, ["~> 0.15.2"]
|
|
32
32
|
s.add_runtime_dependency %q<ruby_ami>, ["~> 2.2"]
|
|
33
33
|
s.add_runtime_dependency %q<ruby_fs>, ["~> 1.1"]
|
|
34
34
|
s.add_runtime_dependency %q<ruby_speech>, ["~> 2.3"]
|
|
@@ -10,14 +10,14 @@ module Punchblock
|
|
|
10
10
|
|
|
11
11
|
it 'should store components and allow lookup by ID' do
|
|
12
12
|
subject << component
|
|
13
|
-
subject.find_by_uri(uri).
|
|
13
|
+
expect(subject.find_by_uri(uri)).to be component
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
it 'should allow deletion of components' do
|
|
17
17
|
subject << component
|
|
18
|
-
subject.find_by_uri(uri).
|
|
18
|
+
expect(subject.find_by_uri(uri)).to be component
|
|
19
19
|
subject.delete component
|
|
20
|
-
subject.find_by_uri(uri).
|
|
20
|
+
expect(subject.find_by_uri(uri)).to be_nil
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
end
|
|
@@ -8,8 +8,15 @@ module Punchblock
|
|
|
8
8
|
|
|
9
9
|
subject { Client.new :connection => connection }
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
describe '#connection' do
|
|
12
|
+
subject { super().connection }
|
|
13
|
+
it { should be connection }
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
describe '#component_registry' do
|
|
17
|
+
subject { super().component_registry }
|
|
18
|
+
it { should be_a Client::ComponentRegistry }
|
|
19
|
+
end
|
|
13
20
|
|
|
14
21
|
let(:call_id) { 'abc123' }
|
|
15
22
|
let(:mock_event) { double('Event').as_null_object }
|
|
@@ -20,14 +27,14 @@ module Punchblock
|
|
|
20
27
|
|
|
21
28
|
describe '#run' do
|
|
22
29
|
it 'should start up the connection' do
|
|
23
|
-
connection.
|
|
30
|
+
expect(connection).to receive(:run).once
|
|
24
31
|
subject.run
|
|
25
32
|
end
|
|
26
33
|
end
|
|
27
34
|
|
|
28
35
|
describe '#stop' do
|
|
29
36
|
it 'should stop the connection' do
|
|
30
|
-
connection.
|
|
37
|
+
expect(connection).to receive(:stop).once
|
|
31
38
|
subject.stop
|
|
32
39
|
end
|
|
33
40
|
end
|
|
@@ -35,7 +42,7 @@ module Punchblock
|
|
|
35
42
|
describe '#send_message' do
|
|
36
43
|
it 'should send a message' do
|
|
37
44
|
args = [ "someone", "example.org", "Hello World!" ]
|
|
38
|
-
connection.
|
|
45
|
+
expect(connection).to receive(:send_message).with(*args).once
|
|
39
46
|
subject.send_message *args
|
|
40
47
|
end
|
|
41
48
|
end
|
|
@@ -43,12 +50,12 @@ module Punchblock
|
|
|
43
50
|
describe '#new_call_uri' do
|
|
44
51
|
it 'should return the connection-specific fresh call ID' do
|
|
45
52
|
stub_uuids 'foobar'
|
|
46
|
-
subject.new_call_uri.
|
|
53
|
+
expect(subject.new_call_uri).to eq('xmpp:foobar@call.rayo.net')
|
|
47
54
|
end
|
|
48
55
|
end
|
|
49
56
|
|
|
50
57
|
it 'should handle connection events' do
|
|
51
|
-
subject.
|
|
58
|
+
expect(subject).to receive(:handle_event).with(mock_event).once
|
|
52
59
|
connection.event_handler.call mock_event
|
|
53
60
|
end
|
|
54
61
|
|
|
@@ -56,18 +63,18 @@ module Punchblock
|
|
|
56
63
|
it "sets the event's client" do
|
|
57
64
|
event = Event::Offer.new
|
|
58
65
|
subject.handle_event event
|
|
59
|
-
event.client.
|
|
66
|
+
expect(event.client).to be subject
|
|
60
67
|
end
|
|
61
68
|
|
|
62
69
|
context 'if the event can be associated with a source component' do
|
|
63
70
|
before do
|
|
64
71
|
mock_event.stub :source => mock_component
|
|
65
|
-
mock_component.
|
|
72
|
+
expect(mock_component).to receive(:add_event).with mock_event
|
|
66
73
|
end
|
|
67
74
|
|
|
68
75
|
it 'should not call event handlers' do
|
|
69
76
|
handler = double 'handler'
|
|
70
|
-
handler.
|
|
77
|
+
expect(handler).to receive(:call).never
|
|
71
78
|
subject.register_event_handler do |event|
|
|
72
79
|
handler.call event
|
|
73
80
|
end
|
|
@@ -82,7 +89,7 @@ module Punchblock
|
|
|
82
89
|
|
|
83
90
|
it 'should call registered event handlers' do
|
|
84
91
|
handler = double 'handler'
|
|
85
|
-
handler.
|
|
92
|
+
expect(handler).to receive(:call).once.with mock_event
|
|
86
93
|
subject.register_event_handler do |event|
|
|
87
94
|
handler.call event
|
|
88
95
|
end
|
|
@@ -93,7 +100,7 @@ module Punchblock
|
|
|
93
100
|
|
|
94
101
|
it 'should be able to register and retrieve components' do
|
|
95
102
|
subject.register_component mock_component
|
|
96
|
-
subject.find_component_by_uri(component_uri).
|
|
103
|
+
expect(subject.find_component_by_uri(component_uri)).to be mock_component
|
|
97
104
|
end
|
|
98
105
|
|
|
99
106
|
describe '#execute_command' do
|
|
@@ -101,7 +108,7 @@ module Punchblock
|
|
|
101
108
|
let(:event) { Event::Complete.new }
|
|
102
109
|
|
|
103
110
|
before do
|
|
104
|
-
connection.
|
|
111
|
+
expect(connection).to receive(:write).once.with component, :call_id => call_id
|
|
105
112
|
end
|
|
106
113
|
|
|
107
114
|
let :execute_command do
|
|
@@ -114,11 +121,11 @@ module Punchblock
|
|
|
114
121
|
|
|
115
122
|
it "should set the command's client" do
|
|
116
123
|
execute_command
|
|
117
|
-
component.client.
|
|
124
|
+
expect(component.client).to be subject
|
|
118
125
|
end
|
|
119
126
|
|
|
120
127
|
it "should handle a component's events" do
|
|
121
|
-
subject.
|
|
128
|
+
expect(subject).to receive(:trigger_handler).with(:event, event).once
|
|
122
129
|
execute_command
|
|
123
130
|
component.request!
|
|
124
131
|
component.execute!
|
|
@@ -6,7 +6,7 @@ module Punchblock
|
|
|
6
6
|
module Command
|
|
7
7
|
describe Accept do
|
|
8
8
|
it 'registers itself' do
|
|
9
|
-
RayoNode.class_from_registration(:accept, 'urn:xmpp:rayo:1').
|
|
9
|
+
expect(RayoNode.class_from_registration(:accept, 'urn:xmpp:rayo:1')).to eq(described_class)
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
describe "from a stanza" do
|
|
@@ -22,25 +22,35 @@ module Punchblock
|
|
|
22
22
|
subject { RayoNode.from_xml parse_stanza(stanza).root, '9f00061', '1' }
|
|
23
23
|
|
|
24
24
|
it { should be_instance_of described_class }
|
|
25
|
-
|
|
25
|
+
|
|
26
|
+
describe '#headers' do
|
|
27
|
+
subject { super().headers }
|
|
28
|
+
it { should == { 'X-skill' => 'agent', 'X-customer-id' => '8877' } }
|
|
29
|
+
end
|
|
26
30
|
|
|
27
31
|
context "with no headers provided" do
|
|
28
32
|
let(:stanza) { '<accept xmlns="urn:xmpp:rayo:1"/>' }
|
|
29
33
|
|
|
30
|
-
|
|
34
|
+
describe '#headers' do
|
|
35
|
+
subject { super().headers }
|
|
36
|
+
it { should == {} }
|
|
37
|
+
end
|
|
31
38
|
end
|
|
32
39
|
end
|
|
33
40
|
|
|
34
41
|
describe "when setting options in initializer" do
|
|
35
42
|
subject { described_class.new headers: { 'X-skill' => 'agent', 'X-customer-id' => '8877' } }
|
|
36
43
|
|
|
37
|
-
|
|
44
|
+
describe '#headers' do
|
|
45
|
+
subject { super().headers }
|
|
46
|
+
it { should == { 'X-skill' => 'agent', 'X-customer-id' => '8877' } }
|
|
47
|
+
end
|
|
38
48
|
|
|
39
49
|
describe "exporting to Rayo" do
|
|
40
50
|
it "should export to XML that can be understood by its parser" do
|
|
41
51
|
new_instance = RayoNode.from_xml subject.to_rayo
|
|
42
|
-
new_instance.
|
|
43
|
-
new_instance.headers.
|
|
52
|
+
expect(new_instance).to be_instance_of described_class
|
|
53
|
+
expect(new_instance.headers).to eq({ 'X-skill' => 'agent', 'X-customer-id' => '8877' })
|
|
44
54
|
end
|
|
45
55
|
|
|
46
56
|
it "should render to a parent node if supplied" do
|
|
@@ -48,7 +58,7 @@ module Punchblock
|
|
|
48
58
|
parent = Nokogiri::XML::Node.new 'foo', doc
|
|
49
59
|
doc.root = parent
|
|
50
60
|
rayo_doc = subject.to_rayo(parent)
|
|
51
|
-
rayo_doc.
|
|
61
|
+
expect(rayo_doc).to eq(parent)
|
|
52
62
|
end
|
|
53
63
|
end
|
|
54
64
|
end
|
|
@@ -6,7 +6,7 @@ module Punchblock
|
|
|
6
6
|
module Command
|
|
7
7
|
describe Answer do
|
|
8
8
|
it 'registers itself' do
|
|
9
|
-
RayoNode.class_from_registration(:answer, 'urn:xmpp:rayo:1').
|
|
9
|
+
expect(RayoNode.class_from_registration(:answer, 'urn:xmpp:rayo:1')).to eq(described_class)
|
|
10
10
|
end
|
|
11
11
|
|
|
12
12
|
describe "from a stanza" do
|
|
@@ -22,25 +22,35 @@ module Punchblock
|
|
|
22
22
|
subject { RayoNode.from_xml parse_stanza(stanza).root, '9f00061', '1' }
|
|
23
23
|
|
|
24
24
|
it { should be_instance_of described_class }
|
|
25
|
-
|
|
25
|
+
|
|
26
|
+
describe '#headers' do
|
|
27
|
+
subject { super().headers }
|
|
28
|
+
it { should == { 'X-skill' => 'agent', 'X-customer-id' => '8877' } }
|
|
29
|
+
end
|
|
26
30
|
|
|
27
31
|
context "with no headers provided" do
|
|
28
32
|
let(:stanza) { '<answer xmlns="urn:xmpp:rayo:1"/>' }
|
|
29
33
|
|
|
30
|
-
|
|
34
|
+
describe '#headers' do
|
|
35
|
+
subject { super().headers }
|
|
36
|
+
it { should == {} }
|
|
37
|
+
end
|
|
31
38
|
end
|
|
32
39
|
end
|
|
33
40
|
|
|
34
41
|
describe "when setting options in initializer" do
|
|
35
42
|
subject { described_class.new headers: { 'X-skill' => 'agent', 'X-customer-id' => '8877' } }
|
|
36
43
|
|
|
37
|
-
|
|
44
|
+
describe '#headers' do
|
|
45
|
+
subject { super().headers }
|
|
46
|
+
it { should == { 'X-skill' => 'agent', 'X-customer-id' => '8877' } }
|
|
47
|
+
end
|
|
38
48
|
|
|
39
49
|
describe "exporting to Rayo" do
|
|
40
50
|
it "should export to XML that can be understood by its parser" do
|
|
41
51
|
new_instance = RayoNode.from_xml subject.to_rayo
|
|
42
|
-
new_instance.
|
|
43
|
-
new_instance.headers.
|
|
52
|
+
expect(new_instance).to be_instance_of described_class
|
|
53
|
+
expect(new_instance.headers).to eq({ 'X-skill' => 'agent', 'X-customer-id' => '8877' })
|
|
44
54
|
end
|
|
45
55
|
|
|
46
56
|
it "should render to a parent node if supplied" do
|
|
@@ -48,7 +58,7 @@ module Punchblock
|
|
|
48
58
|
parent = Nokogiri::XML::Node.new 'foo', doc
|
|
49
59
|
doc.root = parent
|
|
50
60
|
rayo_doc = subject.to_rayo(parent)
|
|
51
|
-
rayo_doc.
|
|
61
|
+
expect(rayo_doc).to eq(parent)
|
|
52
62
|
end
|
|
53
63
|
|
|
54
64
|
context "with multiple headers of the same name" do
|
|
@@ -56,8 +66,8 @@ module Punchblock
|
|
|
56
66
|
|
|
57
67
|
it "should export to XML that can be understood by its parser" do
|
|
58
68
|
new_instance = RayoNode.from_xml subject.to_rayo
|
|
59
|
-
new_instance.
|
|
60
|
-
new_instance.headers.
|
|
69
|
+
expect(new_instance).to be_instance_of described_class
|
|
70
|
+
expect(new_instance.headers).to eq({ 'X-skill' => ['sales', 'complaints'] })
|
|
61
71
|
end
|
|
62
72
|
end
|
|
63
73
|
end
|
|
@@ -7,7 +7,7 @@ module Punchblock
|
|
|
7
7
|
describe Dial do
|
|
8
8
|
|
|
9
9
|
it 'registers itself' do
|
|
10
|
-
RayoNode.class_from_registration(:dial, 'urn:xmpp:rayo:1').
|
|
10
|
+
expect(RayoNode.class_from_registration(:dial, 'urn:xmpp:rayo:1')).to eq(described_class)
|
|
11
11
|
end
|
|
12
12
|
|
|
13
13
|
let(:join_params) { {:call_uri => 'abc123'} }
|
|
@@ -15,23 +15,46 @@ module Punchblock
|
|
|
15
15
|
describe "when setting options in initializer" do
|
|
16
16
|
subject { described_class.new to: 'tel:+14155551212', from: 'tel:+13035551212', uri: 'xmpp:foo@bar.com', timeout: 30000, headers: { 'X-skill' => 'agent', 'X-customer-id' => '8877' }, join: join_params }
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
18
|
+
describe '#to' do
|
|
19
|
+
subject { super().to }
|
|
20
|
+
it { should be == 'tel:+14155551212' }
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe '#from' do
|
|
24
|
+
subject { super().from }
|
|
25
|
+
it { should be == 'tel:+13035551212' }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe '#uri' do
|
|
29
|
+
subject { super().uri }
|
|
30
|
+
it { should be == 'xmpp:foo@bar.com' }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
describe '#timeout' do
|
|
34
|
+
subject { super().timeout }
|
|
35
|
+
it { should be == 30000 }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
describe '#join' do
|
|
39
|
+
subject { super().join }
|
|
40
|
+
it { should be == Join.new(join_params) }
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
describe '#headers' do
|
|
44
|
+
subject { super().headers }
|
|
45
|
+
it { should be == { 'X-skill' => 'agent', 'X-customer-id' => '8877' } }
|
|
46
|
+
end
|
|
24
47
|
|
|
25
48
|
describe "exporting to Rayo" do
|
|
26
49
|
it "should export to XML that can be understood by its parser" do
|
|
27
50
|
new_instance = RayoNode.from_xml subject.to_rayo
|
|
28
|
-
new_instance.
|
|
29
|
-
new_instance.to.
|
|
30
|
-
new_instance.from.
|
|
31
|
-
new_instance.uri.
|
|
32
|
-
new_instance.timeout.
|
|
33
|
-
new_instance.join.
|
|
34
|
-
new_instance.headers.
|
|
51
|
+
expect(new_instance).to be_instance_of described_class
|
|
52
|
+
expect(new_instance.to).to eq('tel:+14155551212')
|
|
53
|
+
expect(new_instance.from).to eq('tel:+13035551212')
|
|
54
|
+
expect(new_instance.uri).to eq('xmpp:foo@bar.com')
|
|
55
|
+
expect(new_instance.timeout).to eq(30000)
|
|
56
|
+
expect(new_instance.join).to eq(Join.new(join_params))
|
|
57
|
+
expect(new_instance.headers).to eq({ 'X-skill' => 'agent', 'X-customer-id' => '8877' })
|
|
35
58
|
end
|
|
36
59
|
|
|
37
60
|
it "should render to a parent node if supplied" do
|
|
@@ -39,15 +62,15 @@ module Punchblock
|
|
|
39
62
|
parent = Nokogiri::XML::Node.new 'foo', doc
|
|
40
63
|
doc.root = parent
|
|
41
64
|
rayo_doc = subject.to_rayo(parent)
|
|
42
|
-
rayo_doc.
|
|
65
|
+
expect(rayo_doc).to eq(parent)
|
|
43
66
|
end
|
|
44
67
|
|
|
45
68
|
context "when attributes are not set" do
|
|
46
69
|
subject { described_class.new to: 'abc123' }
|
|
47
70
|
|
|
48
71
|
it "should not include them in the XML representation" do
|
|
49
|
-
subject.to_rayo['to'].
|
|
50
|
-
subject.to_rayo['from'].
|
|
72
|
+
expect(subject.to_rayo['to']).to eq('abc123')
|
|
73
|
+
expect(subject.to_rayo['from']).to be_nil
|
|
51
74
|
end
|
|
52
75
|
end
|
|
53
76
|
end
|
|
@@ -68,17 +91,43 @@ module Punchblock
|
|
|
68
91
|
|
|
69
92
|
it { should be_instance_of described_class }
|
|
70
93
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
94
|
+
describe '#to' do
|
|
95
|
+
subject { super().to }
|
|
96
|
+
it { should be == 'tel:+14155551212' }
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
describe '#from' do
|
|
100
|
+
subject { super().from }
|
|
101
|
+
it { should be == 'tel:+13035551212' }
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
describe '#uri' do
|
|
105
|
+
subject { super().uri }
|
|
106
|
+
it { should be == 'xmpp:foo@bar.com' }
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
describe '#timeout' do
|
|
110
|
+
subject { super().timeout }
|
|
111
|
+
it { should be == 30000 }
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
describe '#join' do
|
|
115
|
+
subject { super().join }
|
|
116
|
+
it { should be == Join.new(join_params) }
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
describe '#headers' do
|
|
120
|
+
subject { super().headers }
|
|
121
|
+
it { should be == { 'X-skill' => 'agent', 'X-customer-id' => '8877' } }
|
|
122
|
+
end
|
|
77
123
|
|
|
78
124
|
context "with no headers provided" do
|
|
79
125
|
let(:stanza) { '<dial xmlns="urn:xmpp:rayo:1"/>' }
|
|
80
126
|
|
|
81
|
-
|
|
127
|
+
describe '#headers' do
|
|
128
|
+
subject { super().headers }
|
|
129
|
+
it { should == {} }
|
|
130
|
+
end
|
|
82
131
|
end
|
|
83
132
|
end
|
|
84
133
|
|
|
@@ -94,17 +143,17 @@ module Punchblock
|
|
|
94
143
|
|
|
95
144
|
it "should set the transport from the ref" do
|
|
96
145
|
subject.response = ref
|
|
97
|
-
subject.transport.
|
|
146
|
+
expect(subject.transport).to eq('xmpp')
|
|
98
147
|
end
|
|
99
148
|
|
|
100
149
|
it "should set the call ID from the ref" do
|
|
101
150
|
subject.response = ref
|
|
102
|
-
subject.target_call_id.
|
|
151
|
+
expect(subject.target_call_id).to eq(call_id)
|
|
103
152
|
end
|
|
104
153
|
|
|
105
154
|
it "should set the domain from the ref" do
|
|
106
155
|
subject.response = ref
|
|
107
|
-
subject.domain.
|
|
156
|
+
expect(subject.domain).to eq(domain)
|
|
108
157
|
end
|
|
109
158
|
end
|
|
110
159
|
end
|