postful 0.1.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.
Files changed (64) hide show
  1. data/doc/classes/Postful/AuthorizationException.html +111 -0
  2. data/doc/classes/Postful/Base.html +255 -0
  3. data/doc/classes/Postful/Base.src/M000001.html +21 -0
  4. data/doc/classes/Postful/Base.src/M000002.html +23 -0
  5. data/doc/classes/Postful/Base.src/M000003.html +22 -0
  6. data/doc/classes/Postful/Base.src/M000004.html +22 -0
  7. data/doc/classes/Postful/Base.src/M000005.html +20 -0
  8. data/doc/classes/Postful/Base.src/M000006.html +18 -0
  9. data/doc/classes/Postful/InternalServerError.html +111 -0
  10. data/doc/classes/Postful/Letter.html +347 -0
  11. data/doc/classes/Postful/Letter.src/M000015.html +18 -0
  12. data/doc/classes/Postful/Letter.src/M000016.html +18 -0
  13. data/doc/classes/Postful/Letter.src/M000017.html +18 -0
  14. data/doc/classes/Postful/Letter.src/M000018.html +18 -0
  15. data/doc/classes/Postful/Letter.src/M000019.html +18 -0
  16. data/doc/classes/Postful/Letter.src/M000020.html +18 -0
  17. data/doc/classes/Postful/Letter.src/M000021.html +18 -0
  18. data/doc/classes/Postful/Letter.src/M000022.html +18 -0
  19. data/doc/classes/Postful/Letter.src/M000023.html +18 -0
  20. data/doc/classes/Postful/Letter.src/M000024.html +18 -0
  21. data/doc/classes/Postful/Letter.src/M000025.html +18 -0
  22. data/doc/classes/Postful/Letter.src/M000026.html +18 -0
  23. data/doc/classes/Postful/NotFoundException.html +111 -0
  24. data/doc/classes/Postful/Order.html +276 -0
  25. data/doc/classes/Postful/Order.src/M000007.html +19 -0
  26. data/doc/classes/Postful/Order.src/M000008.html +24 -0
  27. data/doc/classes/Postful/Order.src/M000009.html +26 -0
  28. data/doc/classes/Postful/Order.src/M000010.html +18 -0
  29. data/doc/classes/Postful/Service.html +191 -0
  30. data/doc/classes/Postful/Service.src/M000011.html +19 -0
  31. data/doc/classes/Postful/Service.src/M000012.html +24 -0
  32. data/doc/classes/Postful/Service.src/M000013.html +19 -0
  33. data/doc/classes/Postful/Service.src/M000014.html +24 -0
  34. data/doc/classes/Postful/UnknownResponseException.html +111 -0
  35. data/doc/classes/Postful/ValidationException.html +111 -0
  36. data/doc/created.rid +1 -0
  37. data/doc/files/MIT-LICENSE.html +129 -0
  38. data/doc/files/README.html +164 -0
  39. data/doc/files/lib/postful/base_rb.html +108 -0
  40. data/doc/files/lib/postful/instance_exec_module_rb.html +101 -0
  41. data/doc/files/lib/postful/letter_rb.html +109 -0
  42. data/doc/files/lib/postful/order_rb.html +110 -0
  43. data/doc/files/lib/postful/service_rb.html +109 -0
  44. data/doc/files/lib/postful/util_rb.html +101 -0
  45. data/doc/files/lib/postful_rb.html +110 -0
  46. data/doc/fr_class_index.html +35 -0
  47. data/doc/fr_file_index.html +35 -0
  48. data/doc/fr_method_index.html +52 -0
  49. data/doc/index.html +24 -0
  50. data/doc/rdoc-style.css +208 -0
  51. data/lib/postful.rb +3 -0
  52. data/lib/postful/base.rb +163 -0
  53. data/lib/postful/instance_exec_module.rb +25 -0
  54. data/lib/postful/letter.rb +134 -0
  55. data/lib/postful/order.rb +130 -0
  56. data/lib/postful/service.rb +40 -0
  57. data/lib/postful/util.rb +69 -0
  58. data/test/suite.rb +5 -0
  59. data/test/test_base.rb +131 -0
  60. data/test/test_letter.rb +115 -0
  61. data/test/test_order.rb +49 -0
  62. data/test/test_postcard.rb +12 -0
  63. data/test/test_service.rb +52 -0
  64. metadata +128 -0
