tsig_api 1.0.5

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.
@@ -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