ruby-asterisk 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/LICENCE +21 -0
- data/README.md +83 -1
- data/Rakefile +4 -0
- data/lib/ruby-asterisk.rb +122 -47
- data/lib/ruby-asterisk/parsing_constants.rb +98 -0
- data/lib/ruby-asterisk/request.rb +14 -15
- data/lib/ruby-asterisk/response.rb +22 -136
- data/lib/ruby-asterisk/response_parser.rb +42 -0
- data/lib/ruby-asterisk/version.rb +1 -1
- data/ruby-asterisk.gemspec +6 -3
- data/spec/ruby-asterisk/request_spec.rb +1 -1
- data/spec/ruby-asterisk/response_spec.rb +120 -120
- data/spec/ruby-asterisk/ruby_asterisk_spec.rb +108 -66
- data/spec/spec_helper.rb +2 -0
- metadata +50 -14
@@ -1,32 +1,31 @@
|
|
1
1
|
module RubyAsterisk
|
2
|
+
##
|
3
|
+
#
|
4
|
+
# Class responsible of building commands structure
|
5
|
+
#
|
2
6
|
class Request
|
3
7
|
attr_accessor :action, :action_id, :parameters, :response_data
|
4
8
|
|
5
|
-
def initialize(action,parameters={})
|
9
|
+
def initialize(action, parameters = {})
|
6
10
|
self.action = action
|
7
|
-
self.action_id =
|
11
|
+
self.action_id = Request.generate_action_id
|
8
12
|
self.parameters = parameters
|
9
|
-
self.response_data =
|
13
|
+
self.response_data = ''
|
10
14
|
end
|
11
15
|
|
12
16
|
def commands
|
13
|
-
_commands=["Action:
|
14
|
-
self.parameters.each do |key,value|
|
15
|
-
_commands<<key
|
17
|
+
_commands = ["Action: #{self.action}\r\n", "ActionID: #{self.action_id}\r\n"]
|
18
|
+
self.parameters.each do |key, value|
|
19
|
+
_commands<<"#{key.to_s}: #{value.to_s}\r\n" unless value.nil?
|
16
20
|
end
|
17
|
-
_commands[_commands.length-1]<<"\r\n"
|
21
|
+
_commands[_commands.length - 1] << "\r\n"
|
18
22
|
_commands
|
19
|
-
end
|
23
|
+
end
|
20
24
|
|
21
25
|
protected
|
22
26
|
|
23
|
-
def generate_action_id
|
24
|
-
|
25
|
-
Random.rand(999).to_s
|
26
|
-
else
|
27
|
-
rand(999).to_s
|
28
|
-
end
|
27
|
+
def self.generate_action_id
|
28
|
+
Process.clock_gettime(Process::CLOCK_REALTIME, :nanosecond).to_s(36)
|
29
29
|
end
|
30
|
-
|
31
30
|
end
|
32
31
|
end
|
@@ -1,33 +1,38 @@
|
|
1
|
+
require 'ruby-asterisk/response_parser'
|
2
|
+
|
1
3
|
module RubyAsterisk
|
4
|
+
##
|
5
|
+
#
|
6
|
+
# Class for response coming from Asterisk
|
7
|
+
#
|
2
8
|
class Response
|
3
|
-
attr_accessor :type, :
|
9
|
+
attr_accessor :type, :action_id, :message, :data, :raw_response
|
4
10
|
|
5
11
|
def initialize(type,response)
|
6
12
|
self.raw_response = response
|
7
13
|
self.type = type
|
8
|
-
self.
|
9
|
-
self.
|
10
|
-
self.
|
11
|
-
self.data = self._parse_data(response)
|
14
|
+
self.action_id = self._parse_action_id
|
15
|
+
self.message = self._parse_message
|
16
|
+
self.data = self._parse_response
|
12
17
|
end
|
13
18
|
|
14
|
-
|
15
|
-
|
16
|
-
def _parse_successfull(response)
|
17
|
-
response.include?("Response: Success")
|
19
|
+
def success
|
20
|
+
self.raw_response.include?("Response: Success")
|
18
21
|
end
|
19
22
|
|
20
|
-
|
21
|
-
|
23
|
+
protected
|
24
|
+
|
25
|
+
def _parse_action_id
|
26
|
+
self._parse("ActionID:")
|
22
27
|
end
|
23
28
|
|
24
|
-
def _parse_message
|
25
|
-
self._parse(
|
29
|
+
def _parse_message
|
30
|
+
self._parse("Message:")
|
26
31
|
end
|
27
32
|
|
28
|
-
def _parse(
|
33
|
+
def _parse(field)
|
29
34
|
_value = nil
|
30
|
-
|
35
|
+
self.raw_response.each_line do |line|
|
31
36
|
if line.start_with?(field)
|
32
37
|
_value = line[line.rindex(":")+1..line.size].strip
|
33
38
|
end
|
@@ -35,128 +40,9 @@ module RubyAsterisk
|
|
35
40
|
_value
|
36
41
|
end
|
37
42
|
|
38
|
-
def
|
39
|
-
|
40
|
-
when "CoreShowChannels"
|
41
|
-
self._parse_data_core_show_channels(response)
|
42
|
-
when "ParkedCalls"
|
43
|
-
self._parse_data_parked_calls(response)
|
44
|
-
when "Originate"
|
45
|
-
self._parse_originate(response)
|
46
|
-
when "MeetMeList"
|
47
|
-
self._parse_meet_me_list(response)
|
48
|
-
when "Status"
|
49
|
-
self._parse_status(response)
|
50
|
-
when "ExtensionState"
|
51
|
-
self._parse_extension_state(response)
|
52
|
-
when "SKINNYdevices"
|
53
|
-
self._parse_skinny_devices(response)
|
54
|
-
when "SKINNYlines"
|
55
|
-
self._parse_skinny_lines(response)
|
56
|
-
when "Command"
|
57
|
-
response
|
58
|
-
when "QueuePause"
|
59
|
-
self._parse_queue_pause(response)
|
60
|
-
when "Pong"
|
61
|
-
self._parse_pong(response)
|
62
|
-
when "Events"
|
63
|
-
self._parse_event_mask(response)
|
64
|
-
when "SIPpeers"
|
65
|
-
self._parse_sip_peers(response)
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
69
|
-
|
70
|
-
def _parse_sip_peers(response)
|
71
|
-
self._parse_objects(response, :peers, "Event: PeerEntry")
|
72
|
-
end
|
73
|
-
|
74
|
-
def _parse_meet_me_list(response)
|
75
|
-
self._parse_objects(response,:rooms,"Event: MeetmeList")
|
76
|
-
end
|
77
|
-
|
78
|
-
def _parse_originate(response)
|
79
|
-
self._parse_objects(response,:dial,"Event: Dial")
|
80
|
-
end
|
81
|
-
|
82
|
-
def _parse_data_parked_calls(response)
|
83
|
-
self._parse_objects(response,:calls,"Event: ParkedCall")
|
84
|
-
end
|
85
|
-
|
86
|
-
def _parse_data_core_show_channels(response)
|
87
|
-
self._parse_objects(response,:channels,"Event: CoreShowChannel","Event: CoreShowChannelsComplete")
|
43
|
+
def _parse_response
|
44
|
+
ResponseParser.parse(self.raw_response, self.type)
|
88
45
|
end
|
89
46
|
|
90
|
-
def _parse_extension_state(response)
|
91
|
-
_data = self._parse_objects(response,:hints,"Response:")
|
92
|
-
self._convert_status(_data)
|
93
|
-
end
|
94
|
-
|
95
|
-
def _parse_skinny_devices(response)
|
96
|
-
self._parse_objects(response,:skinnydevs,"Event: DeviceEntry")
|
97
|
-
end
|
98
|
-
|
99
|
-
def _parse_skinny_lines(response)
|
100
|
-
self._parse_objects(response,:skinnylines,"Event: LineEntry")
|
101
|
-
end
|
102
|
-
|
103
|
-
def _parse_queue_pause(response)
|
104
|
-
_data = self._parse_objects(response,:queue_pause,"Response:")
|
105
|
-
end
|
106
|
-
|
107
|
-
def _parse_pong(response)
|
108
|
-
_data = self._parse_objects(response,:pong, "Response:")
|
109
|
-
end
|
110
|
-
|
111
|
-
def _parse_event_mask(response)
|
112
|
-
_data = self._parse_objects(response, :event_mask, "Ping:")
|
113
|
-
end
|
114
|
-
|
115
|
-
def _parse_status(response)
|
116
|
-
self._parse_objects(response, :status, "Event: Status")
|
117
|
-
end
|
118
|
-
|
119
|
-
def _convert_status(_data)
|
120
|
-
_data[:hints].each do |hint|
|
121
|
-
case hint["Status"]
|
122
|
-
when "-1"
|
123
|
-
hint["DescriptiveStatus"] = "Extension not found"
|
124
|
-
when "0"
|
125
|
-
hint["DescriptiveStatus"] = "Idle"
|
126
|
-
when "1"
|
127
|
-
hint["DescriptiveStatus"] = "In Use"
|
128
|
-
when "2"
|
129
|
-
hint["DescriptiveStatus"] = "Busy"
|
130
|
-
when "4"
|
131
|
-
hint["DescriptiveStatus"] = "Unavailable"
|
132
|
-
when "8"
|
133
|
-
hint["DescriptiveStatus"] = "Ringing"
|
134
|
-
when "16"
|
135
|
-
hint["DescriptiveStatus"] = "On Hold"
|
136
|
-
end
|
137
|
-
end
|
138
|
-
_data
|
139
|
-
end
|
140
|
-
|
141
|
-
def _parse_objects(response,symbol_name,search_for,stop_with=nil)
|
142
|
-
_data = { symbol_name => [] }
|
143
|
-
parsing = false
|
144
|
-
object = nil
|
145
|
-
response.each_line do |line|
|
146
|
-
line.strip!
|
147
|
-
if line.strip.empty? or (!stop_with.nil? and line.start_with?(stop_with))
|
148
|
-
parsing = false
|
149
|
-
elsif line.start_with?(search_for)
|
150
|
-
_data[symbol_name] << object unless object.nil?
|
151
|
-
object = {}
|
152
|
-
parsing = true
|
153
|
-
elsif parsing
|
154
|
-
tokens = line.split(':', 2)
|
155
|
-
object[tokens[0].strip]=tokens[1].strip unless tokens[1].nil?
|
156
|
-
end
|
157
|
-
end
|
158
|
-
_data[symbol_name] << object unless object.nil?
|
159
|
-
_data
|
160
|
-
end
|
161
47
|
end
|
162
48
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'ruby-asterisk/parsing_constants'
|
2
|
+
|
3
|
+
module RubyAsterisk
|
4
|
+
##
|
5
|
+
#
|
6
|
+
# Class for parsing response coming from Asterisk
|
7
|
+
#
|
8
|
+
class ResponseParser
|
9
|
+
|
10
|
+
def self.parse(raw_response, type)
|
11
|
+
if PARSE_DATA.include?(type)
|
12
|
+
self._parse_objects(raw_response, PARSE_DATA[type])
|
13
|
+
else
|
14
|
+
raw_response
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
def self._add_status(exten_array)
|
21
|
+
exten_array.each do |hint|
|
22
|
+
hint["DescriptiveStatus"] = DESCRIPTIVE_STATUS[hint["Status"]]
|
23
|
+
end
|
24
|
+
exten_array
|
25
|
+
end
|
26
|
+
|
27
|
+
def self._parse_objects(response, parse_params)
|
28
|
+
object_array = []
|
29
|
+
object_regex = Regexp.new(/#{parse_params[:search_for]}\n(.*?)\n\n/m)
|
30
|
+
response.scan(object_regex) do |match|
|
31
|
+
object = {}
|
32
|
+
match[0].split(/\n/).each do |line|
|
33
|
+
tokens = line.split(':', 2)
|
34
|
+
object[tokens[0].strip]=tokens[1].strip unless tokens[1].nil?
|
35
|
+
end
|
36
|
+
object_array << object unless object.empty?
|
37
|
+
end
|
38
|
+
object_array = _add_status(object_array) if parse_params[:symbol].eql?(:hints)
|
39
|
+
{ parse_params[:symbol] => object_array }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/ruby-asterisk.gemspec
CHANGED
@@ -7,10 +7,11 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.version = Rami::VERSION
|
8
8
|
s.platform = Gem::Platform::RUBY
|
9
9
|
s.authors = ["Emiliano Della Casa"]
|
10
|
-
s.email = ["
|
10
|
+
s.email = ["emiliano.dellacasa@gmail.com"]
|
11
11
|
s.homepage = "http://github.com/emilianodellacasa/ruby-asterisk"
|
12
12
|
s.summary = %q{Asterisk Manager Interface in Ruby}
|
13
13
|
s.description = %q{Add support to your ruby or rails projects to Asterisk Manager Interface (AMI)}
|
14
|
+
s.licenses = ['MIT']
|
14
15
|
|
15
16
|
s.rubyforge_project = "ruby-asterisk"
|
16
17
|
|
@@ -19,6 +20,8 @@ Gem::Specification.new do |s|
|
|
19
20
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
20
21
|
s.require_paths = ["lib"]
|
21
22
|
|
22
|
-
|
23
|
-
|
23
|
+
s.add_development_dependency "rake"
|
24
|
+
s.add_development_dependency 'rspec'
|
25
|
+
s.add_development_dependency 'simplecov'
|
26
|
+
s.add_development_dependency 'quality'
|
24
27
|
end
|
@@ -8,7 +8,7 @@ describe RubyAsterisk::Request do
|
|
8
8
|
request.commands.include?("Variable: var1=15\r\n").should_not be_nil
|
9
9
|
end
|
10
10
|
|
11
|
-
|
11
|
+
it "should not set a Variable option if not set" do
|
12
12
|
request = RubyAsterisk::Request.new("Originate",{"Channel" => "1234", "Context" => "test", "Exten" => "1", "Priority" => "1", "Callerid" => "1234", "Timeout" => "30000", "Variable" => nil })
|
13
13
|
request.commands.include?("Variable: var=15").should==false
|
14
14
|
end
|
@@ -5,130 +5,130 @@ describe RubyAsterisk::Response do
|
|
5
5
|
def sip_peers_response
|
6
6
|
"Response: Success
|
7
7
|
Message: Peer status list will follow
|
8
|
-
|
8
|
+
|
9
9
|
Event: PeerEntry
|
10
10
|
Channeltype: SIP
|
11
11
|
ObjectName: 9915057
|
12
|
-
IPport: 5060"
|
12
|
+
IPport: 5060\n\n"
|
13
|
+
end
|
14
|
+
|
15
|
+
def empty_core_show_channels_response
|
16
|
+
"Event: CoreShowChannelsComplete
|
17
|
+
EventList: Complete
|
18
|
+
ListItems: 1
|
19
|
+
ActionID: 839\n\n"
|
13
20
|
end
|
14
21
|
|
15
|
-
|
16
|
-
|
17
|
-
|
22
|
+
def core_show_channels_response
|
23
|
+
"Event: CoreShowChannel
|
24
|
+
ActionID: 839
|
25
|
+
Channel: SIP/195.62.226.4-00000025
|
26
|
+
UniqueID: 1335448133.61
|
27
|
+
Context: incoming
|
28
|
+
Extension: s
|
29
|
+
Priority: 1
|
30
|
+
ChannelState: 6
|
31
|
+
ChannelStateDesc: Up
|
32
|
+
Application: Parked Call
|
33
|
+
ApplicationData:
|
34
|
+
CallerIDnum: 123456
|
35
|
+
CallerIDname:
|
36
|
+
ConnectedLineNum:
|
37
|
+
ConnectedLineName:
|
38
|
+
Duration: 00:00:05
|
39
|
+
AccountCode:
|
40
|
+
BridgedChannel:
|
41
|
+
BridgedUniqueID:
|
42
|
+
|
43
|
+
Event: CoreShowChannelsComplete
|
44
|
+
EventList: Complete
|
18
45
|
ListItems: 1
|
19
|
-
ActionID: 839"
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
Channel: SIP/195.62.226.18-0000000e
|
82
|
-
Admin: No
|
83
|
-
Role: Talk and listen
|
84
|
-
MarkedUser: No
|
85
|
-
Muted: No
|
86
|
-
Talking: Not monitored"
|
87
|
-
end
|
88
|
-
|
89
|
-
def extension_state_response
|
90
|
-
"Response: Success
|
91
|
-
ActionID: 180
|
92
|
-
Message: Extension Status
|
93
|
-
Exten: 9100
|
94
|
-
Context: HINT
|
95
|
-
Hint: SIP/9100
|
96
|
-
Status: 0"
|
97
|
-
end
|
98
|
-
|
99
|
-
describe ".new" do
|
100
|
-
|
101
|
-
describe "receiving a Core Show Channels request" do
|
102
|
-
it "should parse correctly data coming from Asterisk about channels" do
|
103
|
-
@response = RubyAsterisk::Response.new("CoreShowChannels",core_show_channels_response)
|
104
|
-
@response.data[:channels].should_not be_empty
|
105
|
-
end
|
106
|
-
|
107
|
-
it "should correctly fill the fields" do
|
46
|
+
ActionID: 839\n\n"
|
47
|
+
end
|
48
|
+
|
49
|
+
def parked_calls_response
|
50
|
+
"Event: ParkedCall
|
51
|
+
Parkinglot: default
|
52
|
+
Exten: 701
|
53
|
+
Channel: SIP/195.62.226.2-00000026
|
54
|
+
From: SIP/195.62.226.2-00000026
|
55
|
+
Timeout: 3
|
56
|
+
CallerIDNum: 123456
|
57
|
+
CallerIDName:
|
58
|
+
ConnectedLineNum:
|
59
|
+
ConnectedLineName:
|
60
|
+
ActionID: 899\n\n"
|
61
|
+
end
|
62
|
+
|
63
|
+
def originate_response
|
64
|
+
"Event: Dial
|
65
|
+
Privilege: call,all
|
66
|
+
SubEvent: End
|
67
|
+
Channel: SIP/9100-0000002b
|
68
|
+
UniqueID: 1335457364.68
|
69
|
+
DialStatus: CHANUNAVAIL\n\n"
|
70
|
+
end
|
71
|
+
|
72
|
+
def meet_me_list_response
|
73
|
+
"Event: MeetmeList
|
74
|
+
ActionID: 921
|
75
|
+
Conference: 1234
|
76
|
+
UserNumber: 1
|
77
|
+
CallerIDNum: 123456
|
78
|
+
CallerIDName: <no name>
|
79
|
+
ConnectedLineNum: <unknown>
|
80
|
+
ConnectedLineName: <no name>
|
81
|
+
Channel: SIP/195.62.226.18-0000000e
|
82
|
+
Admin: No
|
83
|
+
Role: Talk and listen
|
84
|
+
MarkedUser: No
|
85
|
+
Muted: No
|
86
|
+
Talking: Not monitored\n\n"
|
87
|
+
end
|
88
|
+
|
89
|
+
def extension_state_response
|
90
|
+
"Response: Success
|
91
|
+
ActionID: 180
|
92
|
+
Message: Extension Status
|
93
|
+
Exten: 9100
|
94
|
+
Context: HINT
|
95
|
+
Hint: SIP/9100
|
96
|
+
Status: 0\n\n"
|
97
|
+
end
|
98
|
+
|
99
|
+
describe ".new" do
|
100
|
+
|
101
|
+
describe "receiving a Core Show Channels request" do
|
102
|
+
it "should parse correctly data coming from Asterisk about channels" do
|
103
|
+
@response = RubyAsterisk::Response.new("CoreShowChannels",core_show_channels_response)
|
104
|
+
@response.data[:channels].should_not be_empty
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should correctly fill the fields" do
|
108
108
|
@response = RubyAsterisk::Response.new("CoreShowChannels",core_show_channels_response)
|
109
109
|
@response.data[:channels][0]["CallerIDnum"].should eq("123456")
|
110
110
|
end
|
111
111
|
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
112
|
+
it "should have no channels if answer is empty" do
|
113
|
+
@response = RubyAsterisk::Response.new("CoreShowChannels",empty_core_show_channels_response)
|
114
|
+
@response.data[:channels].count.should eq(0)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
describe "receiving a Parked Calls request" do
|
119
|
+
it "should parse correctly data coming from Asterisk about calls" do
|
120
|
+
@response = RubyAsterisk::Response.new("ParkedCalls",parked_calls_response)
|
121
|
+
@response.data[:calls].should_not be_empty
|
122
|
+
end
|
123
|
+
|
124
|
+
it "should correctly fill the fields" do
|
125
|
+
@response = RubyAsterisk::Response.new("ParkedCalls",parked_calls_response)
|
126
|
+
@response.data[:calls][0]["Exten"].should eq("701")
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe "receiving a Originate request" do
|
131
|
+
it "should parse correctly data coming from Asterisk about the call" do
|
132
132
|
@response = RubyAsterisk::Response.new("Originate",originate_response)
|
133
133
|
@response.data[:dial].should_not be_empty
|
134
134
|
end
|
@@ -143,8 +143,8 @@ describe RubyAsterisk::Response do
|
|
143
143
|
@response.raw_response.should eq(originate_response)
|
144
144
|
end
|
145
145
|
end
|
146
|
-
|
147
|
-
|
146
|
+
|
147
|
+
describe "receiving a MeetMeList request" do
|
148
148
|
it "should parse correctly data coming from Asterisk about the conference room" do
|
149
149
|
@response = RubyAsterisk::Response.new("MeetMeList",meet_me_list_response)
|
150
150
|
@response.data[:rooms].should_not be_empty
|
@@ -156,7 +156,7 @@ describe RubyAsterisk::Response do
|
|
156
156
|
end
|
157
157
|
end
|
158
158
|
|
159
|
-
|
159
|
+
describe "receiving a ExtensionState request" do
|
160
160
|
it "should parse correctly data coming from Asterisk about the state of the extension" do
|
161
161
|
@response = RubyAsterisk::Response.new("ExtensionState",extension_state_response)
|
162
162
|
@response.data[:hints].should_not be_empty
|
@@ -165,17 +165,17 @@ describe RubyAsterisk::Response do
|
|
165
165
|
it "should correctly fill the fields" do
|
166
166
|
@response = RubyAsterisk::Response.new("ExtensionState",extension_state_response)
|
167
167
|
@response.data[:hints][0]["Status"].should eq("0")
|
168
|
-
|
168
|
+
@response.data[:hints][0]["DescriptiveStatus"].should eq("Idle")
|
169
169
|
end
|
170
170
|
end
|
171
|
-
|
171
|
+
end
|
172
172
|
|
173
173
|
describe "receiving a SIPPeers request" do
|
174
174
|
it "should parse correctly data coming from Asterisk abous sip peers" do
|
175
175
|
@response = RubyAsterisk::Response.new("SIPpeers",sip_peers_response)
|
176
176
|
@response.data[:peers].should_not be_empty
|
177
177
|
end
|
178
|
-
|
178
|
+
|
179
179
|
it "should correctly fill the fields" do
|
180
180
|
@response = RubyAsterisk::Response.new("SIPpeers",sip_peers_response)
|
181
181
|
@response.data[:peers][0]["ObjectName"].should eq("9915057")
|