@@ -0,0 +1,40 @@
1
+ require 'net/http'
2
+ require "net/https"
3
+ require File.join(File.dirname(__FILE__), 'order')
4
+ require File.join(File.dirname(__FILE__), 'util')
5
+
6
+ module Postful
7
+ class Service
8
+ include Util
9
+
10
+ def initialize(email, password)
11
+ @email = email
12
+ @password = password
13
+ end
14
+
15
+ def find_order_by_id(id)
16
+ response = get_request_on_path("/service/mail/#{id}", @email, @password)
17
+ case response.code
18
+ when "200" then
19
+ Postful::Order.build_from_response(response.body, @email, @password)
20
+ else
21
+ process_standard_responses(response)
22
+ end
23
+ end
24
+
25
+ def cancel_order_by_id(id)
26
+ order = Postful::Order.new { @id = id }
27
+ order.cancel
28
+ end
29
+
30
+ def find_all_orders
31
+ response = get_request_on_path("/service/mail", @email, @password)
32
+ case response.code
33
+ when "200" then
34
+ Postful::Order.build_all_from_response(response.body, @email, @password)
35
+ else
36
+ process_standard_responses(response)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,69 @@
1
+ module Postful
2
+ module Util #:nodoc:
3
+ protected
4
+
5
+ def build_error_message_from_response(response)
6
+ document = REXML::Document.new response
7
+ errors = []
8
+ document.elements.each("errors/error") do |element|
9
+ errors << element.text
10
+ end
11
+ errors.join("\n")
12
+ end
13
+
14
+ def authorization_header(email, password)
15
+ 'Basic ' + ["#{email}:#{password}"].pack('m').delete("\r\n")
16
+ end
17
+
18
+ def process_standard_responses(response)
19
+ case response.code
20
+ when "500" then
21
+ raise Postful::InternalServerError
22
+ when "401" then
23
+ raise Postful::AuthorizationException
24
+ when "404" then
25
+ raise Postful::NotFoundException
26
+ else
27
+ raise Postful::UnknownResponseException, response.code
28
+ end
29
+ end
30
+
31
+ def delete_request_on_path(path, email, password)
32
+ http = Net::HTTP.new('www.postful.com', 443)
33
+ http.use_ssl = true
34
+ silence_warnings do
35
+ http.start() {|http|
36
+ request = Net::HTTP::Delete.new(path)
37
+ request.basic_auth email, password
38
+ http.request(request)
39
+ }
40
+ end
41
+ end
42
+
43
+ def get_request_on_path(path, email, password)
44
+ http = Net::HTTP.new('www.postful.com', 443)
45
+ http.use_ssl = true
46
+ silence_warnings do
47
+ http.start() {|http|
48
+ request = Net::HTTP::Get.new(path)
49
+ request.basic_auth email, password
50
+ http.request(request)
51
+ }
52
+ end
53
+ end
54
+
55
+ def post_request_on_path(path, post, email, password, headers = {})
56
+ http = Net::HTTP.new('www.postful.com', 443)
57
+ http.use_ssl = true
58
+ headers.merge!({ 'Authorization' => authorization_header(email, password) })
59
+ silence_warnings { http.post(path, post, headers) }
60
+ end
61
+
62
+ def silence_warnings
63
+ old_verbose, $VERBOSE = $VERBOSE, nil
64
+ yield
65
+ ensure
66
+ $VERBOSE = old_verbose
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,5 @@
1
+ require 'test/unit'
2
+ require 'test/test_base'
3
+ require 'test/test_letter'
4
+ require 'test/test_order'
5
+ require 'test/test_service'
@@ -0,0 +1,131 @@
1
+ require 'test/unit'
2
+ require 'fake_web'
3
+ require 'lib/postful/base'
4
+ require 'rexml/document'
5
+
6
+ class TestBase < Test::Unit::TestCase
7
+ def setup
8
+ @base = Postful::Base.new('email', 'password')
9
+ end
10
+
11
+ def test_tags
12
+ @base.tag1 = 'tag 1'
13
+ @base.tag2 = 'tag 2'
14
+ @base.tag3 = 'tag 3'
15
+ @request = @base.send :build_request
16
+ assert_equal 'tag 1', fetch_tag('mail/tag1')
17
+ assert_equal 'tag 2', fetch_tag('mail/tag2')
18
+ assert_equal 'tag 3', fetch_tag('mail/tag3')
19
+ end
20
+
21
+ def test_return_address
22
+ @base.return_address = ['Address 1', 'Address 2', 'Address 3']
23
+ @request = @base.send :build_request
24
+ assert_equal 'Address 1', fetch_tag('mail/return_address/line1')
25
+ assert_equal 'Address 2', fetch_tag('mail/return_address/line2')
26
+ assert_equal 'Address 3', fetch_tag('mail/return_address/line3')
27
+ end
28
+
29
+ def test_creates_order
30
+ FakeWeb.register_uri('https://www.postful.com/service/mail', :string => fixture('201.xml'), :status => '201')
31
+ FakeWeb.register_uri('http://www.postful.com/', :string => 'Test Response')
32
+ order = @base.send :send_request, nil
33
+ assert order
34
+ assert_equal 'Received', order.status
35
+ assert_equal 999999, order.id
36
+ assert_equal 'web_service', order.source
37
+ assert_equal 1, order.pages
38
+ assert_equal 'http://www.postful.com', order.preview_url
39
+ assert_equal 'Test Response', order.preview
40
+ assert_equal '$0.99', order.price
41
+ assert_equal 'first', order.tag1
42
+ assert_equal 'second', order.tag2
43
+ assert_equal 'third', order.tag3
44
+ assert_equal [[Time.utc(2008, 'aug', 5, 17, 44, 2), 'Received'], [Time.utc(2008, 'aug', 6, 17, 44, 2), 'Prepared']],
45
+ order.history
46
+ assert_equal ['Warning 1!', 'Warning 2!'], order.warnings
47
+ assert_equal ['Error 1!', 'Error 2!'], order.errors
48
+ assert_equal [
49
+ ['The Queen', 'Buckingham Palace', 'London SW1A 1AA', 'United Kingdom'],
50
+ ['Sherlock Holmes', '221B Baker Street', 'London NW1', 'United Kingdom']],
51
+ order.addressees
52
+ assert_equal ['Postful, Inc', '123 Postful St', 'Postful, CA 10000'], order.return_address
53
+ end
54
+
55
+ def test_unprocessable_entity
56
+ FakeWeb.register_uri('https://www.postful.com/service/mail', :string => fixture('422.xml'), :status => '422')
57
+ exception = assert_raises Postful::ValidationException do
58
+ @base.send :send_request, nil
59
+ end
60
+ assert_equal "Some error\nAnother error", exception.message
61
+ end
62
+
63
+ def test_unauthorized
64
+ FakeWeb.register_uri('https://www.postful.com/service/mail', :status => '401')
65
+ assert_raises Postful::AuthorizationException do
66
+ @base.send :send_request, nil
67
+ end
68
+ end
69
+
70
+ def test_server_error
71
+ FakeWeb.register_uri('https://www.postful.com/service/mail', :status => '500')
72
+ assert_raises Postful::InternalServerError do
73
+ @base.send :send_request, nil
74
+ end
75
+ end
76
+
77
+ def test_add_international_address
78
+ address = @base.add_international_address ['The Queen', 'Buckingham Palace', 'London SW1A 1AA'], 'ENGLAND'
79
+ assert_equal 'ENGLAND', address.country
80
+ assert_equal ['The Queen', 'Buckingham Palace', 'London SW1A 1AA'], address.lines
81
+ end
82
+
83
+ def test_build_request_international_addressee
84
+ @base.add_international_address ['Buckingham Palace', 'London SW1A 1AA'], 'ENGLAND'
85
+ xml = @base.send(:build_request)
86
+ assert_equal %(<mail><documents></documents><addressees><addressee><line1>Buckingham Palace</line1><line2>London SW1A 1AA</line2><country>ENGLAND</country></addressee></addressees></mail>), xml
87
+ end
88
+
89
+ def test_build_request_domestic_addressee
90
+ @base.add_address :name => 'John Doe', :address => '123 Main St', :city => 'Anytown', :state => 'AZ', :postal_code => '10000'
91
+ xml = @base.send(:build_request)
92
+ assert_equal %(<mail><documents></documents><addressees><addressee><name>John Doe</name><address>123 Main St</address><city>Anytown</city><state>AZ</state><postal_code>10000</postal_code></addressee></addressees></mail>), xml
93
+ end
94
+
95
+ def test_add_address
96
+ address = @base.add_address :name => 'John Doe',
97
+ :company => 'Postful, Inc',
98
+ :address => '123 Main St',
99
+ :address2 => 'Suite A',
100
+ :city => 'Anytown',
101
+ :state => 'AZ',
102
+ :postal_code => '10000'
103
+ assert_equal 'John Doe', address.name
104
+ assert_equal 'Postful, Inc', address.company
105
+ assert_equal 'Suite A', address.address2
106
+ assert_equal 'Anytown', address.city
107
+ assert_equal 'AZ', address.state
108
+ assert_equal '10000', address.postal_code
109
+ end
110
+
111
+ def test_requires_address
112
+ assert !@base.valid?
113
+ assert_equal 'Requires at least one addressee', @base.errors.first
114
+ end
115
+
116
+ private
117
+
118
+ def fixture(filename)
119
+ f = File.join(File.dirname(__FILE__), 'responses', filename)
120
+ open(f, "rb") do |io|
121
+ io.read
122
+ end
123
+ end
124
+
125
+ def fetch_tag(tag)
126
+ @document ||= begin
127
+ REXML::Document.new @request
128
+ end
129
+ @document.elements[tag] && @document.elements[tag].text
130
+ end
131
+ end
@@ -0,0 +1,115 @@
1
+ require 'test/unit'
2
+ require 'fake_web'
3
+ require 'lib/postful/letter'
4
+
5
+ class TestLetter < Test::Unit::TestCase
6
+ def setup
7
+ @letter = Postful::Letter.new('email', 'password')
8
+ end
9
+
10
+ def test_build_request_document
11
+ document = @letter.add_html_document '<b>Hello, world!</b>'
12
+ document.attachment_name = 'porcupine'
13
+ xml = @letter.send(:build_request)
14
+ assert_equal %(<mail><documents><document><type>html</type><attachment>porcupine</attachment></document></documents><addressees></addressees></mail>), xml
15
+ end
16
+
17
+ def test_upload
18
+ FakeWeb.register_uri('https://www.postful.com/service/upload', :string => %(
19
+ <?xml version="1.0" encoding="UTF-8"?><upload><id>290797321.waltershandy.2</id></upload>))
20
+ document = @letter.add_html_document '<b>Hello, world!</b>'
21
+ document.upload
22
+ assert_equal '290797321.waltershandy.2', document.attachment_name
23
+ end
24
+
25
+ def test_add_html_document
26
+ document = @letter.add_html_document '<b>Hello, world!</b>'
27
+ assert_equal 'html', document.format
28
+ assert_equal '<b>Hello, world!</b>', document.content
29
+ end
30
+
31
+ def test_add_html_document_from_file
32
+ document = @letter.add_html_document_from_file fixture('sample.txt')
33
+ assert_equal 'html', document.format
34
+ assert_equal 'Hello, world!', document.content
35
+ end
36
+
37
+ def test_add_word_document
38
+ document = @letter.add_word_document 'Example Word Document'
39
+ assert_equal 'doc', document.format
40
+ assert_equal 'Example Word Document', document.content
41
+ end
42
+
43
+ def test_add_word_document_from_file
44
+ document = @letter.add_word_document_from_file fixture('sample.txt')
45
+ assert_equal 'doc', document.format
46
+ assert_equal 'Hello, world!', document.content
47
+ end
48
+
49
+ def test_add_rtf_document
50
+ document = @letter.add_rtf_document 'Example RTF Document'
51
+ assert_equal 'rtf', document.format
52
+ assert_equal 'Example RTF Document', document.content
53
+ end
54
+
55
+ def test_add_rtf_document_from_file
56
+ document = @letter.add_rtf_document_from_file fixture('sample.txt')
57
+ assert_equal 'rtf', document.format
58
+ assert_equal 'Hello, world!', document.content
59
+ end
60
+
61
+ def test_add_odt_document
62
+ document = @letter.add_open_office_document 'Example Open Office Document'
63
+ assert_equal 'odt', document.format
64
+ assert_equal 'Example Open Office Document', document.content
65
+ end
66
+
67
+ def test_add_odt_document_from_file
68
+ document = @letter.add_open_office_document_from_file fixture('sample.txt')
69
+ assert_equal 'odt', document.format
70
+ assert_equal 'Hello, world!', document.content
71
+ end
72
+
73
+ def test_add_text_document
74
+ document = @letter.add_text_document 'Example text Document'
75
+ assert_equal 'txt', document.format
76
+ assert_equal 'Example text Document', document.content
77
+ end
78
+
79
+ def test_add_text_document_from_file
80
+ document = @letter.add_text_document_from_file fixture('sample.txt')
81
+ assert_equal 'txt', document.format
82
+ assert_equal 'Hello, world!', document.content
83
+ end
84
+
85
+ def test_add_pdf_document
86
+ document = @letter.add_pdf_document 'Example PDF Document'
87
+ assert_equal 'pdf', document.format
88
+ assert_equal 'Example PDF Document', document.content
89
+ end
90
+
91
+ def test_add_pdf_document_from_file
92
+ document = @letter.add_pdf_document_from_file fixture('sample.txt')
93
+ assert_equal 'pdf', document.format
94
+ assert_equal 'Hello, world!', document.content
95
+ end
96
+
97
+ def test_requires_document
98
+ @letter.add_international_address ['Buckingham Palace', 'London SW1A 1AA'], 'ENGLAND'
99
+ assert !@letter.valid?
100
+ assert_equal 'Requires at least one document', @letter.errors.first
101
+ end
102
+
103
+ def test_valid_with_letter_and_document
104
+ @letter.add_international_address ['Buckingham Palace', 'London SW1A 1AA'], 'ENGLAND'
105
+ @letter.add_pdf_document 'Example PDF Document'
106
+ assert @letter.send(:valid?)
107
+ end
108
+
109
+ private
110
+
111
+ def fixture(filename)
112
+ File.join(File.dirname(__FILE__), 'fixtures', filename)
113
+ end
114
+
115
+ end
@@ -0,0 +1,49 @@
1
+ require 'test/unit'
2
+ require 'fake_web'
3
+ require 'lib/postful/service'
4
+
5
+ class TestOrder < Test::Unit::TestCase
6
+ def setup
7
+ @service = Postful::Service.new('email', 'password')
8
+ end
9
+
10
+ def test_cancel
11
+ FakeWeb.register_uri('https://www.postful.com/service/mail/999999', :status => '200', :string => fixture('delete.xml'))
12
+ order = Postful::Order.new { @id = 999999 }
13
+ assert order.status.nil?
14
+ order.cancel
15
+ assert_equal 'Canceled', order.status
16
+ end
17
+
18
+ def test_cannot_cancel
19
+ FakeWeb.register_uri('https://www.postful.com/service/mail/1', :status => '422', :string => fixture('422.xml'))
20
+ order = Postful::Order.new { @id = 1 }
21
+ assert_raises Postful::ValidationException do
22
+ order.cancel
23
+ end
24
+ end
25
+
26
+ def test_refresh
27
+ FakeWeb.register_uri('https://www.postful.com/service/mail/999999', :string => fixture('get.xml'))
28
+ service = Postful::Service.new('email', 'password')
29
+ order = service.find_order_by_id(999999)
30
+ assert_equal 'Error', order.status
31
+ FakeWeb.register_uri('https://www.postful.com/service/mail/999999', :string => fixture('modified_get.xml'))
32
+ order.refresh
33
+ assert_equal 'Prepared', order.status
34
+ end
35
+
36
+ def test_find_all
37
+
38
+ end
39
+
40
+ private
41
+
42
+ def fixture(filename)
43
+ f = File.join(File.dirname(__FILE__), 'responses', filename)
44
+ open(f, "rb") do |io|
45
+ io.read
46
+ end
47
+ end
48
+
49
+ end
@@ -0,0 +1,12 @@
1
+ require 'test/unit'
2
+ require 'fake_web'
3
+
4
+ class TestPostcard < Test::Unit::TestCase
5
+ def setup
6
+ # @postcard = Postful::Postcard.new('email', 'password')
7
+ end
8
+
9
+ def test_request_raises_authorization_exception
10
+
11
+ end
12
+ end
@@ -0,0 +1,52 @@
1
+ require 'test/unit'
2
+ require 'fake_web'
3
+ require 'lib/postful/service'
4
+
5
+ class TestService < Test::Unit::TestCase
6
+ def setup
7
+ @service = Postful::Service.new('email', 'password')
8
+ end
9
+
10
+ def test_cancel_order_by_id
11
+ FakeWeb.register_uri('https://www.postful.com/service/mail/999999', :status => '200', :string => fixture('delete.xml'))
12
+ order = @service.cancel_order_by_id(999999)
13
+ assert_equal 'Canceled', order.status
14
+ end
15
+
16
+ def test_cancel_order_not_found
17
+ FakeWeb.register_uri('https://www.postful.com/service/mail/999999', :status => '404', :string => 'Junk response')
18
+ assert_raises Postful::NotFoundException do
19
+ @service.cancel_order_by_id(999999)
20
+ end
21
+ end
22
+
23
+ def test_find_order_by_id
24
+ FakeWeb.register_uri('https://www.postful.com/service/mail/999999', :string => fixture('get.xml'))
25
+ order = @service.find_order_by_id(999999)
26
+ assert_equal 999999, order.id
27
+ end
28
+
29
+ def test_find_order_not_found
30
+ FakeWeb.register_uri('https://www.postful.com/service/mail/999999', :status => '404', :string => 'Junk response')
31
+ assert_raises Postful::NotFoundException do
32
+ @service.find_order_by_id(999999)
33
+ end
34
+ end
35
+
36
+ def test_find_all_orders
37
+ FakeWeb.register_uri('https://www.postful.com/service/mail', :string => fixture('get_all.xml'))
38
+ orders = @service.find_all_orders
39
+ assert_equal 2, orders.size
40
+ assert_equal 'Canceled', orders.first.status
41
+ assert_equal 'Mailed', orders.last.status
42
+ end
43
+
44
+ private
45
+
46
+ def fixture(filename)
47
+ f = File.join(File.dirname(__FILE__), 'responses', filename)
48
+ open(f, "rb") do |io|
49
+ io.read
50
+ end
51
+ end
52
+ end