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.
- checksums.yaml +4 -4
- data/.rspec +1 -0
- data/CHANGELOG.md +15 -0
- data/README.markdown +2 -1
- data/Rakefile +1 -6
- data/adhearsion.gemspec +4 -3
- data/features/cli_daemon.feature +2 -4
- data/features/cli_restart.feature +14 -5
- data/features/cli_start.feature +0 -2
- data/features/cli_stop.feature +15 -6
- data/lib/adhearsion.rb +21 -23
- data/lib/adhearsion/call.rb +49 -5
- data/lib/adhearsion/call_controller.rb +29 -11
- data/lib/adhearsion/call_controller/dial.rb +21 -9
- data/lib/adhearsion/call_controller/menu_dsl.rb +12 -12
- data/lib/adhearsion/call_controller/menu_dsl/array_match_calculator.rb +1 -1
- data/lib/adhearsion/call_controller/menu_dsl/fixnum_match_calculator.rb +1 -0
- data/lib/adhearsion/call_controller/menu_dsl/string_match_calculator.rb +1 -1
- data/lib/adhearsion/call_controller/output.rb +36 -7
- data/lib/adhearsion/call_controller/output/abstract_player.rb +4 -0
- data/lib/adhearsion/call_controller/record.rb +1 -0
- data/lib/adhearsion/cli_commands/ahn_command.rb +7 -4
- data/lib/adhearsion/cli_commands/plugin_command.rb +2 -0
- data/lib/adhearsion/generators.rb +2 -4
- data/lib/adhearsion/generators/app/templates/simon_game_spec.rb +20 -20
- data/lib/adhearsion/initializer.rb +2 -2
- data/lib/adhearsion/plugin.rb +6 -6
- data/lib/adhearsion/punchblock_plugin.rb +3 -4
- data/lib/adhearsion/punchblock_plugin/initializer.rb +2 -1
- data/lib/adhearsion/router.rb +7 -7
- data/lib/adhearsion/router/route.rb +10 -4
- data/lib/adhearsion/rspec.rb +2 -0
- data/lib/adhearsion/version.rb +1 -1
- data/spec/adhearsion/call_controller/dial_spec.rb +589 -557
- data/spec/adhearsion/call_controller/input_spec.rb +91 -91
- data/spec/adhearsion/call_controller/menu_dsl/array_match_calculator_spec.rb +29 -29
- data/spec/adhearsion/call_controller/menu_dsl/calculated_match_collection_spec.rb +6 -6
- data/spec/adhearsion/call_controller/menu_dsl/calculated_match_spec.rb +19 -19
- data/spec/adhearsion/call_controller/menu_dsl/fixnum_match_calculator_spec.rb +6 -6
- data/spec/adhearsion/call_controller/menu_dsl/match_calculator_spec.rb +1 -1
- data/spec/adhearsion/call_controller/menu_dsl/menu_builder_spec.rb +21 -17
- data/spec/adhearsion/call_controller/menu_dsl/menu_spec.rb +96 -83
- data/spec/adhearsion/call_controller/menu_dsl/range_match_calculator_spec.rb +5 -5
- data/spec/adhearsion/call_controller/menu_dsl/string_match_calculator_spec.rb +9 -9
- data/spec/adhearsion/call_controller/output/async_player_spec.rb +14 -4
- data/spec/adhearsion/call_controller/output/formatter_spec.rb +14 -14
- data/spec/adhearsion/call_controller/output/player_spec.rb +15 -5
- data/spec/adhearsion/call_controller/output_spec.rb +126 -78
- data/spec/adhearsion/call_controller/record_spec.rb +38 -26
- data/spec/adhearsion/call_controller/utility_spec.rb +11 -11
- data/spec/adhearsion/call_controller_spec.rb +176 -136
- data/spec/adhearsion/call_spec.rb +443 -218
- data/spec/adhearsion/calls_spec.rb +33 -33
- data/spec/adhearsion/configuration_spec.rb +61 -61
- data/spec/adhearsion/console_spec.rb +29 -29
- data/spec/adhearsion/events_spec.rb +14 -14
- data/spec/adhearsion/generators_spec.rb +1 -1
- data/spec/adhearsion/initializer_spec.rb +42 -42
- data/spec/adhearsion/logging_spec.rb +33 -33
- data/spec/adhearsion/outbound_call_spec.rb +69 -55
- data/spec/adhearsion/plugin_spec.rb +53 -44
- data/spec/adhearsion/process_spec.rb +21 -21
- data/spec/adhearsion/punchblock_plugin/initializer_spec.rb +68 -52
- data/spec/adhearsion/punchblock_plugin_spec.rb +6 -6
- data/spec/adhearsion/router/evented_route_spec.rb +2 -2
- data/spec/adhearsion/router/openended_route_spec.rb +9 -9
- data/spec/adhearsion/router/route_spec.rb +61 -31
- data/spec/adhearsion/router/unaccepting_route_spec.rb +13 -13
- data/spec/adhearsion/router_spec.rb +47 -33
- data/spec/adhearsion/statistics/dump_spec.rb +6 -6
- data/spec/adhearsion/statistics_spec.rb +9 -9
- data/spec/adhearsion_spec.rb +23 -20
- data/spec/spec_helper.rb +3 -6
- data/spec/support/call_controller_test_helpers.rb +7 -7
- data/spec/support/initializer_stubs.rb +1 -1
- data/spec/support/punchblock_mocks.rb +1 -1
- metadata +22 -10
- data/features/support/utils.rb +0 -9
@@ -11,19 +11,19 @@ module Adhearsion
|
|
11
11
|
digits_that_begin_with_eleven = [110..119, 1100..1111].map { |x| Array(x) }.flatten
|
12
12
|
calculator = RangeMatchCalculator.new 11..1111, :match_payload_doesnt_matter
|
13
13
|
match = calculator.match '11'
|
14
|
-
match.exact_matches.
|
15
|
-
match.potential_matches.
|
14
|
+
expect(match.exact_matches).to eq(['11'])
|
15
|
+
expect(match.potential_matches).to eq(digits_that_begin_with_eleven)
|
16
16
|
end
|
17
17
|
|
18
18
|
it "return values of #match should be an instance of CalculatedMatch" do
|
19
19
|
calculator = RangeMatchCalculator.new 1..9, :match_payload_doesnt_matter
|
20
|
-
calculator.match('0').
|
21
|
-
calculator.match('1000').
|
20
|
+
expect(calculator.match('0')).to be_an_instance_of CalculatedMatch
|
21
|
+
expect(calculator.match('1000')).to be_an_instance_of CalculatedMatch
|
22
22
|
end
|
23
23
|
|
24
24
|
it "returns a failed match if the query is not numeric or coercible to numeric" do
|
25
25
|
calculator = RangeMatchCalculator.new 1..9, :match_payload_doesnt_matter
|
26
|
-
calculator.match("ABC").
|
26
|
+
expect(calculator.match("ABC")).to be_an_instance_of CalculatedMatch
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -14,14 +14,14 @@ module Adhearsion
|
|
14
14
|
calculator = StringMatchCalculator.new str, match_payload
|
15
15
|
|
16
16
|
match_case = calculator.match str[0,2]
|
17
|
-
match_case.
|
18
|
-
match_case.
|
19
|
-
match_case.potential_matches.
|
17
|
+
expect(match_case).not_to be_exact_match
|
18
|
+
expect(match_case).to be_potential_match
|
19
|
+
expect(match_case.potential_matches).to eq([str])
|
20
20
|
|
21
21
|
match_case = calculator.match str
|
22
|
-
match_case.
|
23
|
-
match_case.
|
24
|
-
match_case.exact_matches.
|
22
|
+
expect(match_case).to be_exact_match
|
23
|
+
expect(match_case).not_to be_potential_match
|
24
|
+
expect(match_case.exact_matches).to eq([str])
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
@@ -29,9 +29,9 @@ module Adhearsion
|
|
29
29
|
%w[* #].each do |special_digit|
|
30
30
|
calculator = StringMatchCalculator.new(special_digit, match_payload)
|
31
31
|
match_case = calculator.match special_digit
|
32
|
-
match_case.exact_matches.first.
|
33
|
-
match_case.
|
34
|
-
match_case.
|
32
|
+
expect(match_case.exact_matches.first).to eq(special_digit)
|
33
|
+
expect(match_case).to be_exact_match
|
34
|
+
expect(match_case).not_to be_potential_match
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
@@ -31,21 +31,21 @@ module Adhearsion
|
|
31
31
|
it "returns the component" do
|
32
32
|
component = Punchblock::Component::Output.new :ssml => content
|
33
33
|
expect_message_waiting_for_response component
|
34
|
-
subject.output(content).
|
34
|
+
expect(subject.output(content)).to be_a Punchblock::Component::Output
|
35
35
|
end
|
36
36
|
|
37
37
|
it "raises a PlaybackError if the component fails to start" do
|
38
38
|
expect_message_waiting_for_response Punchblock::Component::Output.new(:ssml => content), Punchblock::ProtocolError
|
39
|
-
|
39
|
+
expect { subject.output content }.to raise_error(PlaybackError)
|
40
40
|
end
|
41
41
|
|
42
42
|
it "logs the complete event if it is an error" do
|
43
43
|
response = Punchblock::Event::Complete.new
|
44
44
|
response.reason = Punchblock::Event::Complete::Error.new
|
45
45
|
component = Punchblock::Component::Output.new(:ssml => content)
|
46
|
-
subject.
|
46
|
+
allow(subject).to receive_messages :new_output => component
|
47
47
|
expect_message_waiting_for_response component
|
48
|
-
controller.logger.
|
48
|
+
expect(controller.logger).to receive(:error).once
|
49
49
|
subject.output content
|
50
50
|
component.request!
|
51
51
|
component.execute!
|
@@ -62,6 +62,16 @@ module Adhearsion
|
|
62
62
|
subject.play_ssml ssml
|
63
63
|
end
|
64
64
|
end
|
65
|
+
|
66
|
+
describe "#play_url" do
|
67
|
+
let(:url) { "http://example.com/ex.ssml" }
|
68
|
+
|
69
|
+
it 'executes an Output with the URL' do
|
70
|
+
component = Punchblock::Component::Output.new({render_document: {value: url, content_type: "application/ssml+xml"}})
|
71
|
+
expect_message_waiting_for_response component
|
72
|
+
subject.play_url url
|
73
|
+
end
|
74
|
+
end
|
65
75
|
end
|
66
76
|
end
|
67
77
|
end
|
@@ -15,11 +15,11 @@ module Adhearsion
|
|
15
15
|
end
|
16
16
|
|
17
17
|
it 'returns SSML for a text argument' do
|
18
|
-
subject.ssml_for(prompt).
|
18
|
+
expect(subject.ssml_for(prompt)).to eq(ssml)
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'returns the same SSML passed in if it is SSML' do
|
22
|
-
subject.ssml_for(ssml).
|
22
|
+
expect(subject.ssml_for(ssml)).to eq(ssml)
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -39,60 +39,60 @@ module Adhearsion
|
|
39
39
|
end
|
40
40
|
|
41
41
|
it "should create a composite SSML document" do
|
42
|
-
subject.ssml_for_collection(collection).
|
42
|
+
expect(subject.ssml_for_collection(collection)).to eq(ssml)
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
46
|
describe "#detect_type" do
|
47
47
|
it "detects an HTTP path" do
|
48
48
|
http_path = "http://adhearsion.com/sounds/hello.mp3"
|
49
|
-
subject.detect_type(http_path).
|
49
|
+
expect(subject.detect_type(http_path)).to be :audio
|
50
50
|
end
|
51
51
|
|
52
52
|
it "detects a file path" do
|
53
53
|
file_path = "file:///usr/shared/sounds/hello.mp3"
|
54
|
-
subject.detect_type(file_path).
|
54
|
+
expect(subject.detect_type(file_path)).to be :audio
|
55
55
|
|
56
56
|
absolute_path = "/usr/shared/sounds/hello.mp3"
|
57
|
-
subject.detect_type(absolute_path).
|
57
|
+
expect(subject.detect_type(absolute_path)).to be :audio
|
58
58
|
|
59
59
|
relative_path = "foo/bar"
|
60
|
-
subject.detect_type(relative_path).
|
60
|
+
expect(subject.detect_type(relative_path)).not_to be :audio
|
61
61
|
end
|
62
62
|
|
63
63
|
it "detects a Date object" do
|
64
64
|
today = Date.today
|
65
|
-
subject.detect_type(today).
|
65
|
+
expect(subject.detect_type(today)).to be :time
|
66
66
|
end
|
67
67
|
|
68
68
|
it "detects a Time object" do
|
69
69
|
now = Time.now
|
70
|
-
subject.detect_type(now).
|
70
|
+
expect(subject.detect_type(now)).to be :time
|
71
71
|
end
|
72
72
|
|
73
73
|
it "detects a DateTime object" do
|
74
74
|
today = DateTime.now
|
75
|
-
subject.detect_type(today).
|
75
|
+
expect(subject.detect_type(today)).to be :time
|
76
76
|
end
|
77
77
|
|
78
78
|
it "detects a Numeric object" do
|
79
79
|
number = 123
|
80
|
-
subject.detect_type(number).
|
80
|
+
expect(subject.detect_type(number)).to be :numeric
|
81
81
|
end
|
82
82
|
|
83
83
|
it "detects a String of digits" do
|
84
84
|
number = '123'
|
85
|
-
subject.detect_type(number).
|
85
|
+
expect(subject.detect_type(number)).to be :numeric
|
86
86
|
end
|
87
87
|
|
88
88
|
it "detects a String of characters" do
|
89
89
|
number = '123#'
|
90
|
-
subject.detect_type(number).
|
90
|
+
expect(subject.detect_type(number)).to be :characters
|
91
91
|
end
|
92
92
|
|
93
93
|
["Foo", "Foo bar", "The answer: foo", "The answer could be foo/bar"].each do |string|
|
94
94
|
it "detects '#{string}' as text" do
|
95
|
-
subject.detect_type(string).
|
95
|
+
expect(subject.detect_type(string)).to be :text
|
96
96
|
end
|
97
97
|
end
|
98
98
|
end
|
@@ -30,7 +30,7 @@ module Adhearsion
|
|
30
30
|
it "yields the component to the block before waiting for it to finish" do
|
31
31
|
component = Punchblock::Component::Output.new :ssml => content
|
32
32
|
|
33
|
-
controller.
|
33
|
+
expect(controller).to receive(:execute_component_and_await_completion).once.with(component).and_yield(:foo)
|
34
34
|
|
35
35
|
@foo = nil
|
36
36
|
|
@@ -38,22 +38,22 @@ module Adhearsion
|
|
38
38
|
@foo = comp
|
39
39
|
end
|
40
40
|
|
41
|
-
@foo.
|
41
|
+
expect(@foo).to eq(:foo)
|
42
42
|
end
|
43
43
|
|
44
44
|
it "raises a PlaybackError if the component fails to start" do
|
45
45
|
expect_component_execution Punchblock::Component::Output.new(:ssml => content), Punchblock::ProtocolError
|
46
|
-
|
46
|
+
expect { subject.output content }.to raise_error(PlaybackError)
|
47
47
|
end
|
48
48
|
|
49
49
|
it "raises a Playback Error if the component ends due to an error" do
|
50
50
|
expect_component_execution Punchblock::Component::Output.new(:ssml => content), Adhearsion::Error
|
51
|
-
|
51
|
+
expect { subject.output content }.to raise_error(PlaybackError)
|
52
52
|
end
|
53
53
|
|
54
54
|
it "raises a Call::Hangup exception if the component ends due to an error" do
|
55
55
|
expect_component_execution Punchblock::Component::Output.new(:ssml => content), Call::Hangup
|
56
|
-
|
56
|
+
expect { subject.output content }.to raise_error(Call::Hangup)
|
57
57
|
end
|
58
58
|
end
|
59
59
|
|
@@ -65,6 +65,16 @@ module Adhearsion
|
|
65
65
|
subject.play_ssml ssml
|
66
66
|
end
|
67
67
|
end
|
68
|
+
|
69
|
+
describe "#play_url" do
|
70
|
+
let(:url) { "http://example.com/ex.ssml" }
|
71
|
+
|
72
|
+
it 'executes an Output with the URL' do
|
73
|
+
component = Punchblock::Component::Output.new({render_document: {value: url, content_type: "application/ssml+xml"}})
|
74
|
+
expect_component_execution component
|
75
|
+
subject.play_url url
|
76
|
+
end
|
77
|
+
end
|
68
78
|
end
|
69
79
|
end
|
70
80
|
end
|
@@ -16,19 +16,29 @@ module Adhearsion
|
|
16
16
|
expect_message_waiting_for_response Punchblock::Component::Output.new(options.merge(:ssml => ssml))
|
17
17
|
end
|
18
18
|
|
19
|
+
def expect_url_output(url, options = {})
|
20
|
+
component = Punchblock::Component::Output.new(options.merge(render_document: {value: url, content_type: "application/ssml+xml"}))
|
21
|
+
expect_component_execution component
|
22
|
+
end
|
23
|
+
|
24
|
+
def expect_async_url_output(url, options = {})
|
25
|
+
component = Punchblock::Component::Output.new(options.merge(render_document: {value: url, content_type: "application/ssml+xml"}))
|
26
|
+
expect_message_waiting_for_response component
|
27
|
+
end
|
28
|
+
|
19
29
|
describe "#player" do
|
20
30
|
it "should return a Player component targetted at the current controller" do
|
21
31
|
player = controller.player
|
22
|
-
player.
|
23
|
-
player.controller.
|
32
|
+
expect(player).to be_a Output::Player
|
33
|
+
expect(player.controller).to be controller
|
24
34
|
end
|
25
35
|
end
|
26
36
|
|
27
37
|
describe "#async_player" do
|
28
38
|
it "should return an AsyncPlayer component targetted at the current controller" do
|
29
39
|
player = controller.async_player
|
30
|
-
player.
|
31
|
-
player.controller.
|
40
|
+
expect(player).to be_a Output::AsyncPlayer
|
41
|
+
expect(player.controller).to be controller
|
32
42
|
end
|
33
43
|
end
|
34
44
|
|
@@ -42,7 +52,7 @@ module Adhearsion
|
|
42
52
|
|
43
53
|
it 'plays the correct ssml' do
|
44
54
|
expect_ssml_output ssml
|
45
|
-
subject.play_audio(audio_file).
|
55
|
+
expect(subject.play_audio(audio_file)).to be true
|
46
56
|
end
|
47
57
|
|
48
58
|
context "with a fallback" do
|
@@ -58,7 +68,7 @@ module Adhearsion
|
|
58
68
|
|
59
69
|
it 'places the fallback in the SSML doc' do
|
60
70
|
expect_ssml_output ssml
|
61
|
-
subject.play_audio(audio_file, :fallback => fallback).
|
71
|
+
expect(subject.play_audio(audio_file, :fallback => fallback)).to be true
|
62
72
|
end
|
63
73
|
end
|
64
74
|
|
@@ -66,7 +76,7 @@ module Adhearsion
|
|
66
76
|
let(:media_engine) { :native }
|
67
77
|
it "should use the specified media engine in the component" do
|
68
78
|
expect_ssml_output ssml, renderer: media_engine
|
69
|
-
subject.play_audio(audio_file, renderer: media_engine).
|
79
|
+
expect(subject.play_audio(audio_file, renderer: media_engine)).to be true
|
70
80
|
end
|
71
81
|
end
|
72
82
|
end
|
@@ -81,7 +91,7 @@ module Adhearsion
|
|
81
91
|
|
82
92
|
it 'plays the correct ssml' do
|
83
93
|
expect_async_ssml_output ssml
|
84
|
-
subject.play_audio!(audio_file).
|
94
|
+
expect(subject.play_audio!(audio_file)).to be_a Punchblock::Component::Output
|
85
95
|
end
|
86
96
|
|
87
97
|
context "with a fallback" do
|
@@ -97,7 +107,7 @@ module Adhearsion
|
|
97
107
|
|
98
108
|
it 'places the fallback in the SSML doc' do
|
99
109
|
expect_async_ssml_output ssml
|
100
|
-
subject.play_audio!(audio_file, :fallback => fallback).
|
110
|
+
expect(subject.play_audio!(audio_file, :fallback => fallback)).to be_a Punchblock::Component::Output
|
101
111
|
end
|
102
112
|
end
|
103
113
|
|
@@ -105,7 +115,7 @@ module Adhearsion
|
|
105
115
|
let(:media_engine) { :native }
|
106
116
|
it "should use the specified media engine in the SSML" do
|
107
117
|
expect_async_ssml_output ssml, renderer: media_engine
|
108
|
-
subject.play_audio!(audio_file, renderer: media_engine).
|
118
|
+
expect(subject.play_audio!(audio_file, renderer: media_engine)).to be_a Punchblock::Component::Output
|
109
119
|
end
|
110
120
|
end
|
111
121
|
end
|
@@ -122,7 +132,7 @@ module Adhearsion
|
|
122
132
|
|
123
133
|
it 'plays the correct ssml' do
|
124
134
|
expect_ssml_output ssml
|
125
|
-
subject.play_numeric(input).
|
135
|
+
expect(subject.play_numeric(input)).to be true
|
126
136
|
end
|
127
137
|
end
|
128
138
|
|
@@ -131,7 +141,7 @@ module Adhearsion
|
|
131
141
|
|
132
142
|
it 'plays the correct ssml' do
|
133
143
|
expect_ssml_output ssml
|
134
|
-
subject.play_numeric(input).
|
144
|
+
expect(subject.play_numeric(input)).to be true
|
135
145
|
end
|
136
146
|
end
|
137
147
|
|
@@ -139,7 +149,7 @@ module Adhearsion
|
|
139
149
|
let(:input) { 'foo' }
|
140
150
|
|
141
151
|
it 'raises ArgumentError' do
|
142
|
-
|
152
|
+
expect { subject.play_numeric input }.to raise_error(ArgumentError)
|
143
153
|
end
|
144
154
|
end
|
145
155
|
|
@@ -149,7 +159,7 @@ module Adhearsion
|
|
149
159
|
|
150
160
|
it "should use the specified renderer in the SSML" do
|
151
161
|
expect_ssml_output ssml, renderer: renderer
|
152
|
-
subject.play_numeric(input, renderer: renderer).
|
162
|
+
expect(subject.play_numeric(input, renderer: renderer)).to be true
|
153
163
|
end
|
154
164
|
end
|
155
165
|
end
|
@@ -166,7 +176,7 @@ module Adhearsion
|
|
166
176
|
|
167
177
|
it 'plays the correct ssml' do
|
168
178
|
expect_async_ssml_output ssml
|
169
|
-
subject.play_numeric!(input).
|
179
|
+
expect(subject.play_numeric!(input)).to be_a Punchblock::Component::Output
|
170
180
|
end
|
171
181
|
end
|
172
182
|
|
@@ -175,7 +185,7 @@ module Adhearsion
|
|
175
185
|
|
176
186
|
it 'plays the correct ssml' do
|
177
187
|
expect_async_ssml_output ssml
|
178
|
-
subject.play_numeric!(input).
|
188
|
+
expect(subject.play_numeric!(input)).to be_a Punchblock::Component::Output
|
179
189
|
end
|
180
190
|
end
|
181
191
|
|
@@ -183,7 +193,7 @@ module Adhearsion
|
|
183
193
|
let(:input) { 'foo' }
|
184
194
|
|
185
195
|
it 'raises ArgumentError' do
|
186
|
-
|
196
|
+
expect { subject.play_numeric! input }.to raise_error(ArgumentError)
|
187
197
|
end
|
188
198
|
end
|
189
199
|
|
@@ -193,7 +203,45 @@ module Adhearsion
|
|
193
203
|
|
194
204
|
it "should use the specified renderer in the SSML" do
|
195
205
|
expect_async_ssml_output ssml, renderer: renderer
|
196
|
-
subject.play_numeric!(input, renderer: renderer).
|
206
|
+
expect(subject.play_numeric!(input, renderer: renderer)).to be_a Punchblock::Component::Output
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
describe "#play_document" do
|
212
|
+
describe "with a URL" do
|
213
|
+
let(:input) { 'http://example.com/ex.ssml' }
|
214
|
+
|
215
|
+
it 'plays the url' do
|
216
|
+
expect_url_output input
|
217
|
+
expect(subject.play_document(input)).to be true
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
describe "with something that's not a URL" do
|
222
|
+
let(:input) { 'ceci n\'est pas une url' }
|
223
|
+
|
224
|
+
it 'raises ArgumentError' do
|
225
|
+
expect { subject.play_document input }.to raise_error(ArgumentError)
|
226
|
+
end
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
describe "#play_document!" do
|
231
|
+
describe "with a URL" do
|
232
|
+
let(:input) { 'http://example.com/ex.ssml' }
|
233
|
+
|
234
|
+
it 'plays the url' do
|
235
|
+
expect_async_url_output input
|
236
|
+
expect(subject.play_document!(input)).to be_a Punchblock::Component::Output
|
237
|
+
end
|
238
|
+
end
|
239
|
+
|
240
|
+
describe "with something that's not a URL" do
|
241
|
+
let(:input) { 'ceci n\'est pas une url' }
|
242
|
+
|
243
|
+
it 'raises ArgumentError' do
|
244
|
+
expect { subject.play_document! input }.to raise_error(ArgumentError)
|
197
245
|
end
|
198
246
|
end
|
199
247
|
end
|
@@ -213,7 +261,7 @@ module Adhearsion
|
|
213
261
|
|
214
262
|
it 'plays the correct SSML' do
|
215
263
|
expect_ssml_output ssml
|
216
|
-
subject.play_time(input).
|
264
|
+
expect(subject.play_time(input)).to be true
|
217
265
|
end
|
218
266
|
end
|
219
267
|
|
@@ -223,7 +271,7 @@ module Adhearsion
|
|
223
271
|
|
224
272
|
it 'plays the correct SSML' do
|
225
273
|
expect_ssml_output ssml
|
226
|
-
subject.play_time(input).
|
274
|
+
expect(subject.play_time(input)).to be true
|
227
275
|
end
|
228
276
|
end
|
229
277
|
|
@@ -234,7 +282,7 @@ module Adhearsion
|
|
234
282
|
|
235
283
|
it 'plays the correct SSML' do
|
236
284
|
expect_ssml_output ssml
|
237
|
-
subject.play_time(input, :format => format).
|
285
|
+
expect(subject.play_time(input, :format => format)).to be true
|
238
286
|
end
|
239
287
|
end
|
240
288
|
|
@@ -246,7 +294,7 @@ module Adhearsion
|
|
246
294
|
|
247
295
|
it 'plays the correct SSML' do
|
248
296
|
expect_ssml_output ssml
|
249
|
-
subject.play_time(base_input, :strftime => strftime).
|
297
|
+
expect(subject.play_time(base_input, :strftime => strftime)).to be true
|
250
298
|
end
|
251
299
|
end
|
252
300
|
|
@@ -259,7 +307,7 @@ module Adhearsion
|
|
259
307
|
|
260
308
|
it 'plays the correct SSML' do
|
261
309
|
expect_ssml_output ssml
|
262
|
-
subject.play_time(base_input, :format => format, :strftime => strftime).
|
310
|
+
expect(subject.play_time(base_input, :format => format, :strftime => strftime)).to be true
|
263
311
|
end
|
264
312
|
end
|
265
313
|
|
@@ -271,7 +319,7 @@ module Adhearsion
|
|
271
319
|
|
272
320
|
it "should use the specified renderer in the SSML" do
|
273
321
|
expect_ssml_output ssml, renderer: renderer
|
274
|
-
subject.play_time(input, format: format, renderer: renderer).
|
322
|
+
expect(subject.play_time(input, format: format, renderer: renderer)).to be true
|
275
323
|
end
|
276
324
|
end
|
277
325
|
|
@@ -279,7 +327,7 @@ module Adhearsion
|
|
279
327
|
let(:input) { "foo" }
|
280
328
|
|
281
329
|
it 'raises ArgumentError' do
|
282
|
-
|
330
|
+
expect { subject.play_time input }.to raise_error(ArgumentError)
|
283
331
|
end
|
284
332
|
end
|
285
333
|
end
|
@@ -299,7 +347,7 @@ module Adhearsion
|
|
299
347
|
|
300
348
|
it 'plays the correct SSML' do
|
301
349
|
expect_async_ssml_output ssml
|
302
|
-
subject.play_time!(input).
|
350
|
+
expect(subject.play_time!(input)).to be_a Punchblock::Component::Output
|
303
351
|
end
|
304
352
|
end
|
305
353
|
|
@@ -309,7 +357,7 @@ module Adhearsion
|
|
309
357
|
|
310
358
|
it 'plays the correct SSML' do
|
311
359
|
expect_async_ssml_output ssml
|
312
|
-
subject.play_time!(input).
|
360
|
+
expect(subject.play_time!(input)).to be_a Punchblock::Component::Output
|
313
361
|
end
|
314
362
|
end
|
315
363
|
|
@@ -320,7 +368,7 @@ module Adhearsion
|
|
320
368
|
|
321
369
|
it 'plays the correct SSML' do
|
322
370
|
expect_async_ssml_output ssml
|
323
|
-
subject.play_time!(input, :format => format).
|
371
|
+
expect(subject.play_time!(input, :format => format)).to be_a Punchblock::Component::Output
|
324
372
|
end
|
325
373
|
end
|
326
374
|
|
@@ -332,7 +380,7 @@ module Adhearsion
|
|
332
380
|
|
333
381
|
it 'plays the correct SSML' do
|
334
382
|
expect_async_ssml_output ssml
|
335
|
-
subject.play_time!(base_input, :strftime => strftime).
|
383
|
+
expect(subject.play_time!(base_input, :strftime => strftime)).to be_a Punchblock::Component::Output
|
336
384
|
end
|
337
385
|
end
|
338
386
|
|
@@ -345,7 +393,7 @@ module Adhearsion
|
|
345
393
|
|
346
394
|
it 'plays the correct SSML' do
|
347
395
|
expect_async_ssml_output ssml
|
348
|
-
subject.play_time!(base_input, :format => format, :strftime => strftime).
|
396
|
+
expect(subject.play_time!(base_input, :format => format, :strftime => strftime)).to be_a Punchblock::Component::Output
|
349
397
|
end
|
350
398
|
end
|
351
399
|
|
@@ -357,7 +405,7 @@ module Adhearsion
|
|
357
405
|
|
358
406
|
it "should use the specified renderer in the SSML" do
|
359
407
|
expect_async_ssml_output ssml, renderer: renderer
|
360
|
-
subject.play_time!(input, format: format, renderer: renderer).
|
408
|
+
expect(subject.play_time!(input, format: format, renderer: renderer)).to be_a Punchblock::Component::Output
|
361
409
|
end
|
362
410
|
end
|
363
411
|
|
@@ -365,7 +413,7 @@ module Adhearsion
|
|
365
413
|
let(:input) { "foo" }
|
366
414
|
|
367
415
|
it 'raises ArgumentError' do
|
368
|
-
|
416
|
+
expect { subject.play_time! input }.to raise_error(ArgumentError)
|
369
417
|
end
|
370
418
|
end
|
371
419
|
end
|
@@ -390,12 +438,12 @@ module Adhearsion
|
|
390
438
|
|
391
439
|
it 'plays the audio file' do
|
392
440
|
expect_ssml_output ssml
|
393
|
-
subject.play(audio_file).
|
441
|
+
expect(subject.play(audio_file)).to be true
|
394
442
|
end
|
395
443
|
|
396
444
|
it 'plays the audio file with the specified extra options if present' do
|
397
445
|
expect_ssml_output ssml, extra_options
|
398
|
-
subject.play(audio_file, extra_options).
|
446
|
+
expect(subject.play(audio_file, extra_options)).to be true
|
399
447
|
end
|
400
448
|
end
|
401
449
|
|
@@ -416,13 +464,13 @@ module Adhearsion
|
|
416
464
|
|
417
465
|
it 'plays all arguments in one document' do
|
418
466
|
expect_ssml_output ssml
|
419
|
-
subject.play(*args).
|
467
|
+
expect(subject.play(*args)).to be true
|
420
468
|
end
|
421
469
|
|
422
470
|
it 'plays all arguments in one document with the extra options if present' do
|
423
471
|
expect_ssml_output ssml, extra_options
|
424
472
|
args << extra_options
|
425
|
-
subject.play(*args).
|
473
|
+
expect(subject.play(*args)).to be true
|
426
474
|
end
|
427
475
|
end
|
428
476
|
|
@@ -441,7 +489,7 @@ module Adhearsion
|
|
441
489
|
|
442
490
|
it 'plays all arguments in one document' do
|
443
491
|
expect_ssml_output ssml
|
444
|
-
subject.play(args).
|
492
|
+
expect(subject.play(args)).to be true
|
445
493
|
end
|
446
494
|
|
447
495
|
context "that is empty" do
|
@@ -463,7 +511,7 @@ module Adhearsion
|
|
463
511
|
|
464
512
|
it 'plays the number' do
|
465
513
|
expect_ssml_output ssml
|
466
|
-
subject.play(argument).
|
514
|
+
expect(subject.play(argument)).to be true
|
467
515
|
end
|
468
516
|
end
|
469
517
|
|
@@ -479,7 +527,7 @@ module Adhearsion
|
|
479
527
|
|
480
528
|
it 'plays the number' do
|
481
529
|
expect_ssml_output ssml
|
482
|
-
subject.play(argument).
|
530
|
+
expect(subject.play(argument)).to be true
|
483
531
|
end
|
484
532
|
end
|
485
533
|
|
@@ -495,7 +543,7 @@ module Adhearsion
|
|
495
543
|
|
496
544
|
it 'plays the time' do
|
497
545
|
expect_ssml_output ssml
|
498
|
-
subject.play(time).
|
546
|
+
expect(subject.play(time)).to be true
|
499
547
|
end
|
500
548
|
end
|
501
549
|
|
@@ -510,7 +558,7 @@ module Adhearsion
|
|
510
558
|
|
511
559
|
it 'plays the time' do
|
512
560
|
expect_ssml_output ssml
|
513
|
-
subject.play(date).
|
561
|
+
expect(subject.play(date)).to be true
|
514
562
|
end
|
515
563
|
end
|
516
564
|
|
@@ -529,7 +577,7 @@ module Adhearsion
|
|
529
577
|
|
530
578
|
it 'plays the time with the specified format and strftime' do
|
531
579
|
expect_ssml_output ssml
|
532
|
-
subject.play(:value => date, :format => format, :strftime => strftime).
|
580
|
+
expect(subject.play(:value => date, :format => format, :strftime => strftime)).to be true
|
533
581
|
end
|
534
582
|
end
|
535
583
|
|
@@ -538,7 +586,7 @@ module Adhearsion
|
|
538
586
|
|
539
587
|
it "plays the SSML without generating" do
|
540
588
|
expect_ssml_output ssml
|
541
|
-
subject.play(ssml).
|
589
|
+
expect(subject.play(ssml)).to be true
|
542
590
|
end
|
543
591
|
end
|
544
592
|
end
|
@@ -563,7 +611,7 @@ module Adhearsion
|
|
563
611
|
|
564
612
|
it 'plays the audio file' do
|
565
613
|
expect_async_ssml_output ssml
|
566
|
-
subject.play!(audio_file).
|
614
|
+
expect(subject.play!(audio_file)).to be_a Punchblock::Component::Output
|
567
615
|
end
|
568
616
|
|
569
617
|
it 'plays the audio file with the specified extra options if present' do
|
@@ -587,7 +635,7 @@ module Adhearsion
|
|
587
635
|
|
588
636
|
it 'plays all arguments in one document' do
|
589
637
|
expect_async_ssml_output ssml
|
590
|
-
subject.play!(*args).
|
638
|
+
expect(subject.play!(*args)).to be_a Punchblock::Component::Output
|
591
639
|
end
|
592
640
|
|
593
641
|
it 'plays all arguments in one document with the extra options if present' do
|
@@ -609,7 +657,7 @@ module Adhearsion
|
|
609
657
|
|
610
658
|
it 'plays the number' do
|
611
659
|
expect_async_ssml_output ssml
|
612
|
-
subject.play!(argument).
|
660
|
+
expect(subject.play!(argument)).to be_a Punchblock::Component::Output
|
613
661
|
end
|
614
662
|
end
|
615
663
|
|
@@ -625,7 +673,7 @@ module Adhearsion
|
|
625
673
|
|
626
674
|
it 'plays the number' do
|
627
675
|
expect_async_ssml_output ssml
|
628
|
-
subject.play!(argument).
|
676
|
+
expect(subject.play!(argument)).to be_a Punchblock::Component::Output
|
629
677
|
end
|
630
678
|
end
|
631
679
|
|
@@ -641,7 +689,7 @@ module Adhearsion
|
|
641
689
|
|
642
690
|
it 'plays the time' do
|
643
691
|
expect_async_ssml_output ssml
|
644
|
-
subject.play!(time).
|
692
|
+
expect(subject.play!(time)).to be_a Punchblock::Component::Output
|
645
693
|
end
|
646
694
|
end
|
647
695
|
|
@@ -656,7 +704,7 @@ module Adhearsion
|
|
656
704
|
|
657
705
|
it 'plays the time' do
|
658
706
|
expect_async_ssml_output ssml
|
659
|
-
subject.play!(date).
|
707
|
+
expect(subject.play!(date)).to be_a Punchblock::Component::Output
|
660
708
|
end
|
661
709
|
end
|
662
710
|
|
@@ -675,7 +723,7 @@ module Adhearsion
|
|
675
723
|
|
676
724
|
it 'plays the time with the specified format and strftime' do
|
677
725
|
expect_async_ssml_output ssml
|
678
|
-
subject.play!(:value => date, :format => format, :strftime => strftime).
|
726
|
+
expect(subject.play!(:value => date, :format => format, :strftime => strftime)).to be_a Punchblock::Component::Output
|
679
727
|
end
|
680
728
|
end
|
681
729
|
|
@@ -684,7 +732,7 @@ module Adhearsion
|
|
684
732
|
|
685
733
|
it "plays the SSML without generating" do
|
686
734
|
expect_async_ssml_output ssml
|
687
|
-
subject.play!(ssml).
|
735
|
+
expect(subject.play!(ssml)).to be_a Punchblock::Component::Output
|
688
736
|
end
|
689
737
|
end
|
690
738
|
end
|
@@ -696,26 +744,26 @@ module Adhearsion
|
|
696
744
|
let(:extra_options) { {renderer: :native } }
|
697
745
|
|
698
746
|
it "plays two outputs in succession" do
|
699
|
-
subject.
|
747
|
+
expect(subject).to receive(:stream_file).twice
|
700
748
|
digit = subject.interruptible_play output1, output2
|
701
|
-
digit.
|
749
|
+
expect(digit).to be_nil
|
702
750
|
end
|
703
751
|
|
704
752
|
it "stops at the first play when input is received" do
|
705
|
-
subject.
|
753
|
+
expect(subject).to receive(:stream_file).once.and_return(2)
|
706
754
|
digit = subject.interruptible_play output1, output2
|
707
|
-
digit.
|
755
|
+
expect(digit).to eq(2)
|
708
756
|
end
|
709
757
|
|
710
758
|
it "passes options on to #stream_file" do
|
711
|
-
subject.
|
712
|
-
subject.
|
759
|
+
expect(subject).to receive(:stream_file).once.with(output1, '0123456789#*', extra_options)
|
760
|
+
expect(subject).to receive(:stream_file).once.with(output2, '0123456789#*', extra_options)
|
713
761
|
digit = subject.interruptible_play output1, output2, extra_options
|
714
|
-
digit.
|
762
|
+
expect(digit).to be_nil
|
715
763
|
end
|
716
764
|
|
717
765
|
it 'raises an exception when output is unsuccessful' do
|
718
|
-
subject.
|
766
|
+
expect(subject).to receive(:stream_file).once.and_raise Output::PlaybackError, "Output failed"
|
719
767
|
expect { subject.interruptible_play non_existing }.to raise_error(Output::PlaybackError)
|
720
768
|
end
|
721
769
|
end
|
@@ -755,7 +803,7 @@ module Adhearsion
|
|
755
803
|
|
756
804
|
#test does pass and method works, but not sure if the empty method is a good idea
|
757
805
|
it "plays the correct output" do
|
758
|
-
controller.
|
806
|
+
allow(controller).to receive(:write_and_await_response)
|
759
807
|
|
760
808
|
expect_component_complete_event
|
761
809
|
expect_component_execution Punchblock::Component::Output.new(:ssml => ssml)
|
@@ -763,23 +811,23 @@ module Adhearsion
|
|
763
811
|
end
|
764
812
|
|
765
813
|
it "returns a single digit amongst the allowed when pressed" do
|
766
|
-
controller.
|
814
|
+
expect(controller).to receive(:write_and_await_response).with(kind_of(Punchblock::Component::Input)) do |input_component|
|
767
815
|
input_component.trigger_event_handler Punchblock::Event::Complete.new
|
768
816
|
end
|
769
817
|
|
770
|
-
controller.
|
818
|
+
expect(controller).to receive(:write_and_await_response).once.with(kind_of(Punchblock::Component::Output))
|
771
819
|
|
772
|
-
Punchblock::Component::Output.
|
773
|
-
Punchblock::Component::Output.
|
820
|
+
expect_any_instance_of(Punchblock::Component::Output).to receive(:stop!)
|
821
|
+
expect_any_instance_of(Punchblock::Component::Output).to receive(:complete_event).and_return double('complete', reason: double('Reason'))
|
774
822
|
expect_input_component_complete_event 'dtmf-5'
|
775
823
|
|
776
|
-
subject.stream_file(prompt, allowed_digits).
|
824
|
+
expect(subject.stream_file(prompt, allowed_digits)).to eq('5')
|
777
825
|
end
|
778
826
|
|
779
827
|
context "with output options passed in" do
|
780
828
|
let(:extra_options) { {renderer: :native } }
|
781
829
|
it "plays the correct output with options" do
|
782
|
-
controller.
|
830
|
+
allow(controller).to receive(:write_and_await_response)
|
783
831
|
|
784
832
|
expect_component_complete_event
|
785
833
|
expect_component_execution Punchblock::Component::Output.new({:ssml => ssml}.merge(extra_options))
|
@@ -799,7 +847,7 @@ module Adhearsion
|
|
799
847
|
it 'plays the correct SSML' do
|
800
848
|
ssml = RubySpeech::SSML.draw { string "Hello world" }
|
801
849
|
expect_ssml_output ssml
|
802
|
-
subject.say(ssml).
|
850
|
+
expect(subject.say(ssml)).to be_a Punchblock::Component::Output
|
803
851
|
end
|
804
852
|
end
|
805
853
|
|
@@ -808,7 +856,7 @@ module Adhearsion
|
|
808
856
|
str = "Hello world"
|
809
857
|
ssml = RubySpeech::SSML.draw { string str }
|
810
858
|
expect_ssml_output ssml
|
811
|
-
subject.say(str).
|
859
|
+
expect(subject.say(str)).to be_a Punchblock::Component::Output
|
812
860
|
end
|
813
861
|
end
|
814
862
|
|
@@ -881,14 +929,14 @@ module Adhearsion
|
|
881
929
|
argument = 123
|
882
930
|
ssml = RubySpeech::SSML.draw { string '123' }
|
883
931
|
expect_ssml_output ssml
|
884
|
-
subject.say(argument).
|
932
|
+
expect(subject.say(argument)).to be_a Punchblock::Component::Output
|
885
933
|
end
|
886
934
|
end
|
887
935
|
end
|
888
936
|
|
889
937
|
describe "#speak" do
|
890
938
|
it "should be an alias for #say" do
|
891
|
-
subject.method(:speak).
|
939
|
+
expect(subject.method(:speak)).to eq(subject.method(:say))
|
892
940
|
end
|
893
941
|
end
|
894
942
|
|
@@ -903,7 +951,7 @@ module Adhearsion
|
|
903
951
|
it 'plays the correct SSML' do
|
904
952
|
ssml = RubySpeech::SSML.draw { string "Hello world" }
|
905
953
|
expect_async_ssml_output ssml
|
906
|
-
subject.say!(ssml).
|
954
|
+
expect(subject.say!(ssml)).to be_a Punchblock::Component::Output
|
907
955
|
end
|
908
956
|
end
|
909
957
|
|
@@ -912,7 +960,7 @@ module Adhearsion
|
|
912
960
|
str = "Hello world"
|
913
961
|
ssml = RubySpeech::SSML.draw { string str }
|
914
962
|
expect_async_ssml_output ssml
|
915
|
-
subject.say!(str).
|
963
|
+
expect(subject.say!(str)).to be_a Punchblock::Component::Output
|
916
964
|
end
|
917
965
|
end
|
918
966
|
|
@@ -985,14 +1033,14 @@ module Adhearsion
|
|
985
1033
|
argument = 123
|
986
1034
|
ssml = RubySpeech::SSML.draw { string '123' }
|
987
1035
|
expect_async_ssml_output ssml
|
988
|
-
subject.say!(argument).
|
1036
|
+
expect(subject.say!(argument)).to be_a Punchblock::Component::Output
|
989
1037
|
end
|
990
1038
|
end
|
991
1039
|
end
|
992
1040
|
|
993
1041
|
describe "#speak!" do
|
994
1042
|
it "should be an alias for #say!" do
|
995
|
-
subject.method(:speak!).
|
1043
|
+
expect(subject.method(:speak!)).to eq(subject.method(:say!))
|
996
1044
|
end
|
997
1045
|
end
|
998
1046
|
|
@@ -1006,7 +1054,7 @@ module Adhearsion
|
|
1006
1054
|
|
1007
1055
|
it 'plays the correct ssml' do
|
1008
1056
|
expect_ssml_output ssml
|
1009
|
-
subject.say_characters('1234#abc').
|
1057
|
+
expect(subject.say_characters('1234#abc')).to be true
|
1010
1058
|
end
|
1011
1059
|
end
|
1012
1060
|
|
@@ -1019,7 +1067,7 @@ module Adhearsion
|
|
1019
1067
|
|
1020
1068
|
it 'plays the correct ssml' do
|
1021
1069
|
expect_ssml_output ssml
|
1022
|
-
subject.say_characters(1234).
|
1070
|
+
expect(subject.say_characters(1234)).to be true
|
1023
1071
|
end
|
1024
1072
|
end
|
1025
1073
|
end
|
@@ -1034,7 +1082,7 @@ module Adhearsion
|
|
1034
1082
|
|
1035
1083
|
it 'plays the correct ssml' do
|
1036
1084
|
expect_async_ssml_output ssml
|
1037
|
-
subject.say_characters!('1234#abc').
|
1085
|
+
expect(subject.say_characters!('1234#abc')).to be_a Punchblock::Component::Output
|
1038
1086
|
end
|
1039
1087
|
end
|
1040
1088
|
|
@@ -1047,7 +1095,7 @@ module Adhearsion
|
|
1047
1095
|
|
1048
1096
|
it 'plays the correct ssml' do
|
1049
1097
|
expect_async_ssml_output ssml
|
1050
|
-
subject.say_characters!(1234).
|
1098
|
+
expect(subject.say_characters!(1234)).to be_a Punchblock::Component::Output
|
1051
1099
|
end
|
1052
1100
|
end
|
1053
1101
|
end
|