tsig_api 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,71 @@
1
+ require 'net/http'
2
+ require 'net/https'
3
+
4
+ module TsigApi
5
+ module RemoteActions
6
+
7
+ class Response
8
+ attr_accessor :status
9
+ attr_accessor :body
10
+ attr_accessor :raw_response
11
+
12
+ def initialize(ret_val, resp)
13
+ self.status = ret_val
14
+ self.raw_response = resp
15
+ self.body = resp.body
16
+ end
17
+ end
18
+
19
+ class Request
20
+ attr_accessor :headers
21
+ attr_accessor :proxy
22
+ attr_accessor :proxy_port
23
+ attr_accessor :body
24
+ attr_accessor :http_process
25
+ attr_accessor :url
26
+
27
+ def initialize(options={})
28
+ default_options = {
29
+ :body => nil,
30
+ :headers => {'Content-Type' => 'application/xml', 'Accept' => 'application/xml'},
31
+ :proxy => nil,
32
+ :proxy_port => nil,
33
+ :url => '/api/parser'
34
+ }
35
+ default_options.merge!(options)
36
+
37
+ self.proxy = default_options[:proxy]
38
+ self.proxy_port = default_options[:proxy_port]
39
+ self.headers = default_options[:headers]
40
+ self.body = default_options[:body]
41
+ self.url = default_options[:url]
42
+
43
+ self.http_process = Net::HTTP.new( TsigApi::TXTSIG_HOST, TsigApi::TXTSIG_PORT, self.proxy, self.proxy_port )
44
+
45
+ if TsigApi::TXTSIG_PORT.to_i == 443
46
+ self.http_process.use_ssl = true
47
+
48
+ # We know we're under SSL, but motherfucking openssl won't
49
+ # stop complaining about our cert since we upgraded to
50
+ # higher SHA2 hashing
51
+ self.http_process.verify_mode = OpenSSL::SSL::VERIFY_NONE
52
+ end
53
+ end
54
+
55
+ def send_request
56
+ http_process.start
57
+ resp = http_process.post(self.url, self.body, self.headers)
58
+ ret_val = false
59
+ case resp
60
+ when Net::HTTPSuccess, Net::HTTPRedirection
61
+ ret_val = true
62
+ else
63
+ ret_val = false
64
+ end
65
+ return TsigApi::RemoteActions::Response.new(ret_val, resp)
66
+ end
67
+ end
68
+
69
+ end
70
+
71
+ end
@@ -0,0 +1,79 @@
1
+ require 'tsig_api/base'
2
+
3
+ module TsigApi
4
+ class Team < TsigApi::Base
5
+ self.remote_type = :team
6
+
7
+ # this might be somewhat redundant to query(:all_teams => true), but
8
+ # it seems that that will only return the ids, not id => name
9
+ #
10
+ def list
11
+ xml = group_id_node
12
+ TsigApi::RemoteActions::Request.new(:body => request_xml(:list, xml))
13
+ end
14
+
15
+ def create(options = {:name => nil, :add_contacts => nil})
16
+ contact_xml = ""
17
+ if options[:add_contacts]
18
+ contact_xml += "<param name='add_contacts'>"
19
+ options[:add_contacts].each do |ac|
20
+ contact_xml += "<contact>#{ac}</contact>"
21
+ end
22
+ contact_xml += "</param>"
23
+ end
24
+ xml = "
25
+ #{group_id_node}
26
+ #{param_node('team_name', options[:name])}
27
+ #{contact_xml}
28
+ "
29
+ TsigApi::RemoteActions::Request.new(:body => request_xml(:create, xml))
30
+ end
31
+
32
+ def query(options = {:name => nil, :team_id => nil, :all_teams => nil})
33
+ xml = group_id_node
34
+ if options[:team_id]
35
+ xml += "<param name='team_id'>#{options[:team_id]}</param>"
36
+ elsif options[:name]
37
+ xml += "<param name='team_name'>#{options[:name]}</param>"
38
+ elsif options[:all_teams]
39
+ xml += "<param name='all_teams'>1</param>"
40
+ end
41
+ TsigApi::RemoteActions::Request.new(:body => request_xml(:query, xml))
42
+ end
43
+
44
+ def update(team_id, options = {:name => nil, :add_contacts => nil, :del_contacts => nil})
45
+ xml = group_id_node
46
+ xml += param_node('team_id', team_id)
47
+ xml += param_node('team_name', options[:name]) if options[:name]
48
+ if options[:add_contacts]
49
+ add_contact_xml = "<param name='add_contacts'>"
50
+ options[:add_contacts].each do |ac|
51
+ add_contact_xml += "<contact>#{ac}</contact>"
52
+ end
53
+ add_contact_xml += "</param>"
54
+ xml += add_contact_xml
55
+ end
56
+ if options[:del_contacts]
57
+ del_contact_xml = "<param name='del_contacts'>"
58
+ options[:del_contacts].each do |dc|
59
+ del_contact_xml += "<contact>#{dc}</contact>"
60
+ end
61
+ del_contact_xml += "</param>"
62
+ xml += del_contact_xml
63
+ end
64
+ TsigApi::RemoteActions::Request.new(:body => request_xml(:update, xml))
65
+ end
66
+
67
+ def delete(options = {:team_id => nil, :name => nil})
68
+ xml = group_id_node
69
+
70
+ if options[:team_id]
71
+ xml+= param_node('team_id', options[:team_id])
72
+ elsif options[:name]
73
+ xml+= "<param name='team_id'></param>#{param_node('team_name', options[:name])}"
74
+ end
75
+ TsigApi::RemoteActions::Request.new(:body => request_xml(:delete, xml))
76
+ end
77
+
78
+ end
79
+ end
@@ -0,0 +1,18 @@
1
+
2
+ ENV["RAILS_ENV"] = "test"
3
+ require File.dirname(__FILE__) + '/../../../../config/environment'
4
+ require 'test_help'
5
+ require 'rexml/document'
6
+ require File.dirname(__FILE__) + '/../lib/tsig_api'
7
+
8
+ class ActiveSupport::TestCase
9
+ require 'rr'
10
+ include RR::Adapters::TestUnit
11
+ end
12
+
13
+
14
+ # dummy: lets me rename a test as xtest to prevent it from running
15
+ def xtest(*args)
16
+ file = File.basename(caller.first)
17
+ puts "Disabled test [#{file}]: #{args.first}"
18
+ end
@@ -0,0 +1,71 @@
1
+ require File.join(File.dirname(__FILE__), '/test_helper')
2
+
3
+ class TsigApiAuthorizeTest < ActiveSupport::TestCase
4
+
5
+ def setup
6
+ response_xml = <<-EOS
7
+ <?xml version='1.0'?>
8
+ <txtsig_response version="1.0">
9
+ <content type="response">
10
+ <item type="user">
11
+ <element name='success'>true</element>
12
+ <element name='client_id'>1234</element>
13
+ <element name='api_password'>abcde01234abcde01234abcde01234ab</element>
14
+ </item>
15
+ </content>
16
+ </txtsig_response>
17
+ EOS
18
+
19
+ error_xml = <<-EOS
20
+ <?xml version='1.0'?>
21
+ <txtsig_response version="1.0">
22
+ <content type="error">
23
+ <item type="error_description">
24
+ <element name="error_code">10</element>
25
+ <element name="error_text"><![CDATA[General Fault]]></element>
26
+ </item>
27
+ </content>
28
+ </txtsig_response>
29
+ EOS
30
+
31
+ net_response = stub("net_response")
32
+ net_response.body{response_xml}
33
+ net_error = stub("net_error")
34
+ net_error.body{error_xml}
35
+
36
+ @valid_response = TsigApi::RemoteActions::Response.new(true, net_response)
37
+ stub(@valid_response).body{response_xml}
38
+ @error_response = TsigApi::RemoteActions::Response.new(true, net_error)
39
+ stub(@error_response).body{error_xml}
40
+
41
+ TsigApi::Base.establish_connection(1234, 'joe', 'clear-text-pass')
42
+ end
43
+
44
+ def test_should_initialize
45
+ a = TsigApi::Authorize.new
46
+ assert_equal a.class, TsigApi::Authorize
47
+ assert_equal a.class.remote_type, :authorize
48
+ end
49
+
50
+ def test_should_build_query_xml
51
+ a = TsigApi::Authorize.new
52
+ request = a.query
53
+ assert request.body.include?('<api_username><![CDATA[joe')
54
+ end
55
+
56
+ def test_should_send_request_and_parse_response
57
+ a = TsigApi::Authorize.new
58
+ request = a.query
59
+ stub(request).send_request{@valid_response}
60
+ content_type, response_hash = a.parse_response(request.send_request)
61
+ assert_equal content_type, "response"
62
+ assert_equal response_hash["client_id"], '1234'
63
+ assert_equal response_hash["api_password"], 'abcde01234abcde01234abcde01234ab'
64
+ # now we fake an error response
65
+ stub(request).send_request{@error_response}
66
+ content_type, response_hash = a.parse_response(request.send_request)
67
+ assert_equal content_type, "error"
68
+ assert_equal response_hash["error_code"], "10"
69
+ end
70
+
71
+ end
@@ -0,0 +1,124 @@
1
+ require File.join(File.dirname(__FILE__), '/test_helper')
2
+
3
+ class TsigApiCarrierTest < ActiveSupport::TestCase
4
+
5
+ def setup
6
+ response_xml = <<-EOS
7
+ <?xml version='1.0'?>
8
+ <txtsig_response version="1.0">
9
+ <content type="response">
10
+ <item type="carriers">
11
+ <element name='cingular'>
12
+ Cingular
13
+ </element>
14
+ <element name='att'>
15
+ AT&amp;T
16
+ </element>
17
+ <element name='alltel'>
18
+ Alltel
19
+ </element>
20
+ <element name='verizon'>
21
+ Verizon
22
+ </element>
23
+ <element name='nextel'>
24
+ Nextel
25
+ </element>
26
+ <element name='sprint'>
27
+ Sprint
28
+ </element>
29
+ <element name='tmobile'>
30
+ T-Mobile
31
+ </element>
32
+ <element name='boostmobile'>
33
+ Boost Mobile
34
+ </element>
35
+ <element name='virginmobile'>
36
+ Virgin Mobile
37
+ </element>
38
+ <element name='uscellular'>
39
+ US Cellular
40
+ </element>
41
+ <element name='suncom'>
42
+ SunCom
43
+ </element>
44
+ <element name='centennial'>
45
+ Centennial Wireless
46
+ </element>
47
+ <element name='fido_ca'>
48
+ Fido (Canada)
49
+ </element>
50
+ <element name='bellmobility_ca'>
51
+ Bell Mobility (Canada)
52
+ </element>
53
+ <element name='rogers_ca'>
54
+ Rogers (Canada)
55
+ </element>
56
+ <element name='virginmobile_ca'>
57
+ Virgin Mobile (Canada)
58
+ </element>
59
+ <element name='telus_ca'>
60
+ Telus (Canada)
61
+ </element>
62
+ <element name='cellularone'>
63
+ Cellular One
64
+ </element>
65
+ </item>
66
+ </content>
67
+ </txtsig_response>
68
+ EOS
69
+
70
+ error_xml = <<-EOS
71
+ <?xml version='1.0'?>
72
+ <txtsig_response version="1.0">
73
+ <content type="error">
74
+ <item type="error_description">
75
+ <element name="error_code">10</element>
76
+ <element name="error_text"><![CDATA[General Fault]]></element>
77
+ </item>
78
+ </content>
79
+ </txtsig_response>
80
+ EOS
81
+
82
+ net_response = stub("net_response")
83
+ net_response.body{response_xml}
84
+ net_error = stub("net_error")
85
+ net_error.body{error_xml}
86
+
87
+ @valid_response = TsigApi::RemoteActions::Response.new(true, net_response)
88
+ stub(@valid_response).body{response_xml}
89
+ @error_response = TsigApi::RemoteActions::Response.new(true, net_error)
90
+ stub(@error_response).body{error_xml}
91
+
92
+ TsigApi::Base.establish_connection(1234, 'joe', '123456789012345678901234567890ab')
93
+ end
94
+
95
+ def test_should_initialize_carrier
96
+ c = TsigApi::Carrier.new("Group A")
97
+ assert_equal c.class, TsigApi::Carrier
98
+ assert_equal c.class.remote_type, :carriers
99
+ end
100
+
101
+ def test_should_build_query_xml
102
+ c = TsigApi::Carrier.new("Group A")
103
+ request = c.query
104
+ assert request.body.include?('<action type="list_carriers">')
105
+ assert request.body.include?('<client_id><![CDATA[1234]]></client_id>')
106
+ assert request.body.include?('<api_username><![CDATA[joe]]></api_username>')
107
+ assert request.body.include?('<api_password><![CDATA[123456789012345678901234567890ab]]></api_password>')
108
+ end
109
+
110
+ def test_should_send_request_and_parse_response
111
+ c = TsigApi::Carrier.new("Group A")
112
+ request = c.query
113
+ stub(request).send_request{@valid_response}
114
+ content_type, response_hash = c.parse_response(request.send_request)
115
+ assert_equal content_type, "response"
116
+ assert_equal response_hash["cellularone"], "Cellular One"
117
+ # now we fake an error response
118
+ stub(request).send_request{@error_response}
119
+ content_type, response_hash = c.parse_response(request.send_request)
120
+ assert_equal content_type, "error"
121
+ assert_equal response_hash["error_code"], "10"
122
+ end
123
+
124
+ end
@@ -0,0 +1,148 @@
1
+ require File.join(File.dirname(__FILE__), '/test_helper')
2
+
3
+ class TsigApiContactTest < ActiveSupport::TestCase
4
+
5
+ def setup
6
+
7
+ @tsig_contact = TsigApi::Contact.new("Group A")
8
+ @valid_contact = {:first_name => "John", :last_name => "Test", :cell_carrier => "verizon", :cell_number => "999-999-9999", :receive_messages => true}
9
+
10
+ create_response_xml = <<-EOS
11
+ <?xml version='1.0'?>
12
+ <txtsig_response version="1.0">
13
+ <content type="response">
14
+ <item type="contact">
15
+ <element name='success'>1</element>
16
+ <element name='contact_id'>15</element>
17
+ </item>
18
+ </content>
19
+ </txtsig_response>
20
+ EOS
21
+
22
+ query_response_xml = <<-EOS
23
+ <?xml version='1.0'?>
24
+ <txtsig_response version="1.0">
25
+ <content type="response">
26
+ <item type="contact">
27
+ <element name='success'>1</element>
28
+ <element name='contacts'>
29
+ <contact_id>15</contact_id>
30
+ </element>
31
+ </item>
32
+ </content>
33
+ </txtsig_response>
34
+ EOS
35
+
36
+ update_response_xml = <<-EOS
37
+ <?xml version='1.0'?>
38
+ <txtsig_response version="1.0">
39
+ <content type="response">
40
+ <item type="contact">
41
+ <element name='success'>1</element>
42
+ <element name='contact_id'>15</element>
43
+ </item>
44
+ </content>
45
+ </txtsig_response>
46
+ EOS
47
+
48
+ delete_response_xml = <<-EOS
49
+ <?xml version='1.0'?>
50
+ <txtsig_response version="1.0">
51
+ <content type="response">
52
+ <item type="contact">
53
+ <element name='success'>1</element>
54
+ </item>
55
+ </content>
56
+ </txtsig_response>
57
+ EOS
58
+
59
+ error_xml = <<-EOS
60
+ <?xml version='1.0'?>
61
+ <txtsig_response version="1.0">
62
+ <content type="error">
63
+ <item type="error_description">
64
+ <element name="error_code">10</element>
65
+ <element name="error_text"><![CDATA[General Fault]]></element>
66
+ </item>
67
+ </content>
68
+ </txtsig_response>
69
+ EOS
70
+
71
+ create_response = stub("create_response")
72
+ create_response.body{create_response_xml}
73
+ query_response = stub("query_response")
74
+ query_response.body{query_response_xml}
75
+ update_response = stub("update_response")
76
+ update_response.body{update_response_xml}
77
+ delete_response = stub("delete_response")
78
+ delete_response.body{delete_response_xml}
79
+ error_response = stub("net_error")
80
+ error_response.body{error_xml}
81
+
82
+ @valid_create_response = TsigApi::RemoteActions::Response.new(true, create_response)
83
+ stub(@valid_create_response).body{create_response_xml}
84
+ @valid_query_response = TsigApi::RemoteActions::Response.new(true, query_response)
85
+ stub(@valid_query_response).body{query_response_xml}
86
+ @valid_update_response = TsigApi::RemoteActions::Response.new(true, update_response)
87
+ stub(@valid_update_response).body{update_response_xml}
88
+ @valid_delete_response = TsigApi::RemoteActions::Response.new(true, delete_response)
89
+ stub(@valid_delete_response).body{delete_response_xml}
90
+ @error_response = TsigApi::RemoteActions::Response.new(true, error_response)
91
+ stub(@error_response).body{error_xml}
92
+ end
93
+
94
+ def test_should_initialize_contact
95
+ assert_equal @tsig_contact.class, TsigApi::Contact
96
+ assert_equal @tsig_contact.class.remote_type, :contact
97
+ end
98
+
99
+ def test_should_build_create_xml
100
+ contact_hash = @valid_contact.merge({:add_teams => ['Team A', 'Team B']})
101
+ request = @tsig_contact.create(contact_hash)
102
+ doc = REXML::Document.new(request.body)
103
+ assert_equal "999-999-9999", REXML::XPath.first(doc, "//param[@name='cell_number']").get_text.to_s
104
+ end
105
+
106
+ def test_should_send_create_request_and_parse_response
107
+ contact_hash = @valid_contact.merge({:add_teams => ['Team A', 'Team B']})
108
+ request = @tsig_contact.create(contact_hash)
109
+ stub(request).send_request{@valid_create_response}
110
+ content_type, response_hash = @tsig_contact.parse_response(request.send_request)
111
+ assert_equal content_type, "response"
112
+ assert_equal response_hash["success"], "1"
113
+ assert_equal response_hash["contact_id"], "15"
114
+ # now we fake an error response
115
+ stub(request).send_request{@error_response}
116
+ content_type, response_hash = @tsig_contact.parse_response(request.send_request)
117
+ assert_equal content_type, "error"
118
+ assert_equal response_hash["error_code"], "10"
119
+ end
120
+
121
+ def test_should_send_query_and_parse_response
122
+ request = @tsig_contact.query(:first_name => "John", :last_name => "Test")
123
+ stub(request).send_request{@valid_query_response}
124
+ content_type, response_hash = @tsig_contact.parse_response(request.send_request)
125
+ assert_equal "response", content_type
126
+ assert_equal response_hash["success"], "1"
127
+ assert_equal response_hash["contacts"], ["15"]
128
+ end
129
+
130
+ def test_should_send_delete_and_parse_response
131
+ request = @tsig_contact.delete(15)
132
+ stub(request).send_request{@valid_delete_response}
133
+ content_type, response_hash = @tsig_contact.parse_response(request.send_request)
134
+ assert_equal "response", content_type
135
+ assert_equal response_hash["success"], "1"
136
+ end
137
+
138
+ def test_should_send_update_request_and_parse_response
139
+ contact_hash = @valid_contact.merge({:add_teams => ['Team A'], :del_teams => ['Team B']})
140
+ request = @tsig_contact.update(15, contact_hash)
141
+ stub(request).send_request{@valid_update_response}
142
+ content_type, response_hash = @tsig_contact.parse_response(request.send_request)
143
+ assert_equal content_type, "response"
144
+ assert_equal response_hash["success"], "1"
145
+ assert_equal response_hash["contact_id"], "15"
146
+ end
147
+
148
+ end