adhearsion-asterisk 1.3.1 → 1.4.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 +7 -0
- data/.gitignore +1 -0
- data/CHANGELOG.md +3 -0
- data/adhearsion-asterisk.gemspec +5 -8
- data/lib/adhearsion/asterisk/call_controller_methods.rb +13 -0
- data/lib/adhearsion/asterisk/version.rb +1 -1
- data/spec/adhearsion/asterisk/call_controller_methods_spec.rb +117 -73
- data/spec/adhearsion/asterisk/config_generators/agents_spec.rb +2 -2
- data/spec/adhearsion/asterisk/config_generators/queues_spec.rb +15 -15
- data/spec/adhearsion/asterisk/config_manager_spec.rb +1 -1
- data/spec/adhearsion/asterisk/plugin_spec.rb +1 -1
- data/spec/adhearsion/asterisk/queue_proxy/agent_proxy_spec.rb +20 -20
- data/spec/adhearsion/asterisk/queue_proxy/queue_agents_list_proxy_spec.rb +35 -35
- data/spec/adhearsion/asterisk/queue_proxy_spec.rb +41 -41
- data/spec/spec_helper.rb +0 -2
- metadata +37 -115
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a687c0732e8408239c867b8480924c6206084bf4
|
4
|
+
data.tar.gz: 3baa0d3876880a58b2ad5376af3d2614cb47a418
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d8dff1e952c3ae79c2c71713b98b4bf9cebfad82a5e917cf5d0491983051157b8e8ac96b7acbcda8a73030a322fbfe401cce664b13773c68846dfb4a17ba9c8f
|
7
|
+
data.tar.gz: fba213383d1700cdd1915a44d3c6649ef6f441b35e48087924d224da7a3c446aa4367200ae644c3a98c64bccda5a767cd6a756b22d1b0826b682f2b8638c8302
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
data/adhearsion-asterisk.gemspec
CHANGED
@@ -19,19 +19,16 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.require_paths = ["lib"]
|
20
20
|
|
21
21
|
s.add_runtime_dependency %q<adhearsion>, ["~> 2.0"]
|
22
|
-
s.add_runtime_dependency %q<activesupport>, ["
|
22
|
+
s.add_runtime_dependency %q<activesupport>, ["~> 3.0"]
|
23
23
|
s.add_runtime_dependency %q<jruby-openssl> if RUBY_PLATFORM == 'java'
|
24
24
|
|
25
|
-
s.add_development_dependency %q<bundler>, ["
|
26
|
-
s.add_development_dependency %q<rspec>, ["
|
27
|
-
s.add_development_dependency %q<ci_reporter>, ["
|
25
|
+
s.add_development_dependency %q<bundler>, ["~> 1.0"]
|
26
|
+
s.add_development_dependency %q<rspec>, ["~> 2.5"]
|
27
|
+
s.add_development_dependency %q<ci_reporter>, ["~> 1.6"]
|
28
28
|
s.add_development_dependency %q<simplecov>, [">= 0"]
|
29
29
|
s.add_development_dependency %q<simplecov-rcov>, [">= 0"]
|
30
|
-
s.add_development_dependency %q<yard>, ["
|
30
|
+
s.add_development_dependency %q<yard>, ["~> 0.6"]
|
31
31
|
s.add_development_dependency %q<rake>, [">= 0"]
|
32
|
-
s.add_development_dependency %q<mocha>, [">= 0"]
|
33
|
-
s.add_development_dependency %q<bones>
|
34
32
|
s.add_development_dependency %q<guard-rspec>
|
35
33
|
s.add_development_dependency %q<ruby_gntp>
|
36
|
-
s.add_development_dependency %q<thor>, ["~> 0.14.0"]
|
37
34
|
end
|
@@ -412,6 +412,19 @@ module Adhearsion
|
|
412
412
|
GenerateSilenceProxy.proxy_for(self, &block) if block_given?
|
413
413
|
end
|
414
414
|
|
415
|
+
#
|
416
|
+
# Go to a specified context, extension and priority
|
417
|
+
# This requires us to relinquish control of the call.
|
418
|
+
# Execution will continue until the user hangs up, but the channel will be no longer available
|
419
|
+
#
|
420
|
+
def goto(context, extension = :nothing, priority = :nothing)
|
421
|
+
call[:ahn_prevent_hangup] = true
|
422
|
+
args = ['Goto', context, extension, priority].reject { |v| v == :nothing }
|
423
|
+
execute *args
|
424
|
+
set_variable 'PUNCHBLOCK_END_ON_ASYNCAGI_BREAK', 'true'
|
425
|
+
agi "ASYNCAGI BREAK"
|
426
|
+
end
|
427
|
+
|
415
428
|
class GenerateSilenceProxy
|
416
429
|
def self.proxy_for(target, &block)
|
417
430
|
proxy = new(target)
|
@@ -4,7 +4,9 @@ module Adhearsion::Asterisk
|
|
4
4
|
describe CallControllerMethods do
|
5
5
|
describe "mixed in to a CallController" do
|
6
6
|
|
7
|
-
|
7
|
+
let(:call) { mock('Call') }
|
8
|
+
|
9
|
+
subject { Adhearsion::CallController.new call }
|
8
10
|
|
9
11
|
before { Adhearsion::CallController.mixin CallControllerMethods }
|
10
12
|
|
@@ -19,10 +21,10 @@ module Adhearsion::Asterisk
|
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
22
|
-
before { Punchblock::Component::Asterisk::AGI::Command.any_instance.
|
24
|
+
before { Punchblock::Component::Asterisk::AGI::Command.any_instance.stub :complete_event => complete_event }
|
23
25
|
|
24
26
|
it 'should execute an AGI command with the specified name and parameters and return the response code, response and data' do
|
25
|
-
subject.
|
27
|
+
subject.should_receive(:execute_component_and_await_completion).once.with expected_agi_command
|
26
28
|
values = subject.agi 'Dial', '4044754842', 15
|
27
29
|
values.should == [200, 1, 'foobar']
|
28
30
|
end
|
@@ -35,7 +37,7 @@ module Adhearsion::Asterisk
|
|
35
37
|
end
|
36
38
|
|
37
39
|
it 'should raise Adhearsion::Call::Hangup' do
|
38
|
-
subject.
|
40
|
+
subject.should_receive(:execute_component_and_await_completion).once.with expected_agi_command
|
39
41
|
lambda { subject.agi 'Dial', '4044754842', 15 }.should raise_error(Adhearsion::Call::Hangup)
|
40
42
|
end
|
41
43
|
end
|
@@ -43,21 +45,21 @@ module Adhearsion::Asterisk
|
|
43
45
|
|
44
46
|
describe '#execute' do
|
45
47
|
it 'calls #agi and prefixes the command with EXEC' do
|
46
|
-
subject.
|
48
|
+
subject.should_receive(:agi).once.with 'EXEC Dial', '4044754842,15'
|
47
49
|
subject.execute 'Dial', '4044754842', 15
|
48
50
|
end
|
49
51
|
end
|
50
52
|
|
51
53
|
describe '#verbose' do
|
52
54
|
it 'executes the VERBOSE AGI command' do
|
53
|
-
subject.
|
55
|
+
subject.should_receive(:agi).once.with 'VERBOSE', 'Foo Bar!', 15
|
54
56
|
subject.verbose 'Foo Bar!', 15
|
55
57
|
end
|
56
58
|
end
|
57
59
|
|
58
60
|
describe '#enable_feature' do
|
59
61
|
it 'it should fetch the variable for DYNAMIC_FEATURES at first' do
|
60
|
-
subject.
|
62
|
+
subject.should_receive(:variable).once.with("DYNAMIC_FEATURES").and_throw(:got_variable)
|
61
63
|
expect {
|
62
64
|
subject.enable_feature :foobar
|
63
65
|
}.to throw_symbol :got_variable
|
@@ -73,13 +75,13 @@ module Adhearsion::Asterisk
|
|
73
75
|
|
74
76
|
# I had to do this ugly hack because of a bug in Flexmock which prevented me from mocking out Hash#[] :(
|
75
77
|
# FIXME: mock Hash
|
76
|
-
# ...DYNAMIC_FEATURE_EXTENSIONS.
|
78
|
+
# ...DYNAMIC_FEATURE_EXTENSIONS.should_receive(feature_name => assertion)
|
77
79
|
|
78
80
|
old_hash_feature_extension = Adhearsion::Asterisk::CallControllerMethods::DYNAMIC_FEATURE_EXTENSIONS[feature_name]
|
79
81
|
begin
|
80
82
|
Adhearsion::Asterisk::CallControllerMethods::DYNAMIC_FEATURE_EXTENSIONS[feature_name] = assertion
|
81
83
|
|
82
|
-
subject.
|
84
|
+
subject.should_receive(:enable_feature).once.with(feature_name, :this_is_the_right_arg).and_throw :inside_assertion!
|
83
85
|
expect { subject.enable_feature(feature_name, :this_is_the_right_arg)}.to throw_symbol :inside_assertion!
|
84
86
|
ensure
|
85
87
|
Adhearsion::Asterisk::CallControllerMethods::DYNAMIC_FEATURE_EXTENSIONS[feature_name] = old_hash_feature_extension
|
@@ -87,13 +89,13 @@ module Adhearsion::Asterisk
|
|
87
89
|
end
|
88
90
|
|
89
91
|
it 'should separate enabled features with a "#"' do
|
90
|
-
subject.
|
91
|
-
subject.
|
92
|
+
subject.should_receive(:variable).once.with("DYNAMIC_FEATURES").and_return("one")
|
93
|
+
subject.should_receive(:variable).once.with("DYNAMIC_FEATURES" => 'one#bar')
|
92
94
|
subject.enable_feature "bar"
|
93
95
|
end
|
94
96
|
|
95
97
|
it 'should not add duplicate enabled dynamic features' do
|
96
|
-
subject.
|
98
|
+
subject.should_receive(:variable).once.and_return('eins#zwei')
|
97
99
|
subject.enable_feature "eins"
|
98
100
|
end
|
99
101
|
|
@@ -104,63 +106,63 @@ module Adhearsion::Asterisk
|
|
104
106
|
end
|
105
107
|
|
106
108
|
it 'enabling :attended_transfer should actually enable the atxfer feature' do
|
107
|
-
subject.
|
108
|
-
subject.
|
109
|
+
subject.should_receive(:variable).once.with("DYNAMIC_FEATURES").and_return ''
|
110
|
+
subject.should_receive(:variable).once.with("DYNAMIC_FEATURES" => 'atxfer')
|
109
111
|
subject.enable_feature :attended_transfer
|
110
112
|
end
|
111
113
|
|
112
114
|
it 'the :context optional option when enabling :attended_transfer should set the TRANSFER_CONTEXT variable to the String supplied as a Hash value' do
|
113
115
|
context_name = "direct_dial"
|
114
|
-
subject.
|
115
|
-
subject.
|
116
|
-
subject.
|
116
|
+
subject.should_receive(:variable).once.with("DYNAMIC_FEATURES").and_return ''
|
117
|
+
subject.should_receive(:variable).once.with("DYNAMIC_FEATURES" => 'atxfer')
|
118
|
+
subject.should_receive(:variable).once.with("TRANSFER_CONTEXT" => context_name)
|
117
119
|
subject.enable_feature :attended_transfer, :context => context_name
|
118
120
|
end
|
119
121
|
|
120
122
|
it 'enabling :attended_transfer should not add a duplicate if atxfer has been enabled, but it should still set the TRANSFER_CONTEXT variable' do
|
121
123
|
context_name = 'blah'
|
122
|
-
subject.
|
123
|
-
subject.
|
124
|
+
subject.should_receive(:variable).once.with('DYNAMIC_FEATURES').and_return 'atxfer'
|
125
|
+
subject.should_receive(:variable).once.with('TRANSFER_CONTEXT' => context_name)
|
124
126
|
subject.enable_feature :attended_transfer, :context => context_name
|
125
127
|
end
|
126
128
|
end
|
127
129
|
|
128
130
|
describe '#disable_feature' do
|
129
131
|
it "should properly remove the feature from the DYNAMIC_FEATURES variable" do
|
130
|
-
subject.
|
131
|
-
subject.
|
132
|
+
subject.should_receive(:variable).once.with('DYNAMIC_FEATURES').and_return 'foobar#qaz'
|
133
|
+
subject.should_receive(:variable).once.with('DYNAMIC_FEATURES' => 'qaz')
|
132
134
|
subject.disable_feature "foobar"
|
133
135
|
end
|
134
136
|
|
135
137
|
it "should not re-set the variable if the feature wasn't enabled in the first place" do
|
136
|
-
subject.
|
137
|
-
subject.
|
138
|
+
subject.should_receive(:variable).once.with('DYNAMIC_FEATURES').and_return 'atxfer'
|
139
|
+
subject.should_receive(:variable).never
|
138
140
|
subject.disable_feature "jay"
|
139
141
|
end
|
140
142
|
end
|
141
143
|
|
142
144
|
describe "#variable" do
|
143
145
|
it "should call set_variable when Hash argument given" do
|
144
|
-
subject.
|
146
|
+
subject.should_receive(:set_variable).once.with :ohai, "ur_home_erly"
|
145
147
|
subject.variable :ohai => 'ur_home_erly'
|
146
148
|
end
|
147
149
|
|
148
150
|
it "should call set_variable for every Hash-key given" do
|
149
151
|
many_args = { :a => :b, :c => :d, :e => :f, :g => :h}
|
150
|
-
subject.
|
152
|
+
subject.should_receive(:set_variable).exactly(many_args.size).times
|
151
153
|
subject.variable many_args
|
152
154
|
end
|
153
155
|
|
154
156
|
it "should call get_variable for every String given" do
|
155
157
|
variables = ["foo", "bar", :qaz, :qwerty, :baz]
|
156
158
|
variables.each do |var|
|
157
|
-
subject.
|
159
|
+
subject.should_receive(:get_variable).once.with(var).and_return("X")
|
158
160
|
end
|
159
161
|
subject.variable(*variables).should == ["X"] * variables.size
|
160
162
|
end
|
161
163
|
|
162
164
|
it "should NOT return an Array when just one arg is given" do
|
163
|
-
subject.
|
165
|
+
subject.should_receive(:get_variable).once.and_return "lol"
|
164
166
|
subject.variable(:foo).should_not be_a Array
|
165
167
|
end
|
166
168
|
|
@@ -173,21 +175,21 @@ module Adhearsion::Asterisk
|
|
173
175
|
|
174
176
|
describe "#set_variable" do
|
175
177
|
it "uses SET VARIABLE" do
|
176
|
-
subject.
|
178
|
+
subject.should_receive(:agi).once.with 'SET VARIABLE', 'foo', 'i can " has ruby?'
|
177
179
|
subject.set_variable 'foo', 'i can " has ruby?'
|
178
180
|
end
|
179
181
|
end
|
180
182
|
|
181
183
|
describe '#get_variable' do
|
182
184
|
it 'uses GET VARIABLE and extracts the value from the data' do
|
183
|
-
subject.
|
185
|
+
subject.should_receive(:agi).once.with('GET VARIABLE', 'foo').and_return [200, 1, 'bar']
|
184
186
|
subject.get_variable('foo').should == 'bar'
|
185
187
|
end
|
186
188
|
end
|
187
189
|
|
188
190
|
describe "#sip_add_header" do
|
189
191
|
it "executes SIPAddHeader" do
|
190
|
-
subject.
|
192
|
+
subject.should_receive(:execute).once.with 'SIPAddHeader', 'x-ahn-header: rubyrox'
|
191
193
|
subject.sip_add_header "x-ahn-header", "rubyrox"
|
192
194
|
end
|
193
195
|
end
|
@@ -195,7 +197,7 @@ module Adhearsion::Asterisk
|
|
195
197
|
describe "#sip_get_header" do
|
196
198
|
it "uses #get_variable to get the header value" do
|
197
199
|
value = 'jason-was-here'
|
198
|
-
subject.
|
200
|
+
subject.should_receive(:get_variable).once.with('SIP_HEADER(x-ahn-header)').and_return value
|
199
201
|
subject.sip_get_header("x-ahn-header").should == value
|
200
202
|
end
|
201
203
|
end
|
@@ -203,25 +205,25 @@ module Adhearsion::Asterisk
|
|
203
205
|
describe '#join' do
|
204
206
|
it "should pass the 'd' flag when no options are given" do
|
205
207
|
conference_id = "123"
|
206
|
-
subject.
|
208
|
+
subject.should_receive(:execute).once.with("MeetMe", conference_id, "d", nil)
|
207
209
|
subject.meetme conference_id
|
208
210
|
end
|
209
211
|
|
210
212
|
it "should pass through any given flags with 'd' appended to it if necessary" do
|
211
213
|
conference_id, flags = "1000", "zomgs"
|
212
|
-
subject.
|
214
|
+
subject.should_receive(:execute).once.with("MeetMe", conference_id, flags + "d", nil)
|
213
215
|
subject.meetme conference_id, :options => flags
|
214
216
|
end
|
215
217
|
|
216
218
|
it "should NOT pass the 'd' flag when requiring static conferences" do
|
217
219
|
conference_id, options = "1000", {:use_static_conf => true}
|
218
|
-
subject.
|
220
|
+
subject.should_receive(:execute).once.with("MeetMe", conference_id, "", nil)
|
219
221
|
subject.meetme conference_id, options
|
220
222
|
end
|
221
223
|
|
222
224
|
it "should raise an ArgumentError when the pin is not numerical" do
|
223
225
|
lambda {
|
224
|
-
subject.
|
226
|
+
subject.should_receive(:execute).never
|
225
227
|
subject.meetme 3333, :pin => "letters are bad, mkay?!1"
|
226
228
|
}.should raise_error ArgumentError
|
227
229
|
end
|
@@ -229,7 +231,7 @@ module Adhearsion::Asterisk
|
|
229
231
|
it "should strip out illegal characters from a conference name" do
|
230
232
|
bizarre_conference_name = "a- bc!d&&e--`"
|
231
233
|
normal_conference_name = "abcde"
|
232
|
-
subject.
|
234
|
+
subject.should_receive(:execute).twice.with("MeetMe", normal_conference_name, "d", nil)
|
233
235
|
|
234
236
|
subject.meetme bizarre_conference_name
|
235
237
|
subject.meetme normal_conference_name
|
@@ -237,7 +239,7 @@ module Adhearsion::Asterisk
|
|
237
239
|
|
238
240
|
it "should allow textual conference names" do
|
239
241
|
lambda {
|
240
|
-
subject.
|
242
|
+
subject.should_receive(:execute).once
|
241
243
|
subject.meetme "david bowie's pants"
|
242
244
|
}.should_not raise_error
|
243
245
|
end
|
@@ -245,28 +247,28 @@ module Adhearsion::Asterisk
|
|
245
247
|
|
246
248
|
describe '#voicemail' do
|
247
249
|
it 'should not send the context name when none is given' do
|
248
|
-
subject.
|
250
|
+
subject.should_receive(:execute).once.with('voicemail', 123, '').and_throw :sent_voicemail!
|
249
251
|
lambda { subject.voicemail 123 }.should throw_symbol(:sent_voicemail!)
|
250
252
|
end
|
251
253
|
|
252
254
|
it 'should send the context name when one is given' do
|
253
255
|
mailbox_number, context_name = 333, 'doesntmatter'
|
254
|
-
subject.
|
256
|
+
subject.should_receive(:execute).once.with('voicemail', "#{mailbox_number}@#{context_name}", '').and_throw :sent_voicemail!
|
255
257
|
lambda { subject.voicemail(context_name => mailbox_number) }.should throw_symbol(:sent_voicemail!)
|
256
258
|
end
|
257
259
|
|
258
260
|
it 'should pass in the s option if :skip => true' do
|
259
261
|
mailbox_number = '012'
|
260
|
-
subject.
|
262
|
+
subject.should_receive(:execute).once.with('voicemail', mailbox_number, 's').and_throw :sent_voicemail!
|
261
263
|
lambda { subject.voicemail(mailbox_number, :skip => true) }.should throw_symbol(:sent_voicemail!)
|
262
264
|
end
|
263
265
|
|
264
266
|
it 'should combine mailbox numbers with the context name given when both are given' do
|
265
|
-
subject.
|
267
|
+
subject.should_receive(:variable).with("VMSTATUS").and_return 'SUCCESS'
|
266
268
|
context = "lolcats"
|
267
269
|
mailboxes = [1,2,3,4,5]
|
268
270
|
mailboxes_with_context = mailboxes.map { |mailbox| [mailbox, context].join '@' }
|
269
|
-
subject.
|
271
|
+
subject.should_receive(:execute).once.with('voicemail', mailboxes_with_context.join('&'), '')
|
270
272
|
subject.voicemail context => mailboxes
|
271
273
|
end
|
272
274
|
|
@@ -296,13 +298,13 @@ module Adhearsion::Asterisk
|
|
296
298
|
|
297
299
|
it 'should pass in the u option if :greeting => :unavailable' do
|
298
300
|
mailbox_number = '776'
|
299
|
-
subject.
|
301
|
+
subject.should_receive(:execute).once.with('voicemail', mailbox_number, 'u').and_throw :sent_voicemail!
|
300
302
|
lambda { subject.voicemail(mailbox_number, :greeting => :unavailable) }.should throw_symbol(:sent_voicemail!)
|
301
303
|
end
|
302
304
|
|
303
305
|
it 'should pass in both the skip and greeting options if both are supplied' do
|
304
306
|
mailbox_number = '4'
|
305
|
-
subject.
|
307
|
+
subject.should_receive(:execute).once.with('voicemail', mailbox_number, 'u').and_throw :sent_voicemail!
|
306
308
|
lambda { subject.voicemail(mailbox_number, :greeting => :unavailable) }.should throw_symbol(:sent_voicemail!)
|
307
309
|
end
|
308
310
|
|
@@ -318,25 +320,25 @@ module Adhearsion::Asterisk
|
|
318
320
|
|
319
321
|
it 'should pass in the b option if :gretting => :busy' do
|
320
322
|
mailbox_number = '1'
|
321
|
-
subject.
|
323
|
+
subject.should_receive(:execute).once.with('voicemail', mailbox_number, 'b').and_throw :sent_voicemail!
|
322
324
|
lambda { subject.voicemail(mailbox_number, :greeting => :busy) }.should throw_symbol(:sent_voicemail!)
|
323
325
|
end
|
324
326
|
|
325
327
|
it 'should return true if VMSTATUS == "SUCCESS"' do
|
326
|
-
subject.
|
327
|
-
subject.
|
328
|
+
subject.should_receive(:execute).once
|
329
|
+
subject.should_receive(:variable).once.with('VMSTATUS').and_return "SUCCESS"
|
328
330
|
subject.voicemail(3).should be true
|
329
331
|
end
|
330
332
|
|
331
333
|
it 'should return false if VMSTATUS == "USEREXIT"' do
|
332
|
-
subject.
|
333
|
-
subject.
|
334
|
+
subject.should_receive(:execute).once
|
335
|
+
subject.should_receive(:variable).once.with('VMSTATUS').and_return "USEREXIT"
|
334
336
|
subject.voicemail(2).should be false
|
335
337
|
end
|
336
338
|
|
337
339
|
it 'should return nil if VMSTATUS == "FAILED"' do
|
338
|
-
subject.
|
339
|
-
subject.
|
340
|
+
subject.should_receive(:execute).once
|
341
|
+
subject.should_receive(:variable).once.with('VMSTATUS').and_return "FAILED"
|
340
342
|
subject.voicemail(2).should be nil
|
341
343
|
end
|
342
344
|
end
|
@@ -345,48 +347,48 @@ module Adhearsion::Asterisk
|
|
345
347
|
it "the :folder Hash key argument should wrap the value in a()" do
|
346
348
|
folder = "foobar"
|
347
349
|
mailbox = 81
|
348
|
-
subject.
|
350
|
+
subject.should_receive(:execute).once.with("VoiceMailMain", "#{mailbox}","a(#{folder})")
|
349
351
|
subject.voicemail_main :mailbox => mailbox, :folder => folder
|
350
352
|
end
|
351
353
|
|
352
354
|
it ':authenticate should pass in the "s" option if given false' do
|
353
355
|
mailbox = 333
|
354
|
-
subject.
|
356
|
+
subject.should_receive(:execute).once.with("VoiceMailMain", "#{mailbox}","s")
|
355
357
|
subject.voicemail_main :mailbox => mailbox, :authenticate => false
|
356
358
|
end
|
357
359
|
|
358
360
|
it ':authenticate should pass in the s option if given false' do
|
359
361
|
mailbox = 55
|
360
|
-
subject.
|
362
|
+
subject.should_receive(:execute).once.with("VoiceMailMain", "#{mailbox}")
|
361
363
|
subject.voicemail_main :mailbox => mailbox, :authenticate => true
|
362
364
|
end
|
363
365
|
|
364
366
|
it 'should not pass any flags only a mailbox is given' do
|
365
367
|
mailbox = "1"
|
366
|
-
subject.
|
368
|
+
subject.should_receive(:execute).once.with("VoiceMailMain", "#{mailbox}")
|
367
369
|
subject.voicemail_main :mailbox => mailbox
|
368
370
|
end
|
369
371
|
|
370
372
|
it 'when given no mailbox or context an empty string should be passed to execute as the first argument' do
|
371
|
-
subject.
|
373
|
+
subject.should_receive(:execute).once.with("VoiceMailMain", "", "s")
|
372
374
|
subject.voicemail_main :authenticate => false
|
373
375
|
end
|
374
376
|
|
375
377
|
it 'should properly concatenate the options when given multiple ones' do
|
376
378
|
folder = "ohai"
|
377
379
|
mailbox = 9999
|
378
|
-
subject.
|
380
|
+
subject.should_receive(:execute).once.with("VoiceMailMain", "#{mailbox}", "sa(#{folder})")
|
379
381
|
subject.voicemail_main :mailbox => mailbox, :authenticate => false, :folder => folder
|
380
382
|
end
|
381
383
|
|
382
384
|
it 'should not require any arguments' do
|
383
|
-
subject.
|
385
|
+
subject.should_receive(:execute).once.with("VoiceMailMain")
|
384
386
|
subject.voicemail_main
|
385
387
|
end
|
386
388
|
|
387
389
|
it 'should pass in the "@context_name" part in if a :context is given and no mailbox is given' do
|
388
390
|
context_name = "icanhascheezburger"
|
389
|
-
subject.
|
391
|
+
subject.should_receive(:execute).once.with("VoiceMailMain", "@#{context_name}")
|
390
392
|
subject.voicemail_main :context => context_name
|
391
393
|
end
|
392
394
|
|
@@ -425,17 +427,17 @@ module Adhearsion::Asterisk
|
|
425
427
|
let(:time_format) { 'IMp' }
|
426
428
|
|
427
429
|
it "if a Date object is passed in, SayUnixTime is sent with the argument and format" do
|
428
|
-
subject.
|
430
|
+
subject.should_receive(:execute).once.with("SayUnixTime", date.to_time.to_i, "", date_format)
|
429
431
|
subject.play_time(date, :format => date_format)
|
430
432
|
end
|
431
433
|
|
432
434
|
it "if a Time object is passed in, SayUnixTime is sent with the argument and format" do
|
433
|
-
subject.
|
435
|
+
subject.should_receive(:execute).once.with("SayUnixTime", time.to_i, "", time_format)
|
434
436
|
subject.play_time(time, :format => time_format)
|
435
437
|
end
|
436
438
|
|
437
439
|
it "if a Time object is passed in alone, SayUnixTime is sent with the argument and the default format" do
|
438
|
-
subject.
|
440
|
+
subject.should_receive(:execute).once.with("SayUnixTime", time.to_i, "", "")
|
439
441
|
subject.play_time(time)
|
440
442
|
end
|
441
443
|
|
@@ -444,7 +446,7 @@ module Adhearsion::Asterisk
|
|
444
446
|
describe "#play_numeric" do
|
445
447
|
let(:numeric) { 20 }
|
446
448
|
it "should send the correct command SayNumber playing a numeric argument" do
|
447
|
-
subject.
|
449
|
+
subject.should_receive(:execute).once.with("SayNumber", numeric)
|
448
450
|
subject.play_numeric(numeric)
|
449
451
|
end
|
450
452
|
end
|
@@ -452,7 +454,7 @@ module Adhearsion::Asterisk
|
|
452
454
|
describe "#play_digits" do
|
453
455
|
let(:numeric) { 20 }
|
454
456
|
it "should send the correct command SayDigits playing a numeric argument" do
|
455
|
-
subject.
|
457
|
+
subject.should_receive(:execute).once.with("SayDigits", numeric)
|
456
458
|
subject.play_digits(numeric)
|
457
459
|
end
|
458
460
|
end
|
@@ -460,7 +462,7 @@ module Adhearsion::Asterisk
|
|
460
462
|
describe "#play_tones" do
|
461
463
|
context "should send the correct command Playtones playing tones" do
|
462
464
|
before do
|
463
|
-
subject.
|
465
|
+
subject.should_receive(:execute).once.with("Playtones", "!950/330,!1400/330,!1800/330,0")
|
464
466
|
end
|
465
467
|
|
466
468
|
it "given as a string" do
|
@@ -472,7 +474,7 @@ module Adhearsion::Asterisk
|
|
472
474
|
end
|
473
475
|
|
474
476
|
it "and sleep for the duration when instructed" do
|
475
|
-
subject.
|
477
|
+
subject.should_receive(:sleep).once.with(0.99)
|
476
478
|
subject.play_tones("!950/330,!1400/330,!1800/330,0", true)
|
477
479
|
end
|
478
480
|
end
|
@@ -481,15 +483,15 @@ module Adhearsion::Asterisk
|
|
481
483
|
describe "#play_soundfile" do
|
482
484
|
let(:audiofile) { "tt-monkeys" }
|
483
485
|
it "should send the correct command Playback playing an audio file" do
|
484
|
-
subject.
|
485
|
-
# subject.
|
486
|
-
subject.
|
486
|
+
subject.should_receive(:execute).once.with("Playback", audiofile)
|
487
|
+
# subject.should_receive(:execute).once.with("Playback", audiofile).and_return([200, 1, nil])
|
488
|
+
subject.should_receive(:get_variable).once.with("PLAYBACKSTATUS").and_return(PLAYBACK_SUCCESS)
|
487
489
|
subject.play_soundfile(audiofile)
|
488
490
|
end
|
489
491
|
|
490
492
|
it "should return false if playback fails" do
|
491
|
-
subject.
|
492
|
-
subject.
|
493
|
+
subject.should_receive(:execute).once.with("Playback", audiofile)
|
494
|
+
subject.should_receive(:get_variable).once.with("PLAYBACKSTATUS").and_return('FAILED')
|
493
495
|
subject.play_soundfile(audiofile).should == false
|
494
496
|
end
|
495
497
|
end
|
@@ -498,7 +500,7 @@ module Adhearsion::Asterisk
|
|
498
500
|
context 'executes Playtones with 0 as an argument if it' do
|
499
501
|
before do
|
500
502
|
command = Punchblock::Component::Asterisk::AGI::Command.new :name => "EXEC Playtones", :params => ["0"]
|
501
|
-
@expect_command = subject.
|
503
|
+
@expect_command = subject.should_receive(:execute_component_and_await_completion).with(command)
|
502
504
|
end
|
503
505
|
|
504
506
|
it 'is not given a block' do
|
@@ -507,7 +509,7 @@ module Adhearsion::Asterisk
|
|
507
509
|
end
|
508
510
|
|
509
511
|
it 'is given a block, which it then yields' do
|
510
|
-
@expect_command.
|
512
|
+
@expect_command.exactly(3).times
|
511
513
|
expect { |b| subject.generate_silence { b.to_proc.call; run; run } }.to yield_with_no_args
|
512
514
|
end
|
513
515
|
|
@@ -542,6 +544,48 @@ module Adhearsion::Asterisk
|
|
542
544
|
end
|
543
545
|
end
|
544
546
|
end
|
547
|
+
|
548
|
+
describe "#goto" do
|
549
|
+
let(:context) { "foo" }
|
550
|
+
let(:extension) { "s" }
|
551
|
+
let(:priority) { 1 }
|
552
|
+
|
553
|
+
it "sets the call to not hangup after execution" do
|
554
|
+
call.should_receive(:[]=).with(:ahn_prevent_hangup, true)
|
555
|
+
subject.should_receive(:execute).with('Goto', context, extension, priority)
|
556
|
+
subject.should_receive(:set_variable).with('PUNCHBLOCK_END_ON_ASYNCAGI_BREAK', 'true').once
|
557
|
+
subject.should_receive(:agi).with("ASYNCAGI BREAK").at_most :once
|
558
|
+
subject.goto(context, extension, priority)
|
559
|
+
end
|
560
|
+
|
561
|
+
it "releases control of the call using ASYNCAGI BREAK" do
|
562
|
+
call.should_receive(:[]=).with(:ahn_prevent_hangup, true).at_most :once
|
563
|
+
subject.should_receive(:execute).with('Goto', context, extension, priority).at_most :once
|
564
|
+
subject.should_receive(:set_variable).with('PUNCHBLOCK_END_ON_ASYNCAGI_BREAK', 'true').once
|
565
|
+
subject.should_receive(:agi).with("ASYNCAGI BREAK").once
|
566
|
+
subject.goto(context, extension, priority)
|
567
|
+
end
|
568
|
+
|
569
|
+
context "number of arguments" do
|
570
|
+
before :each do
|
571
|
+
call.should_receive(:[]=).with(:ahn_prevent_hangup, true).at_most :once
|
572
|
+
subject.should_receive(:set_variable).with('PUNCHBLOCK_END_ON_ASYNCAGI_BREAK', 'true').once
|
573
|
+
subject.should_receive(:agi).with("ASYNCAGI BREAK").at_most :once
|
574
|
+
end
|
575
|
+
it "executes Goto with 3 arguments when passed all 3" do
|
576
|
+
subject.should_receive(:execute).with('Goto', context, extension, priority)
|
577
|
+
subject.goto(context, extension, priority)
|
578
|
+
end
|
579
|
+
it "executes Goto with 2 arguments when passed 2" do
|
580
|
+
subject.should_receive(:execute).with('Goto', context, extension)
|
581
|
+
subject.goto(context, extension)
|
582
|
+
end
|
583
|
+
it "executes Goto with 1 arguments when passed 1" do
|
584
|
+
subject.should_receive(:execute).with('Goto', context)
|
585
|
+
subject.goto(context)
|
586
|
+
end
|
587
|
+
end
|
588
|
+
end
|
545
589
|
end
|
546
590
|
end#main describe
|
547
591
|
end
|