efax 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,2 @@
1
+ pkg
2
+ tmp
@@ -0,0 +1,35 @@
1
+ = efax
2
+
3
+ Ruby library for accessing the eFax Developer service (http://www.efaxdeveloper.com).
4
+
5
+ Strange class names and their attribute names come from "eFax Developer Universal User Guide for Outbound Processing" document.
6
+ You can get it on eFax Developer pages or on Scribd (http://www.scribd.com/doc/5382394/eFax-Developer-Universal-User-Guide-Outbound).
7
+
8
+ == Usage
9
+
10
+ First you need to provide your account id and credentials:
11
+ EFax::Request.account_id = <your account id>
12
+ EFax::Request.user = <your login>
13
+ EFax::Request.password = <your password>
14
+
15
+
16
+ Sending an HTML page using eFax service is pretty simple:
17
+ response = EFax::OutboundRequest.post(recipient_name, company_name, fax_number, subject, content)
18
+
19
+ The response object has the following attributes:
20
+ response.status_code
21
+ response.doc_id # unique identifier of your request
22
+ response.error_level
23
+ response.error_message
24
+
25
+ See EFax::RequestStatus class for details on status codes.
26
+
27
+
28
+ Having ID of your request, you can get its current status:
29
+ response = OutboundRequestStatus.post(doc_id)
30
+
31
+ The status response has the following attributes:
32
+ response.status_code
33
+ response.message # "user friendly" status message
34
+
35
+ See EFax::QueryStatus class for details on status codes.
@@ -0,0 +1,45 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rake/clean'
4
+ require 'rake/gempackagetask'
5
+ require 'rake/rdoctask'
6
+ require 'rake/testtask'
7
+ require 'spec/rake/spectask'
8
+
9
+ begin
10
+ require 'jeweler'
11
+ Jeweler::Tasks.new do |gem|
12
+ gem.name = "efax"
13
+ gem.summary = 'Ruby library for accessing the eFax Developer service'
14
+ gem.authors = ["Szymon Nowak", "Pawel Kozlowski"]
15
+ gem.email = "szimek@gmail.com"
16
+ gem.homepage = "http://github.com/szimek/efax"
17
+ gem.rubyforge_project = "efax"
18
+
19
+ gem.add_dependency('hpricot', '>= 0.8.1')
20
+ gem.add_development_dependency('mocha', '>= 0.9')
21
+ end
22
+
23
+ Jeweler::RubyforgeTasks.new do |rubyforge|
24
+ rubyforge.doc_task = "rdoc"
25
+ end
26
+ rescue LoadError
27
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
28
+ end
29
+
30
+ Rake::RDocTask.new do |rdoc|
31
+ files =['README.rdoc', 'lib/**/*.rb']
32
+ rdoc.rdoc_files.add(files)
33
+ rdoc.main = "README.rdoc" # page to start on
34
+ rdoc.title = 'eFax: Ruby library for accessing the eFax Developer service'
35
+ rdoc.rdoc_dir = 'rdoc' # rdoc output folder
36
+ rdoc.options << '--line-numbers'
37
+ end
38
+
39
+ Rake::TestTask.new do |t|
40
+ t.test_files = FileList['test/**/*.rb']
41
+ end
42
+
43
+ Spec::Rake::SpecTask.new do |t|
44
+ t.spec_files = FileList['spec/**/*.rb']
45
+ end
data/TODO ADDED
@@ -0,0 +1,2 @@
1
+ - provide simpler interface like EFax#send_request and EFax#query_status
2
+ - raise exception if account info or credentials are not set
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.1.1
@@ -0,0 +1,224 @@
1
+ #--
2
+ # (The MIT License)
3
+ #
4
+ # Copyright (c) 2008 Szymon Nowak & Pawel Kozlowski (U2I)
5
+ #
6
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
7
+ # of this software and associated documentation files (the "Software"), to
8
+ # deal in the Software without restriction, including without limitation the
9
+ # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10
+ # sell copies of the Software, and to permit persons to whom the Software is
11
+ # furnished to do so, subject to the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be included in
14
+ # all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
+ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22
+ # IN THE SOFTWARE.
23
+ #++
24
+ #
25
+
26
+ require 'net/http'
27
+ require 'net/https'
28
+ require 'builder'
29
+ require 'hpricot'
30
+ require 'base64'
31
+
32
+ module Net #:nodoc:
33
+ # Helper class for making HTTPS requests
34
+ class HTTPS < HTTP
35
+ def self.start(address, port = nil, p_addr = nil, p_port = nil, p_user = nil, p_pass = nil, &block) #:nodoc:
36
+ https = new(address, port, p_addr, p_port, p_user, p_pass)
37
+ https.use_ssl = true
38
+ https.start(&block)
39
+ end
40
+ end
41
+ end
42
+
43
+ module EFax
44
+ # URL of eFax web service
45
+ Url = "https://secure.efaxdeveloper.com/EFax_WebFax.serv"
46
+ # URI of eFax web service
47
+ Uri = URI.parse(Url)
48
+ # Prefered content type
49
+ HEADERS = {'Content-Type' => 'text/xml'}
50
+
51
+ # Base class for OutboundRequest and OutboundStatus classes
52
+ class Request
53
+ def self.user
54
+ @@user
55
+ end
56
+ def self.user=(name)
57
+ @@user = name
58
+ end
59
+
60
+ def self.password
61
+ @@password
62
+ end
63
+ def self.password=(password)
64
+ @@password = password
65
+ end
66
+
67
+ def self.account_id
68
+ @@account_id
69
+ end
70
+ def self.account_id=(id)
71
+ @@account_id = id
72
+ end
73
+
74
+ def self.params(content)
75
+ escaped_xml = ::URI.escape(content, Regexp.new("[^#{::URI::PATTERN::UNRESERVED}]"))
76
+ "id=#{account_id}&xml=#{escaped_xml}&respond=XML"
77
+ end
78
+
79
+ private_class_method :params
80
+ end
81
+
82
+ class OutboundRequest < Request
83
+ def self.post(name, company, fax_number, subject, content, content_type = :html)
84
+ xml_request = xml(name, company, fax_number, subject, content, content_type)
85
+ response = Net::HTTPS.start(EFax::Uri.host, EFax::Uri.port) do |https|
86
+ https.post(EFax::Uri.path, params(xml_request), EFax::HEADERS)
87
+ end
88
+ OutboundResponse.new(response)
89
+ end
90
+
91
+ def self.xml(name, company, fax_number, subject, content, content_type = :html)
92
+ xml_request = ""
93
+ xml = Builder::XmlMarkup.new(:target => xml_request, :indent => 2 )
94
+ xml.instruct! :xml, :version => '1.0'
95
+ xml.OutboundRequest do
96
+ xml.AccessControl do
97
+ xml.UserName(self.user)
98
+ xml.Password(self.password)
99
+ end
100
+ xml.Transmission do
101
+ xml.TransmissionControl do
102
+ xml.Resolution("FINE")
103
+ xml.Priority("NORMAL")
104
+ xml.SelfBusy("ENABLE")
105
+ xml.FaxHeader(subject)
106
+ end
107
+ xml.DispositionControl do
108
+ xml.DispositionLevel("NONE")
109
+ end
110
+ xml.Recipients do
111
+ xml.Recipient do
112
+ xml.RecipientName(name)
113
+ xml.RecipientCompany(company)
114
+ xml.RecipientFax(fax_number)
115
+ end
116
+ end
117
+ xml.Files do
118
+ xml.File do
119
+ encoded_content = Base64.encode64(content).delete("\n")
120
+ xml.FileContents(encoded_content)
121
+ xml.FileType(content_type.to_s)
122
+ end
123
+ end
124
+ end
125
+ end
126
+ xml_request
127
+ end
128
+
129
+ private_class_method :xml
130
+ end
131
+
132
+ class RequestStatus
133
+ HTTP_FAILURE = 0
134
+ SUCCESS = 1
135
+ FAILURE = 2
136
+ end
137
+
138
+ class OutboundResponse
139
+ attr_reader :status_code
140
+ attr_reader :error_message
141
+ attr_reader :error_level
142
+ attr_reader :doc_id
143
+
144
+ def initialize(response) #:nodoc:
145
+ if response.is_a? Net::HTTPOK
146
+ doc = Hpricot(response.body)
147
+ @status_code = doc.at(:statuscode).inner_text.to_i
148
+ @error_message = doc.at(:errormessage)
149
+ @error_message = @error_message.inner_text if @error_message
150
+ @error_level = doc.at(:errorlevel)
151
+ @error_level = @error_level.inner_text if @error_level
152
+ @doc_id = doc.at(:docid).inner_text
153
+ @doc_id = @doc_id.empty? ? nil : @doc_id
154
+ else
155
+ @status_code = RequestStatus::HTTP_FAILURE
156
+ @error_message = "HTTP request failed (#{response.code})"
157
+ end
158
+ end
159
+ end
160
+
161
+ class OutboundStatus < Request
162
+ def self.post(doc_id)
163
+ data = params(xml(doc_id))
164
+ response = Net::HTTPS.start(EFax::Uri.host, EFax::Uri.port) do |https|
165
+ https.post(EFax::Uri.path, data, EFax::HEADERS)
166
+ end
167
+ OutboundStatusResponse.new(response)
168
+ end
169
+
170
+ def self.xml(doc_id)
171
+ xml_request = ""
172
+ xml = Builder::XmlMarkup.new(:target => xml_request, :indent => 2 )
173
+ xml.instruct! :xml, :version => '1.0'
174
+ xml.OutboundStatus do
175
+ xml.AccessControl do
176
+ xml.UserName(self.user)
177
+ xml.Password(self.password)
178
+ end
179
+ xml.Transmission do
180
+ xml.TransmissionControl do
181
+ xml.DOCID(doc_id)
182
+ end
183
+ end
184
+ end
185
+ xml_request
186
+ end
187
+
188
+ private_class_method :xml
189
+ end
190
+
191
+ class QueryStatus
192
+ HTTP_FAILURE = 0
193
+ PENDING = 3
194
+ SENT = 4
195
+ FAILURE = 5
196
+ end
197
+
198
+ class OutboundStatusResponse
199
+ attr_reader :status_code
200
+ attr_reader :message
201
+ attr_reader :classification
202
+ attr_reader :outcome
203
+
204
+ def initialize(response) #:nodoc:
205
+ if response.is_a? Net::HTTPOK
206
+ doc = Hpricot(response.body)
207
+ @message = doc.at(:message).innerText
208
+ @classification = doc.at(:classification).innerText.delete('"')
209
+ @outcome = doc.at(:outcome).innerText.delete('"')
210
+ if @classification.empty? && @outcome.empty?
211
+ @status_code = QueryStatus::PENDING
212
+ elsif @classification == "Success" && @outcome == "Success"
213
+ @status_code = QueryStatus::SENT
214
+ else
215
+ @status_code = QueryStatus::FAILURE
216
+ end
217
+ else
218
+ @status_code = QueryStatus::HTTP_FAILURE
219
+ @message = "HTTP request failed (#{response.code})"
220
+ end
221
+ end
222
+ end
223
+
224
+ end
@@ -0,0 +1,54 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{ruby-efax}
8
+ s.version = "1.1.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Szymon Nowak", "Pawel Kozlowski"]
12
+ s.date = %q{2009-09-24}
13
+ s.email = %q{szimek@gmail.com}
14
+ s.extra_rdoc_files = [
15
+ "README"
16
+ ]
17
+ s.files = [
18
+ ".gitignore",
19
+ "README",
20
+ "Rakefile",
21
+ "TODO",
22
+ "VERSION",
23
+ "lib/efax.rb",
24
+ "ruby-efax.gemspec",
25
+ "test/efax_test.rb",
26
+ "test/test_helper.rb"
27
+ ]
28
+ s.homepage = %q{http://github.com/szimek/ruby-efax}
29
+ s.rdoc_options = ["--charset=UTF-8"]
30
+ s.require_paths = ["lib"]
31
+ s.rubyforge_project = %q{ruby-efax}
32
+ s.rubygems_version = %q{1.3.5}
33
+ s.summary = %q{Ruby library for accessing the eFax Developer service}
34
+ s.test_files = [
35
+ "test/efax_test.rb",
36
+ "test/test_helper.rb"
37
+ ]
38
+
39
+ if s.respond_to? :specification_version then
40
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
41
+ s.specification_version = 3
42
+
43
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
44
+ s.add_runtime_dependency(%q<hpricot>, [">= 0.8.1"])
45
+ s.add_development_dependency(%q<mocha>, [">= 0.9"])
46
+ else
47
+ s.add_dependency(%q<hpricot>, [">= 0.8.1"])
48
+ s.add_dependency(%q<mocha>, [">= 0.9"])
49
+ end
50
+ else
51
+ s.add_dependency(%q<hpricot>, [">= 0.8.1"])
52
+ s.add_dependency(%q<mocha>, [">= 0.9"])
53
+ end
54
+ end
@@ -0,0 +1,357 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ module EFaxTest
4
+
5
+ class RequestTest < Test::Unit::TestCase
6
+ def test_should_encode_data
7
+ EFax::Request.account_id = 1234567890
8
+ EFax::Request.publicize_class_methods do
9
+ assert_equal "id=1234567890&xml=%40abc%23&respond=XML", EFax::Request.params('@abc#')
10
+ end
11
+ end
12
+ end
13
+
14
+ class OutboundResponseTest < Test::Unit::TestCase
15
+ def test_successful_response
16
+ xml = <<-XML
17
+ <?xml version="1.0"?>
18
+ <OutboundResponse>
19
+ <Transmission>
20
+ <TransmissionControl>
21
+ <TransmissionID></TransmissionID>
22
+ <DOCID>12345678</DOCID>
23
+ </TransmissionControl>
24
+ <Response>
25
+ <StatusCode>1</StatusCode>
26
+ <StatusDescription>Success</StatusDescription>
27
+ </Response>
28
+ </Transmission>
29
+ </OutboundResponse>
30
+ XML
31
+ http_response = mock
32
+ http_response.expects(:is_a?).with(Net::HTTPOK).returns(true)
33
+ http_response.expects(:body).returns(xml)
34
+ response = EFax::OutboundResponse.new(http_response)
35
+
36
+ assert_equal EFax::RequestStatus::SUCCESS, response.status_code
37
+ assert_equal "12345678", response.doc_id
38
+ assert_nil response.error_message
39
+ assert_nil response.error_level
40
+ end
41
+
42
+ def test_system_level_failed_response
43
+ xml = <<-XML
44
+ <?xml version="1.0"?>
45
+ <OutboundResponse>
46
+ <Transmission>
47
+ <TransmissionControl>
48
+ <TransmissionID></TransmissionID>
49
+ <DOCID></DOCID>
50
+ </TransmissionControl>
51
+ <Response>
52
+ <StatusCode>2</StatusCode>
53
+ <StatusDescription>Failure</StatusDescription>
54
+ <ErrorLevel>System</ErrorLevel>
55
+ <ErrorMessage>We FAIL</ErrorMessage>
56
+ </Response>
57
+ </Transmission>
58
+ </OutboundResponse>
59
+ XML
60
+ http_response = mock()
61
+ http_response.expects(:is_a?).with(Net::HTTPOK).returns(true)
62
+ http_response.expects(:body).returns(xml)
63
+ response = EFax::OutboundResponse.new(http_response)
64
+ assert_equal EFax::RequestStatus::FAILURE, response.status_code
65
+ assert_nil response.doc_id
66
+ assert_equal "We FAIL", response.error_message
67
+ assert_equal "System", response.error_level
68
+ end
69
+
70
+ def test_user_level_failed_response
71
+ xml = <<-XML
72
+ <?xml version="1.0"?>
73
+ <OutboundResponse>
74
+ <Transmission>
75
+ <TransmissionControl>
76
+ <TransmissionID></TransmissionID>
77
+ <DOCID></DOCID>
78
+ </TransmissionControl>
79
+ <Response>
80
+ <StatusCode>2</StatusCode>
81
+ <StatusDescription>Failure</StatusDescription>
82
+ <ErrorLevel>User</ErrorLevel>
83
+ <ErrorMessage>"QWE RTY" does not satisfy the "base64Binary" type</ErrorMessage>
84
+ </Response>
85
+ </Transmission>
86
+ </OutboundResponse>
87
+ XML
88
+ http_response = mock()
89
+ http_response.expects(:is_a?).with(Net::HTTPOK).returns(true)
90
+ http_response.expects(:body).returns(xml)
91
+ response = EFax::OutboundResponse.new(http_response)
92
+ assert_equal EFax::RequestStatus::FAILURE, response.status_code
93
+ assert_nil response.doc_id
94
+ assert_equal '"QWE RTY" does not satisfy the "base64Binary" type', response.error_message
95
+ assert_equal "User", response.error_level
96
+ end
97
+
98
+ def test_http_failed_response
99
+ http_response = mock()
100
+ http_response.expects(:is_a?).with(Net::HTTPOK).returns(false)
101
+ http_response.expects(:code).returns(500)
102
+ response = EFax::OutboundResponse.new(http_response)
103
+ assert_equal EFax::RequestStatus::HTTP_FAILURE, response.status_code
104
+ assert_nil response.doc_id
105
+ assert_equal "HTTP request failed (500)", response.error_message
106
+ assert_nil response.error_level
107
+ end
108
+ end
109
+
110
+ class OutboundStatusResponseTest < Test::Unit::TestCase
111
+ def test_successful_response
112
+ xml = <<-XML
113
+ <?xml version="1.0"?>
114
+ <OutboundStatusResponse>
115
+ <Transmission>
116
+ <TransmissionControl>
117
+ <TransmissionID></TransmissionID>
118
+ </TransmissionControl>
119
+ <Recipients>
120
+ <Recipient>
121
+ <DOCID>12345678</DOCID>
122
+ <Name>Mike Rotch</Name>
123
+ <Company>Moe's</Company>
124
+ <Fax>12345678901</Fax>
125
+ <Status>
126
+ <Message>Your transmission has completed.</Message>
127
+ <Classification>"Success"</Classification>
128
+ <Outcome>"Success"</Outcome>
129
+ </Status>
130
+ <LastAttempt>
131
+ <LastDate>08/06/2008</LastDate>
132
+ <LastTime>05:49:05</LastTime>
133
+ </LastAttempt>
134
+ <NextAttempt>
135
+ <NextDate></NextDate>
136
+ <NextTime></NextTime>
137
+ </NextAttempt>
138
+ <Pages>
139
+ <Scheduled>1</Scheduled>
140
+ <Sent>1</Sent>
141
+ </Pages>
142
+ <BaudRate>14400</BaudRate>
143
+ <Duration>0.4</Duration>
144
+ <Retries>1</Retries>
145
+ <RemoteCSID>"-"</RemoteCSID>
146
+ </Recipient>
147
+ </Recipients>
148
+ </Transmission>
149
+ </OutboundStatusResponse>
150
+ XML
151
+ http_response = mock()
152
+ http_response.expects(:is_a?).with(Net::HTTPOK).returns(true)
153
+ http_response.expects(:body).returns(xml)
154
+ response = EFax::OutboundStatusResponse.new(http_response)
155
+ assert_equal "Your transmission has completed.", response.message
156
+ assert_equal "Success", response.outcome
157
+ assert_equal "Success", response.classification
158
+ assert_equal EFax::QueryStatus::SENT, response.status_code
159
+ end
160
+
161
+ def test_pending_response
162
+ xml = <<-XML
163
+ <?xml version="1.0"?>
164
+ <OutboundStatusResponse>
165
+ <Transmission>
166
+ <TransmissionControl>
167
+ <TransmissionID></TransmissionID>
168
+ </TransmissionControl>
169
+ <Recipients>
170
+ <Recipient>
171
+ <DOCID>12345678</DOCID>
172
+ <Name>Mike Rotch</Name>
173
+ <Company>Moe's</Company>
174
+ <Fax>12345678901</Fax>
175
+ <Status>
176
+ <Message>Your fax is waiting to be send</Message>
177
+ <Classification></Classification>
178
+ <Outcome></Outcome>
179
+ </Status>
180
+ <LastAttempt>
181
+ <LastDate></LastDate>
182
+ <LastTime></LastTime>
183
+ </LastAttempt>
184
+ <NextAttempt>
185
+ <NextDate></NextDate>
186
+ <NextTime></NextTime>
187
+ </NextAttempt>
188
+ <Pages>
189
+ <Scheduled>1</Scheduled>
190
+ <Sent>1</Sent>
191
+ </Pages>
192
+ <BaudRate>14400</BaudRate>
193
+ <Duration>0.4</Duration>
194
+ <Retries>1</Retries>
195
+ <RemoteCSID>"-"</RemoteCSID>
196
+ </Recipient>
197
+ </Recipients>
198
+ </Transmission>
199
+ </OutboundStatusResponse>
200
+ XML
201
+
202
+ http_response = mock()
203
+ http_response.expects(:is_a?).with(Net::HTTPOK).returns(true)
204
+ http_response.expects(:body).returns(xml)
205
+ response = EFax::OutboundStatusResponse.new(http_response)
206
+
207
+ assert_equal "", response.outcome
208
+ assert_equal "", response.classification
209
+ assert_equal EFax::QueryStatus::PENDING, response.status_code
210
+ end
211
+
212
+ def test_failed_response
213
+ xml = <<-XML
214
+ <?xml version="1.0"?>
215
+ <OutboundStatusResponse>
216
+ <Transmission>
217
+ <TransmissionControl>
218
+ <TransmissionID></TransmissionID>
219
+ </TransmissionControl>
220
+ <Recipients>
221
+ <Recipient>
222
+ <DOCID>12345678</DOCID>
223
+ <Name>Mike Rotch</Name>
224
+ <Company>Moe's</Company>
225
+ <Fax>12345678901</Fax>
226
+ <Status>
227
+ <Message>Your fax caused the world to end</Message>
228
+ <Classification>Apocalyptic failure</Classification>
229
+ <Outcome>End of days</Outcome>
230
+ </Status>
231
+ <LastAttempt>
232
+ <LastDate></LastDate>
233
+ <LastTime></LastTime>
234
+ </LastAttempt>
235
+ <NextAttempt>
236
+ <NextDate></NextDate>
237
+ <NextTime></NextTime>
238
+ </NextAttempt>
239
+ <Pages>
240
+ <Scheduled>1</Scheduled>
241
+ <Sent>0</Sent>
242
+ </Pages>
243
+ <BaudRate></BaudRate>
244
+ <Duration></Duration>
245
+ <Retries>1</Retries>
246
+ <RemoteCSID>"-"</RemoteCSID>
247
+ </Recipient>
248
+ </Recipients>
249
+ </Transmission>
250
+ </OutboundStatusResponse>
251
+ XML
252
+
253
+ http_response = mock()
254
+ http_response.expects(:is_a?).with(Net::HTTPOK).returns(true)
255
+ http_response.expects(:body).returns(xml)
256
+ response = EFax::OutboundStatusResponse.new(http_response)
257
+
258
+ assert_equal "Your fax caused the world to end", response.message
259
+ assert_equal "End of days", response.outcome
260
+ assert_equal "Apocalyptic failure", response.classification
261
+ assert_equal EFax::QueryStatus::FAILURE, response.status_code
262
+ end
263
+
264
+ end
265
+
266
+ class OutboundRequestTest < Test::Unit::TestCase
267
+ def test_generate_xml
268
+ expected_xml = <<-XML
269
+ <?xml version="1.0" encoding="UTF-8"?>
270
+ <OutboundRequest>
271
+ <AccessControl>
272
+ <UserName>Mike Rotch</UserName>
273
+ <Password>moes</Password>
274
+ </AccessControl>
275
+ <Transmission>
276
+ <TransmissionControl>
277
+ <Resolution>FINE</Resolution>
278
+ <Priority>NORMAL</Priority>
279
+ <SelfBusy>ENABLE</SelfBusy>
280
+ <FaxHeader>Subject</FaxHeader>
281
+ </TransmissionControl>
282
+ <DispositionControl>
283
+ <DispositionLevel>NONE</DispositionLevel>
284
+ </DispositionControl>
285
+ <Recipients>
286
+ <Recipient>
287
+ <RecipientName>I. P. Freely</RecipientName>
288
+ <RecipientCompany>Moe's</RecipientCompany>
289
+ <RecipientFax>12345678901</RecipientFax>
290
+ </Recipient>
291
+ </Recipients>
292
+ <Files>
293
+ <File>
294
+ <FileContents>PGh0bWw+PGJvZHk+PGgxPlRlc3Q8L2gxPjwvYm9keT48L2h0bWw+</FileContents>
295
+ <FileType>html</FileType>
296
+ </File>
297
+ </Files>
298
+ </Transmission>
299
+ </OutboundRequest>
300
+ XML
301
+ EFax::Request.user = "Mike Rotch"
302
+ EFax::Request.password = "moes"
303
+ EFax::OutboundRequest.publicize_class_methods do
304
+ assert_equal expected_xml.delete(" "), EFax::OutboundRequest.xml("I. P. Freely", "Moe's", "12345678901", "Subject", "<html><body><h1>Test</h1></body></html>").delete(" ")
305
+ end
306
+ end
307
+ end
308
+
309
+ class OutboundStatusTest < Test::Unit::TestCase
310
+ def test_generate_xml
311
+ expected_xml = <<-XML
312
+ <?xml version="1.0" encoding="UTF-8"?>
313
+ <OutboundStatus>
314
+ <AccessControl>
315
+ <UserName>Mike Rotch</UserName>
316
+ <Password>moes</Password>
317
+ </AccessControl>
318
+ <Transmission>
319
+ <TransmissionControl>
320
+ <DOCID>123456</DOCID>
321
+ </TransmissionControl>
322
+ </Transmission>
323
+ </OutboundStatus>
324
+ XML
325
+
326
+ EFax::OutboundStatus.publicize_class_methods do
327
+ assert_equal expected_xml.delete(" "), EFax::OutboundStatus.xml("123456").delete(" ")
328
+ end
329
+ end
330
+ end
331
+
332
+ class OutboundStatusTest < Test::Unit::TestCase
333
+ def test_generate_xml
334
+ expected_xml = <<-XML
335
+ <?xml version="1.0" encoding="UTF-8"?>
336
+ <OutboundStatus>
337
+ <AccessControl>
338
+ <UserName>Mike Rotch</UserName>
339
+ <Password>moes</Password>
340
+ </AccessControl>
341
+ <Transmission>
342
+ <TransmissionControl>
343
+ <DOCID>123456</DOCID>
344
+ </TransmissionControl>
345
+ </Transmission>
346
+ </OutboundStatus>
347
+ XML
348
+
349
+ EFax::Request.user = "Mike Rotch"
350
+ EFax::Request.password = "moes"
351
+ EFax::OutboundStatus.publicize_class_methods do
352
+ assert_equal expected_xml.delete(" "), EFax::OutboundStatus.xml("123456").delete(" ")
353
+ end
354
+ end
355
+ end
356
+
357
+ end
@@ -0,0 +1,20 @@
1
+ require 'test/unit'
2
+ require 'rubygems'
3
+ require 'mocha'
4
+ require File.dirname(__FILE__) + '/../lib/efax'
5
+
6
+ class Class
7
+ def publicize_instance_methods
8
+ saved_private_instance_methods = self.private_instance_methods
9
+ self.class_eval { public(*saved_private_instance_methods) }
10
+ yield
11
+ self.class_eval { private(*saved_private_instance_methods) }
12
+ end
13
+
14
+ def publicize_class_methods
15
+ saved_private_class_methods = self.private_methods(false)
16
+ self.class_eval { public_class_method(*saved_private_class_methods) }
17
+ yield
18
+ self.class_eval { private_class_method(*saved_private_class_methods) }
19
+ end
20
+ end
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: efax
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Szymon Nowak
8
+ - Pawel Kozlowski
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2009-09-28 00:00:00 +02:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: hpricot
18
+ type: :runtime
19
+ version_requirement:
20
+ version_requirements: !ruby/object:Gem::Requirement
21
+ requirements:
22
+ - - ">="
23
+ - !ruby/object:Gem::Version
24
+ version: 0.8.1
25
+ version:
26
+ - !ruby/object:Gem::Dependency
27
+ name: mocha
28
+ type: :development
29
+ version_requirement:
30
+ version_requirements: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: "0.9"
35
+ version:
36
+ description:
37
+ email: szimek@gmail.com
38
+ executables: []
39
+
40
+ extensions: []
41
+
42
+ extra_rdoc_files:
43
+ - README.rdoc
44
+ files:
45
+ - .gitignore
46
+ - README.rdoc
47
+ - Rakefile
48
+ - TODO
49
+ - VERSION
50
+ - lib/efax.rb
51
+ - ruby-efax.gemspec
52
+ - test/efax_test.rb
53
+ - test/test_helper.rb
54
+ has_rdoc: true
55
+ homepage: http://github.com/szimek/efax
56
+ licenses: []
57
+
58
+ post_install_message:
59
+ rdoc_options:
60
+ - --charset=UTF-8
61
+ require_paths:
62
+ - lib
63
+ required_ruby_version: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ version: "0"
68
+ version:
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ version: "0"
74
+ version:
75
+ requirements: []
76
+
77
+ rubyforge_project: efax
78
+ rubygems_version: 1.3.5
79
+ signing_key:
80
+ specification_version: 3
81
+ summary: Ruby library for accessing the eFax Developer service
82
+ test_files:
83
+ - test/test_helper.rb
84
+ - test/efax_test.rb