reactive_shipping 3.0.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 (247) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +15 -0
  3. data/.travis.yml +33 -0
  4. data/.yardopts +13 -0
  5. data/CHANGELOG.md +225 -0
  6. data/CONTRIBUTING.md +23 -0
  7. data/Gemfile +3 -0
  8. data/MIT-LICENSE +21 -0
  9. data/README.md +158 -0
  10. data/Rakefile +35 -0
  11. data/dev.yml +17 -0
  12. data/gemfiles/activesupport42.gemfile +5 -0
  13. data/gemfiles/activesupport50.gemfile +6 -0
  14. data/gemfiles/activesupport51.gemfile +5 -0
  15. data/gemfiles/activesupport52.gemfile +5 -0
  16. data/gemfiles/activesupport_master.gemfile +5 -0
  17. data/lib/certs/eParcel.dtd +111 -0
  18. data/lib/reactive_shipping.rb +26 -0
  19. data/lib/reactive_shipping/address_validation_response.rb +30 -0
  20. data/lib/reactive_shipping/carrier.rb +184 -0
  21. data/lib/reactive_shipping/carriers.rb +35 -0
  22. data/lib/reactive_shipping/carriers/australia_post.rb +248 -0
  23. data/lib/reactive_shipping/carriers/benchmark_carrier.rb +31 -0
  24. data/lib/reactive_shipping/carriers/bogus_carrier.rb +12 -0
  25. data/lib/reactive_shipping/carriers/canada_post.rb +263 -0
  26. data/lib/reactive_shipping/carriers/canada_post_pws.rb +908 -0
  27. data/lib/reactive_shipping/carriers/fedex.rb +797 -0
  28. data/lib/reactive_shipping/carriers/kunaki.rb +155 -0
  29. data/lib/reactive_shipping/carriers/new_zealand_post.rb +260 -0
  30. data/lib/reactive_shipping/carriers/shipwire.rb +178 -0
  31. data/lib/reactive_shipping/carriers/stamps.rb +860 -0
  32. data/lib/reactive_shipping/carriers/ups.rb +1060 -0
  33. data/lib/reactive_shipping/carriers/usps.rb +708 -0
  34. data/lib/reactive_shipping/carriers/usps_returns.rb +86 -0
  35. data/lib/reactive_shipping/delivery_date_estimate.rb +20 -0
  36. data/lib/reactive_shipping/delivery_date_estimates_response.rb +11 -0
  37. data/lib/reactive_shipping/errors.rb +35 -0
  38. data/lib/reactive_shipping/external_return_label_request.rb +417 -0
  39. data/lib/reactive_shipping/external_return_label_response.rb +26 -0
  40. data/lib/reactive_shipping/label.rb +10 -0
  41. data/lib/reactive_shipping/label_response.rb +10 -0
  42. data/lib/reactive_shipping/location.rb +166 -0
  43. data/lib/reactive_shipping/package.rb +165 -0
  44. data/lib/reactive_shipping/package_item.rb +60 -0
  45. data/lib/reactive_shipping/rate_estimate.rb +197 -0
  46. data/lib/reactive_shipping/rate_response.rb +33 -0
  47. data/lib/reactive_shipping/response.rb +44 -0
  48. data/lib/reactive_shipping/shipment_event.rb +22 -0
  49. data/lib/reactive_shipping/shipment_packer.rb +108 -0
  50. data/lib/reactive_shipping/shipping_response.rb +34 -0
  51. data/lib/reactive_shipping/tracking_response.rb +120 -0
  52. data/lib/reactive_shipping/version.rb +3 -0
  53. data/reactive_shipping.gemspec +38 -0
  54. data/shipit.rubygems.yml +1 -0
  55. data/test/console.rb +39 -0
  56. data/test/credentials.yml +76 -0
  57. data/test/fixtures/files/label1.pdf +0 -0
  58. data/test/fixtures/files/ups-shipping-label.gif +0 -0
  59. data/test/fixtures/json/australia_post/calculate_domestic.json +13 -0
  60. data/test/fixtures/json/australia_post/calculate_domestic_2.json +19 -0
  61. data/test/fixtures/json/australia_post/calculate_international.json +12 -0
  62. data/test/fixtures/json/australia_post/calculate_international_2.json +15 -0
  63. data/test/fixtures/json/australia_post/error_message.json +5 -0
  64. data/test/fixtures/json/australia_post/service_domestic.json +117 -0
  65. data/test/fixtures/json/australia_post/service_domestic_2.json +117 -0
  66. data/test/fixtures/json/australia_post/service_international.json +76 -0
  67. data/test/fixtures/json/australia_post/service_international_2.json +59 -0
  68. data/test/fixtures/json/newzealandpost/domestic_book.json +1 -0
  69. data/test/fixtures/json/newzealandpost/domestic_default.json +1 -0
  70. data/test/fixtures/json/newzealandpost/domestic_error.json +1 -0
  71. data/test/fixtures/json/newzealandpost/domestic_poster.json +1 -0
  72. data/test/fixtures/json/newzealandpost/domestic_small_half_pound.json +1 -0
  73. data/test/fixtures/json/newzealandpost/international_book.json +1 -0
  74. data/test/fixtures/json/newzealandpost/international_new_zealand_wii.json +1 -0
  75. data/test/fixtures/json/newzealandpost/international_small_half_pound.json +1 -0
  76. data/test/fixtures/json/newzealandpost/international_wii.json +1 -0
  77. data/test/fixtures/xml/canadapost/example_request.xml +25 -0
  78. data/test/fixtures/xml/canadapost/example_response.xml +130 -0
  79. data/test/fixtures/xml/canadapost/example_response_error.xml +16 -0
  80. data/test/fixtures/xml/canadapost/example_response_french.xml +122 -0
  81. data/test/fixtures/xml/canadapost/example_response_with_nil_value.xml +164 -0
  82. data/test/fixtures/xml/canadapost/example_response_with_postal_outlet.xml +155 -0
  83. data/test/fixtures/xml/canadapost/example_response_with_postal_outlet_french.xml +274 -0
  84. data/test/fixtures/xml/canadapost/example_response_with_strange_delivery_date.xml +130 -0
  85. data/test/fixtures/xml/canadapost_pws/dnc_tracking_details_en.xml +112 -0
  86. data/test/fixtures/xml/canadapost_pws/merchant_details_error.xml +7 -0
  87. data/test/fixtures/xml/canadapost_pws/merchant_details_response.xml +7 -0
  88. data/test/fixtures/xml/canadapost_pws/option_response.xml +13 -0
  89. data/test/fixtures/xml/canadapost_pws/option_response_no_conflicts.xml +7 -0
  90. data/test/fixtures/xml/canadapost_pws/rates_info.xml +190 -0
  91. data/test/fixtures/xml/canadapost_pws/rates_info_error.xml +7 -0
  92. data/test/fixtures/xml/canadapost_pws/receipt_response.xml +42 -0
  93. data/test/fixtures/xml/canadapost_pws/receipt_response_no_priced_options.xml +36 -0
  94. data/test/fixtures/xml/canadapost_pws/register_token_error.xml +7 -0
  95. data/test/fixtures/xml/canadapost_pws/register_token_response.xml +3 -0
  96. data/test/fixtures/xml/canadapost_pws/service_options_response.xml +42 -0
  97. data/test/fixtures/xml/canadapost_pws/services_error.xml +6 -0
  98. data/test/fixtures/xml/canadapost_pws/services_response.xml +32 -0
  99. data/test/fixtures/xml/canadapost_pws/shipment_domestic.xml +69 -0
  100. data/test/fixtures/xml/canadapost_pws/shipment_response.xml +20 -0
  101. data/test/fixtures/xml/canadapost_pws/shipment_us.xml +69 -0
  102. data/test/fixtures/xml/canadapost_pws/tracking_details_en.xml +152 -0
  103. data/test/fixtures/xml/canadapost_pws/tracking_details_en_error.xml +7 -0
  104. data/test/fixtures/xml/canadapost_pws/tracking_details_en_undelivered.xml +116 -0
  105. data/test/fixtures/xml/canadapost_pws/tracking_details_fr.xml +156 -0
  106. data/test/fixtures/xml/canadapost_pws/tracking_details_no_expected_delivery_date.xml +40 -0
  107. data/test/fixtures/xml/fedex/create_shipment_response.xml +2 -0
  108. data/test/fixtures/xml/fedex/freight_rate_request.xml +82 -0
  109. data/test/fixtures/xml/fedex/freight_rate_response.xml +506 -0
  110. data/test/fixtures/xml/fedex/invalid_fedex_reply.xml +27 -0
  111. data/test/fixtures/xml/fedex/ottawa_to_beverly_hills_commercial_rate_request.xml +79 -0
  112. data/test/fixtures/xml/fedex/ottawa_to_beverly_hills_no_saturday_rate_request.xml +79 -0
  113. data/test/fixtures/xml/fedex/ottawa_to_beverly_hills_rate_request.xml +80 -0
  114. data/test/fixtures/xml/fedex/ottawa_to_beverly_hills_rate_response.xml +214 -0
  115. data/test/fixtures/xml/fedex/raterequest_reply.xml +213 -0
  116. data/test/fixtures/xml/fedex/raterequest_response_with_ground_home_delivery.xml +206 -0
  117. data/test/fixtures/xml/fedex/reply_without_notifications.xml +185 -0
  118. data/test/fixtures/xml/fedex/tracking_request.xml +29 -0
  119. data/test/fixtures/xml/fedex/tracking_response_bad_tracking_number.xml +20 -0
  120. data/test/fixtures/xml/fedex/tracking_response_delivered_at_door.xml +254 -0
  121. data/test/fixtures/xml/fedex/tracking_response_delivered_at_facility.xml +403 -0
  122. data/test/fixtures/xml/fedex/tracking_response_delivered_with_signature.xml +269 -0
  123. data/test/fixtures/xml/fedex/tracking_response_empty_status_detail.xml +84 -0
  124. data/test/fixtures/xml/fedex/tracking_response_failure_code_9045.xml +52 -0
  125. data/test/fixtures/xml/fedex/tracking_response_failure_code_9080.xml +51 -0
  126. data/test/fixtures/xml/fedex/tracking_response_in_transit.xml +127 -0
  127. data/test/fixtures/xml/fedex/tracking_response_invalid_tracking_number.xml +52 -0
  128. data/test/fixtures/xml/fedex/tracking_response_missing_status_code.xml +89 -0
  129. data/test/fixtures/xml/fedex/tracking_response_multiple_results.xml +100 -0
  130. data/test/fixtures/xml/fedex/tracking_response_not_found.xml +52 -0
  131. data/test/fixtures/xml/fedex/tracking_response_shipment_exception.xml +209 -0
  132. data/test/fixtures/xml/fedex/tracking_response_unable_to_process.xml +32 -0
  133. data/test/fixtures/xml/fedex/tracking_response_with_blank_state.xml +107 -0
  134. data/test/fixtures/xml/fedex/unknown_fedex_document_reply.xml +3 -0
  135. data/test/fixtures/xml/kunaki/invalid_state_response.xml +3 -0
  136. data/test/fixtures/xml/kunaki/no_valid_items_response.xml +3 -0
  137. data/test/fixtures/xml/kunaki/successful_rates_response.xml +3 -0
  138. data/test/fixtures/xml/kunaki/unsuccessful_rates_response.xml +9 -0
  139. data/test/fixtures/xml/shipwire/international_rates_response.xml +17 -0
  140. data/test/fixtures/xml/shipwire/new_carrier_rate_response.xml +18 -0
  141. data/test/fixtures/xml/shipwire/no_rates_response.xml +7 -0
  142. data/test/fixtures/xml/shipwire/rates_response.xml +36 -0
  143. data/test/fixtures/xml/shipwire/rates_response_no_estimate.xml +14 -0
  144. data/test/fixtures/xml/stamps/authenticate_user_request.xml +15 -0
  145. data/test/fixtures/xml/stamps/authenticate_user_response.xml +10 -0
  146. data/test/fixtures/xml/stamps/cleanse_address_request.xml +19 -0
  147. data/test/fixtures/xml/stamps/cleanse_address_response.xml +27 -0
  148. data/test/fixtures/xml/stamps/create_indicium_request.xml +69 -0
  149. data/test/fixtures/xml/stamps/create_indicium_response.xml +40 -0
  150. data/test/fixtures/xml/stamps/expired_authenticator_response.xml +15 -0
  151. data/test/fixtures/xml/stamps/get_account_info_request.xml +11 -0
  152. data/test/fixtures/xml/stamps/get_account_info_response.xml +36 -0
  153. data/test/fixtures/xml/stamps/get_purchase_status_request.xml +12 -0
  154. data/test/fixtures/xml/stamps/get_purchase_status_response.xml +16 -0
  155. data/test/fixtures/xml/stamps/get_rates_request.xml +19 -0
  156. data/test/fixtures/xml/stamps/get_rates_response.xml +351 -0
  157. data/test/fixtures/xml/stamps/purchase_postage_request.xml +13 -0
  158. data/test/fixtures/xml/stamps/purchase_postage_response.xml +17 -0
  159. data/test/fixtures/xml/stamps/track_shipment_request.xml +12 -0
  160. data/test/fixtures/xml/stamps/track_shipment_response.xml +45 -0
  161. data/test/fixtures/xml/ups/access_request.xml +6 -0
  162. data/test/fixtures/xml/ups/delivered_shipment_with_refund.xml +290 -0
  163. data/test/fixtures/xml/ups/delivered_shipment_without_events_tracking_response.xml +62 -0
  164. data/test/fixtures/xml/ups/delivery_dates_response.xml +140 -0
  165. data/test/fixtures/xml/ups/example_tracking_response.xml +53 -0
  166. data/test/fixtures/xml/ups/in_transit_shipment.xml +183 -0
  167. data/test/fixtures/xml/ups/out_for_delivery_shipment.xml +165 -0
  168. data/test/fixtures/xml/ups/package_exceeds_maximum_length.xml +12 -0
  169. data/test/fixtures/xml/ups/rate_single_service.xml +54 -0
  170. data/test/fixtures/xml/ups/rescheduled_shipment.xml +204 -0
  171. data/test/fixtures/xml/ups/shipment_accept_response.xml +42 -0
  172. data/test/fixtures/xml/ups/shipment_confirm_response.xml +33 -0
  173. data/test/fixtures/xml/ups/shipment_from_tiger_direct.xml +222 -0
  174. data/test/fixtures/xml/ups/test_real_home_as_residential_destination_response.xml +290 -0
  175. data/test/fixtures/xml/ups/test_real_home_as_residential_destination_response_with_insured.xml +289 -0
  176. data/test/fixtures/xml/ups/test_real_home_as_residential_destination_with_origin_account_response.xml +311 -0
  177. data/test/fixtures/xml/ups/tracking_request.xml +9 -0
  178. data/test/fixtures/xml/ups/triple_accept_response.xml +72 -0
  179. data/test/fixtures/xml/ups/triple_confirm_response.xml +32 -0
  180. data/test/fixtures/xml/ups/void_shipment_response.xml +11 -0
  181. data/test/fixtures/xml/usps/api_error_rate_response.xml +53 -0
  182. data/test/fixtures/xml/usps/beverly_hills_to_new_york_book_commercial_base_rate_response.xml +2 -0
  183. data/test/fixtures/xml/usps/beverly_hills_to_new_york_book_commercial_plus_rate_response.xml +258 -0
  184. data/test/fixtures/xml/usps/beverly_hills_to_new_york_book_rate_response.xml +108 -0
  185. data/test/fixtures/xml/usps/beverly_hills_to_ottawa_american_wii_commercial_base_rate_response.xml +84 -0
  186. data/test/fixtures/xml/usps/beverly_hills_to_ottawa_american_wii_commercial_plus_rate_response.xml +212 -0
  187. data/test/fixtures/xml/usps/beverly_hills_to_ottawa_american_wii_rate_response.xml +230 -0
  188. data/test/fixtures/xml/usps/first_class_packages_with_invalid_mail_type_response.xml +12 -0
  189. data/test/fixtures/xml/usps/first_class_packages_with_mail_type_response.xml +16 -0
  190. data/test/fixtures/xml/usps/first_class_packages_without_mail_type_response.xml +12 -0
  191. data/test/fixtures/xml/usps/invalid_xml_response.xml +10 -0
  192. data/test/fixtures/xml/usps/invalid_xml_tracking_response_error.xml +2 -0
  193. data/test/fixtures/xml/usps/tracking_request.xml +10 -0
  194. data/test/fixtures/xml/usps/tracking_request_batch.xml +12 -0
  195. data/test/fixtures/xml/usps/tracking_response.xml +162 -0
  196. data/test/fixtures/xml/usps/tracking_response_alt.xml +53 -0
  197. data/test/fixtures/xml/usps/tracking_response_batch.xml +231 -0
  198. data/test/fixtures/xml/usps/tracking_response_failure.xml +11 -0
  199. data/test/fixtures/xml/usps/tracking_response_not_available.xml +12 -0
  200. data/test/fixtures/xml/usps/tracking_response_test_error.xml +8 -0
  201. data/test/fixtures/xml/usps/us_rate_request.xml +18 -0
  202. data/test/fixtures/xml/usps/us_rate_request_large.xml +18 -0
  203. data/test/fixtures/xml/usps/world_rate_request_only_country.xml +22 -0
  204. data/test/fixtures/xml/usps/world_rate_request_with_value.xml +24 -0
  205. data/test/fixtures/xml/usps/world_rate_request_without_value.xml +24 -0
  206. data/test/fixtures/xml/usps_returns/external_return_label_response.xml +2 -0
  207. data/test/fixtures/xml/usps_returns/external_return_label_response_failure.xml +10 -0
  208. data/test/remote/australia_post_test.rb +140 -0
  209. data/test/remote/canada_post_pws_platform_test.rb +259 -0
  210. data/test/remote/canada_post_pws_test.rb +169 -0
  211. data/test/remote/canada_post_test.rb +55 -0
  212. data/test/remote/fedex_test.rb +400 -0
  213. data/test/remote/kunaki_test.rb +37 -0
  214. data/test/remote/new_zealand_post_test.rb +149 -0
  215. data/test/remote/shipwire_test.rb +84 -0
  216. data/test/remote/stamps_test.rb +396 -0
  217. data/test/remote/usps_returns_test.rb +72 -0
  218. data/test/remote/usps_test.rb +243 -0
  219. data/test/test_helper.rb +296 -0
  220. data/test/unit/carrier_test.rb +130 -0
  221. data/test/unit/carriers/australia_post_test.rb +181 -0
  222. data/test/unit/carriers/benchmark_test.rb +18 -0
  223. data/test/unit/carriers/canada_post_pws_rating_test.rb +379 -0
  224. data/test/unit/carriers/canada_post_pws_register_test.rb +76 -0
  225. data/test/unit/carriers/canada_post_pws_shipping_test.rb +258 -0
  226. data/test/unit/carriers/canada_post_pws_test.rb +59 -0
  227. data/test/unit/carriers/canada_post_pws_tracking_test.rb +154 -0
  228. data/test/unit/carriers/canada_post_test.rb +148 -0
  229. data/test/unit/carriers/fedex_test.rb +693 -0
  230. data/test/unit/carriers/kunaki_test.rb +56 -0
  231. data/test/unit/carriers/new_zealand_post_test.rb +177 -0
  232. data/test/unit/carriers/shipwire_test.rb +188 -0
  233. data/test/unit/carriers/stamps_test.rb +245 -0
  234. data/test/unit/carriers/ups_test.rb +580 -0
  235. data/test/unit/carriers/usps_returns_test.rb +45 -0
  236. data/test/unit/carriers/usps_test.rb +633 -0
  237. data/test/unit/carriers_test.rb +16 -0
  238. data/test/unit/external_return_label_request_test.rb +258 -0
  239. data/test/unit/location_test.rb +234 -0
  240. data/test/unit/package_item_test.rb +232 -0
  241. data/test/unit/package_test.rb +404 -0
  242. data/test/unit/rate_estimate_test.rb +93 -0
  243. data/test/unit/response_test.rb +38 -0
  244. data/test/unit/shipment_event_test.rb +20 -0
  245. data/test/unit/shipment_packer_test.rb +212 -0
  246. data/test/unit/tracking_response_test.rb +41 -0
  247. metadata +684 -0
@@ -0,0 +1,56 @@
1
+ require 'test_helper'
2
+
3
+ class KunakiTest < ActiveSupport::TestCase
4
+ include ReactiveShipping::Test::Fixtures
5
+
6
+ def setup
7
+ @carrier = Kunaki.new
8
+ @items = [{ :sku => 'AF0001', :quantity => 1 }, { :sku => 'AF0002', :quantity => 2 }]
9
+ end
10
+
11
+ def test_unsuccessful_rate_request
12
+ @carrier.expects(:ssl_post).returns(xml_fixture('kunaki/unsuccessful_rates_response'))
13
+
14
+ assert_raises(ResponseError) do
15
+ begin
16
+ @carrier.find_rates(
17
+ location_fixtures[:ottawa],
18
+ location_fixtures[:beverly_hills],
19
+ package_fixtures.values_at(:book, :wii),
20
+ :items => @items
21
+ )
22
+ rescue ResponseError => e
23
+ assert_equal "Request contains invalid XML syntax", e.response.message
24
+ assert_equal "100", e.response.params["ErrorCode"]
25
+ raise
26
+ end
27
+ end
28
+ end
29
+
30
+ def test_successfully_get_rates
31
+ @carrier.expects(:ssl_post).returns(xml_fixture('kunaki/successful_rates_response'))
32
+
33
+ response = @carrier.find_rates(
34
+ location_fixtures[:ottawa],
35
+ location_fixtures[:london],
36
+ package_fixtures.values_at(:book, :wii),
37
+ :items => @items
38
+ )
39
+
40
+ assert response.success?
41
+
42
+ assert_equal 4, response.rates.size
43
+
44
+ assert rate = response.rates.first
45
+ assert_equal "USPS Priority Mail", rate.service_name
46
+ assert_nil rate.service_code
47
+ assert_equal "USPS", rate.carrier
48
+ assert_equal 800, rate.total_price
49
+ assert_equal ["UPS 2nd Day Air", "UPS Ground", "UPS Next Day Air Saver", "USPS Priority Mail"], response.rates.collect(&:service_name).sort
50
+ assert_equal [800, 1234, 2186, 3605], response.rates.collect(&:total_price).sort
51
+ end
52
+
53
+ def test_maximum_address_field_length
54
+ assert_equal 255, @carrier.maximum_address_field_length
55
+ end
56
+ end
@@ -0,0 +1,177 @@
1
+ require "test_helper"
2
+
3
+ class NewZealandPostTest < ActiveSupport::TestCase
4
+ include ReactiveShipping::Test::Fixtures
5
+
6
+ def setup
7
+ @carrier = NewZealandPost.new(:key => "4d9dc0f0-dda0-012e-066f-000c29b44ac0")
8
+ @wellington = location_fixtures[:wellington]
9
+ @auckland = location_fixtures[:auckland]
10
+ @ottawa = location_fixtures[:ottawa]
11
+ end
12
+
13
+ def test_domestic_book_request
14
+ url = "http://api.nzpost.co.nz/ratefinder/domestic?api_key=4d9dc0f0-dda0-012e-066f-000c29b44ac0&carrier=all&format=json&height=20.0&length=190.0&postcode_dest=1010&postcode_src=6011&thickness=140.0&weight=0.25"
15
+ @carrier.expects(:commit).with([url]).returns([json_fixture("newzealandpost/domestic_book")])
16
+ @carrier.find_rates(@wellington, @auckland, package_fixtures[:book])
17
+ end
18
+
19
+ def test_domestic_poster_request
20
+ url = "http://api.nzpost.co.nz/ratefinder/domestic?api_key=4d9dc0f0-dda0-012e-066f-000c29b44ac0&carrier=all&diameter=100.0&format=json&length=930.0&postcode_dest=1010&postcode_src=6011&weight=0.1"
21
+ @carrier.expects(:commit).with([url]).returns([json_fixture("newzealandpost/domestic_poster")])
22
+ @carrier.find_rates(@wellington, @auckland, package_fixtures[:poster])
23
+ end
24
+
25
+ def test_domestic_combined_request
26
+ urls = [
27
+ "http://api.nzpost.co.nz/ratefinder/domestic?api_key=4d9dc0f0-dda0-012e-066f-000c29b44ac0&carrier=all&format=json&height=20.0&length=190.0&postcode_dest=1010&postcode_src=6011&thickness=140.0&weight=0.25",
28
+ "http://api.nzpost.co.nz/ratefinder/domestic?api_key=4d9dc0f0-dda0-012e-066f-000c29b44ac0&carrier=all&format=json&height=25.4&length=25.4&postcode_dest=1010&postcode_src=6011&thickness=25.4&weight=0.226796185"
29
+ ]
30
+ @carrier.expects(:commit).with(urls).returns([json_fixture("newzealandpost/domestic_book"), json_fixture("newzealandpost/domestic_small_half_pound")])
31
+ @carrier.find_rates(@wellington, @auckland, package_fixtures.values_at(:book, :small_half_pound))
32
+ end
33
+
34
+ def test_domestic_book_response
35
+ @carrier.expects(:commit).returns([json_fixture("newzealandpost/domestic_book")])
36
+ response = @carrier.find_rates(@wellington, @auckland, package_fixtures[:book])
37
+ assert_equal 13, response.rates.size
38
+ assert_equal [300, 360, 400, 420, 450, 450, 500, 500, 550, 655, 715, 880, 890], response.rates.map(&:price)
39
+ end
40
+
41
+ def test_domestic_poster_response
42
+ @carrier.expects(:commit).returns([json_fixture("newzealandpost/domestic_poster")])
43
+ response = @carrier.find_rates(@wellington, @auckland, package_fixtures[:poster])
44
+ assert_equal 1, response.rates.size
45
+ assert_equal [750], response.rates.map(&:price)
46
+ end
47
+
48
+ def test_domestic_combined_response_parsing
49
+ @carrier.expects(:commit).returns([json_fixture("newzealandpost/domestic_book"), json_fixture("newzealandpost/domestic_small_half_pound")])
50
+ response = @carrier.find_rates(@wellington, @auckland, package_fixtures.values_at(:book, :small_half_pound))
51
+ assert_equal 8, response.rates.size
52
+ assert_equal [800, 840, 900, 900, 1000, 1100, 1430, 1780], response.rates.map(&:price)
53
+ assert_equal %w(PIKFC5 PCB3C5 PIFFC5 PIKBC5 PIFBC5 PICBC5 NZPRBA5 NZSRBA5), response.rates.map(&:service_code)
54
+ names = [
55
+ "ParcelPost C5 Flat Bag",
56
+ "ParcelPost Tracked C5 Postage Only - Tracked",
57
+ "ParcelPost Fast C5 Flat Bag",
58
+ "ParcelPost C5 Bubble Bag",
59
+ "ParcelPost Fast C5 Bubble Bag",
60
+ "ParcelPost Tracked C5 Bubble Bag - Tracked",
61
+ "Courier C5 Ready To Go Courier Bubble Bag",
62
+ "Courier C5 Ready To Go Courier Bubble Bag S/R"
63
+ ]
64
+ assert_equal names, response.rates.map(&:service_name)
65
+ end
66
+
67
+ def test_domestic_shipping_container_response_error
68
+ @carrier.expects(:commit).returns([json_fixture("newzealandpost/domestic_error")])
69
+ error = @carrier.find_rates(@wellington, @auckland, package_fixtures[:shipping_container]) rescue $!
70
+ assert_equal ReactiveShipping::ResponseError, error.class
71
+ assert_equal "Weight can only be between 0 and 25kg", error.message
72
+ assert_equal [json_fixture("newzealandpost/domestic_error")], error.response.raw_responses
73
+ response_params = { "responses" => [JSON.parse(json_fixture("newzealandpost/domestic_error"))] }
74
+ assert_equal response_params, error.response.params
75
+ end
76
+
77
+ def test_domestic_blank_package_response
78
+ url = "http://api.nzpost.co.nz/ratefinder/domestic?api_key=4d9dc0f0-dda0-012e-066f-000c29b44ac0&carrier=all&format=json&height=0.0&length=0.0&postcode_dest=1010&postcode_src=6011&thickness=0.0&weight=0.0"
79
+ @carrier.expects(:commit).with([url]).returns([json_fixture("newzealandpost/domestic_default")])
80
+ response = @carrier.find_rates(@wellington, @auckland, package_fixtures[:just_zero_grams])
81
+ assert_equal [240, 300, 400, 420, 450, 450, 450, 500, 550, 589, 715, 830, 890], response.rates.map(&:price)
82
+ end
83
+
84
+ def test_domestic_book_response_params
85
+ url = "http://api.nzpost.co.nz/ratefinder/domestic?api_key=4d9dc0f0-dda0-012e-066f-000c29b44ac0&carrier=all&format=json&height=20.0&length=190.0&postcode_dest=1010&postcode_src=6011&thickness=140.0&weight=0.25"
86
+ @carrier.expects(:commit).with([url]).returns([json_fixture("newzealandpost/domestic_book")])
87
+ response = @carrier.find_rates(@wellington, @auckland, package_fixtures[:book])
88
+ assert_equal [url], response.request
89
+ assert_equal [json_fixture("newzealandpost/domestic_book")], response.raw_responses
90
+ assert_equal [JSON.parse(json_fixture("newzealandpost/domestic_book"))], response.params["responses"]
91
+ end
92
+
93
+ def test_international_book_request
94
+ url = "http://api.nzpost.co.nz/ratefinder/international?api_key=4d9dc0f0-dda0-012e-066f-000c29b44ac0&country_code=CA&format=json&height=20.0&length=190.0&thickness=140.0&value=0&weight=0.25"
95
+ @carrier.expects(:commit).with([url]).returns([json_fixture("newzealandpost/international_book")])
96
+ @carrier.find_rates(@wellington, @ottawa, package_fixtures[:book])
97
+ end
98
+
99
+ def test_international_wii_request
100
+ url = "http://api.nzpost.co.nz/ratefinder/international?api_key=4d9dc0f0-dda0-012e-066f-000c29b44ac0&country_code=CA&format=json&height=114.3&length=381.0&thickness=254.0&value=269&weight=3.401942775"
101
+ @carrier.expects(:commit).with([url]).returns([json_fixture("newzealandpost/international_new_zealand_wii")])
102
+ @carrier.find_rates(@wellington, @ottawa, package_fixtures[:new_zealand_wii])
103
+ end
104
+
105
+ def test_international_uk_wii_request
106
+ url = "http://api.nzpost.co.nz/ratefinder/international?api_key=4d9dc0f0-dda0-012e-066f-000c29b44ac0&country_code=CA&format=json&height=114.3&length=381.0&thickness=254.0&value=0&weight=3.401942775"
107
+ @carrier.expects(:commit).with([url]).returns([json_fixture("newzealandpost/international_wii")])
108
+ @carrier.find_rates(@wellington, @ottawa, package_fixtures[:wii])
109
+ end
110
+
111
+ def test_international_book_response_params
112
+ url = "http://api.nzpost.co.nz/ratefinder/international?api_key=4d9dc0f0-dda0-012e-066f-000c29b44ac0&country_code=CA&format=json&height=20.0&length=190.0&thickness=140.0&value=0&weight=0.25"
113
+ @carrier.expects(:commit).with([url]).returns([json_fixture("newzealandpost/international_book")])
114
+ response = @carrier.find_rates(@wellington, @ottawa, package_fixtures[:book])
115
+ assert_equal [url], response.request
116
+ assert_equal [json_fixture("newzealandpost/international_book")], response.raw_responses
117
+ assert_equal [JSON.parse(json_fixture("newzealandpost/international_book"))], response.params["responses"]
118
+ end
119
+
120
+ def test_international_combined_request
121
+ urls = [
122
+ "http://api.nzpost.co.nz/ratefinder/international?api_key=4d9dc0f0-dda0-012e-066f-000c29b44ac0&country_code=CA&format=json&height=20.0&length=190.0&thickness=140.0&value=0&weight=0.25",
123
+ "http://api.nzpost.co.nz/ratefinder/international?api_key=4d9dc0f0-dda0-012e-066f-000c29b44ac0&country_code=CA&format=json&height=25.4&length=25.4&thickness=25.4&value=0&weight=0.226796185"
124
+ ]
125
+ @carrier.expects(:commit).with(urls).returns([json_fixture("newzealandpost/international_book"), json_fixture("newzealandpost/international_wii")])
126
+ @carrier.find_rates(@wellington, @ottawa, package_fixtures.values_at(:book, :small_half_pound))
127
+ end
128
+
129
+ def test_international_combined_response_parsing
130
+ @carrier.expects(:commit).returns([json_fixture("newzealandpost/international_book"), json_fixture("newzealandpost/international_small_half_pound")])
131
+ response = @carrier.find_rates(@wellington, @ottawa, package_fixtures.values_at(:book, :small_half_pound))
132
+ assert_equal 4, response.rates.size
133
+ assert_equal [13050, 8500, 2460, 2214], response.rates.map(&:price)
134
+ assert_equal %w(ICPNC500 IEZPC500 IACNC500 IECNC500), response.rates.map(&:service_code)
135
+ names = [
136
+ "International Express Courier Int Express Pcl Zone C 500gm",
137
+ "International Economy Courier Int Econ Cour Pcl Zn C 500gm",
138
+ "International Air Zone C AirPost Cust Pcl 500gm",
139
+ "International Economy Zone C EconomyPost Pcl 500gm"
140
+ ]
141
+ assert_equal names, response.rates.map(&:service_name)
142
+ end
143
+
144
+ def test_international_empty_json_response_error
145
+ @carrier.expects(:commit).returns([""])
146
+ error = @carrier.find_rates(@wellington, @ottawa, package_fixtures[:book]) rescue $!
147
+ assert_equal ReactiveShipping::ResponseError, error.class
148
+ assert_equal [""], error.response.raw_responses
149
+ response_params = { "responses" => [] }
150
+ assert_equal response_params, error.response.params
151
+ end
152
+
153
+ def test_international_invalid_json_response_error
154
+ @carrier.expects(:commit).returns(["<>"])
155
+ error = @carrier.find_rates(@wellington, @ottawa, package_fixtures[:book]) rescue $!
156
+ assert_equal ReactiveShipping::ResponseError, error.class
157
+ assert error.message.include?("unexpected token")
158
+ assert_equal ["<>"], error.response.raw_responses
159
+ response_params = { "responses" => [] }
160
+ assert_equal response_params, error.response.params
161
+ end
162
+
163
+ def test_international_invalid_origin_country_response
164
+ error = @carrier.find_rates(@ottawa, @wellington, package_fixtures[:book]) rescue $!
165
+ assert_equal ReactiveShipping::ResponseError, error.class
166
+ assert_equal "New Zealand Post packages must originate in New Zealand", error.message
167
+ assert_equal [], error.response.raw_responses
168
+ assert_equal Array, error.response.request.class
169
+ assert_equal 1, error.response.request.size
170
+ response_params = { "responses" => [] }
171
+ assert_equal response_params, error.response.params
172
+ end
173
+
174
+ def test_maximum_address_field_length
175
+ assert_equal 255, @carrier.maximum_address_field_length
176
+ end
177
+ end
@@ -0,0 +1,188 @@
1
+ require 'test_helper'
2
+
3
+ class ShipwireTest < ActiveSupport::TestCase
4
+ include ReactiveShipping::Test::Fixtures
5
+
6
+ def setup
7
+ @carrier = Shipwire.new(:login => 'l', :password => 'p')
8
+ @items = [{ :sku => 'AF0001', :quantity => 1 }, { :sku => 'AF0002', :quantity => 2 }]
9
+ end
10
+
11
+ def test_response_with_no_rates_is_unsuccessful
12
+ @carrier.expects(:ssl_post).returns(xml_fixture('shipwire/no_rates_response'))
13
+
14
+ assert_raises(ResponseError) do
15
+ @carrier.find_rates(
16
+ location_fixtures[:ottawa],
17
+ location_fixtures[:beverly_hills],
18
+ package_fixtures.values_at(:book, :wii),
19
+ :order_id => '#1000',
20
+ :items => @items
21
+ )
22
+ end
23
+ end
24
+
25
+ def test_successfully_get_international_rates
26
+ date = DateTime.parse("Mon 01 Aug 2011")
27
+ @carrier.expects(:ssl_post).returns(xml_fixture('shipwire/international_rates_response'))
28
+
29
+ Timecop.freeze(date) do
30
+ response = @carrier.find_rates(
31
+ location_fixtures[:ottawa],
32
+ location_fixtures[:london],
33
+ package_fixtures.values_at(:book, :wii),
34
+ :order_id => '#1000',
35
+ :items => @items
36
+ )
37
+
38
+ assert response.success?
39
+
40
+ assert_equal 1, response.rates.size
41
+
42
+ assert international = response.rates.first
43
+ assert_equal "INTL", international.service_code
44
+ assert_equal "UPS", international.carrier
45
+ assert_equal "UPS Standard", international.service_name
46
+ assert_equal 2806, international.total_price
47
+ assert_equal [date + 1.day, date + 7.days], international.delivery_range
48
+ end
49
+ end
50
+
51
+ def test_successfully_get_domestic_rates
52
+ date = DateTime.parse("Mon 01 Aug 2011")
53
+ @carrier.expects(:ssl_post).returns(xml_fixture('shipwire/rates_response'))
54
+
55
+ Timecop.freeze(date) do
56
+ response = @carrier.find_rates(
57
+ location_fixtures[:ottawa],
58
+ location_fixtures[:beverly_hills],
59
+ package_fixtures.values_at(:book, :wii),
60
+ :order_id => '#1000',
61
+ :items => @items
62
+ )
63
+
64
+ assert response.success?
65
+
66
+ assert_equal 3, response.rates.size
67
+
68
+ assert ground = response.rates.find { |r| r.service_code == "GD" }
69
+ assert_equal "UPS", ground.carrier
70
+ assert_equal "UPS Ground", ground.service_name
71
+ assert_equal 773, ground.total_price
72
+ assert_equal [date + 1.day, date + 7.days], ground.delivery_range
73
+
74
+ assert two_day = response.rates.find { |r| r.service_code == "2D" }
75
+ assert_equal "UPS", two_day.carrier
76
+ assert_equal "UPS Second Day Air", two_day.service_name
77
+ assert_equal 1364, two_day.total_price
78
+ assert_equal [date + 2.days, date + 2.days], two_day.delivery_range
79
+
80
+ assert one_day = response.rates.find { |r| r.service_code == "1D" }
81
+ assert_equal "USPS", one_day.carrier
82
+ assert_equal "USPS Express Mail", one_day.service_name
83
+ assert_equal 2525, one_day.total_price
84
+ assert_equal [date + 1.day, date + 1.day], one_day.delivery_range
85
+ end
86
+ end
87
+
88
+ def test_gracefully_handle_new_carrier
89
+ @carrier.expects(:ssl_post).returns(xml_fixture('shipwire/new_carrier_rate_response'))
90
+
91
+ response = @carrier.find_rates(
92
+ location_fixtures[:ottawa],
93
+ location_fixtures[:beverly_hills],
94
+ package_fixtures.values_at(:book, :wii),
95
+ :order_id => '#1000',
96
+ :items => @items
97
+ )
98
+ assert response.success?
99
+ assert_equal 1, response.rates.size
100
+ assert ground = response.rates.first
101
+ assert_equal "FESCO", ground.carrier
102
+ end
103
+
104
+ def test_find_rates_requires_items_option
105
+ assert_raises(ArgumentError) do
106
+ @carrier.find_rates(
107
+ location_fixtures[:ottawa],
108
+ location_fixtures[:beverly_hills],
109
+ package_fixtures.values_at(:book, :wii)
110
+ )
111
+ end
112
+ end
113
+
114
+ def test_validate_credentials_with_valid_credentials
115
+ @carrier.expects(:ssl_post).returns(xml_fixture('shipwire/no_rates_response'))
116
+ assert @carrier.valid_credentials?
117
+ end
118
+
119
+ def test_validate_credentials_with_invalid_credentials
120
+ response = stub(:code => '401', :body => 'Could not verify Username/EmailAddress and Password combination')
121
+
122
+ @carrier.expects(:ssl_post).raises(ActiveUtils::ResponseError.new(response))
123
+ assert !@carrier.valid_credentials?
124
+ end
125
+
126
+ def test_rate_request_includes_address_name_if_provided
127
+ name = CGI.escape("<Full>Bob Bobsen</Full>")
128
+ @carrier.expects(:ssl_post).with(anything, includes(name)).returns(xml_fixture('shipwire/rates_response'))
129
+
130
+ response = @carrier.find_rates(
131
+ location_fixtures[:ottawa],
132
+ location_fixtures[:new_york_with_name],
133
+ package_fixtures.values_at(:book, :wii),
134
+ :order_id => '#1000',
135
+ :items => @items
136
+ )
137
+
138
+ assert response.success?
139
+ end
140
+
141
+ def test_rate_request_does_not_include_address_name_element_if_not_provided
142
+ name = CGI.escape("<Name>")
143
+ @carrier.expects(:ssl_post).with(anything, Not(regexp_matches(Regexp.new(name)))).returns(xml_fixture('shipwire/rates_response'))
144
+
145
+ response = @carrier.find_rates(
146
+ location_fixtures[:ottawa],
147
+ location_fixtures[:new_york],
148
+ package_fixtures.values_at(:book, :wii),
149
+ :order_id => '#1000',
150
+ :items => @items
151
+ )
152
+
153
+ assert response.success?
154
+ end
155
+
156
+ def test_rate_request_without_delivery_estimate
157
+ @carrier.expects(:ssl_post).returns(xml_fixture('shipwire/rates_response_no_estimate'))
158
+ response = @carrier.find_rates(
159
+ location_fixtures[:ottawa],
160
+ location_fixtures[:new_york],
161
+ package_fixtures.values_at(:book, :wii),
162
+ :order_id => '#1000',
163
+ :items => @items
164
+ )
165
+
166
+ assert response.success?
167
+ assert_equal [], response.rates[0].delivery_range
168
+ end
169
+
170
+ def test_rate_request_includes_company_if_provided
171
+ company = CGI.escape("<Company>Tampa Company</Company>")
172
+ @carrier.expects(:ssl_post).with(anything, includes(company)).returns(xml_fixture('shipwire/rates_response'))
173
+
174
+ response = @carrier.find_rates(
175
+ location_fixtures[:ottawa],
176
+ location_fixtures[:real_home_as_commercial],
177
+ package_fixtures.values_at(:book, :wii),
178
+ :order_id => '#1000',
179
+ :items => @items
180
+ )
181
+
182
+ assert response.success?
183
+ end
184
+
185
+ def test_maximum_address_field_length
186
+ assert_equal 255, @carrier.maximum_address_field_length
187
+ end
188
+ end
@@ -0,0 +1,245 @@
1
+ require 'test_helper'
2
+
3
+ class StampsTest < ActiveSupport::TestCase
4
+ include ReactiveShipping::Test::Fixtures
5
+
6
+ def setup
7
+ @carrier = Stamps.new(integration_id: 'i', username: 'u', password: 'p')
8
+ @items = [{ :sku => 'AF0001', :quantity => 1 }, { :sku => 'AF0002', :quantity => 2 }]
9
+ @authentication_response = xml_fixture('stamps/authenticate_user_response')
10
+ end
11
+
12
+ def test_authenticate_user
13
+ response_chain(xml_fixture('stamps/get_account_info_response'))
14
+ @carrier.account_info
15
+ end
16
+
17
+ def test_account_info
18
+ response_chain(xml_fixture('stamps/get_account_info_response'))
19
+
20
+ account_info = @carrier.account_info
21
+
22
+ assert_equal 'ReactiveShipping::StampsAccountInfoResponse', account_info.class.name
23
+
24
+ assert_equal '1234567', account_info.customer_id
25
+ assert_equal '1029384756', account_info.meter_number
26
+ assert_equal '7654321', account_info.user_id
27
+
28
+ assert_equal '123.45', account_info.available_postage
29
+ assert_equal '543.21', account_info.control_total
30
+ assert_equal '250', account_info.max_postage_balance
31
+
32
+ assert_equal 'Los Angeles', account_info.lpo.city
33
+ assert_equal 'CA', account_info.lpo.state
34
+ assert_equal '90066', account_info.lpo.zip
35
+
36
+ assert_equal true, account_info.can_print_shipping?
37
+ assert_equal true, account_info.can_use_cost_codes?
38
+ assert_equal true, account_info.can_use_hidden_postage?
39
+ assert_equal true, account_info.can_purchase_sdc_insurance?
40
+ assert_equal true, account_info.can_print_memo?
41
+ assert_equal true, account_info.can_print_international?
42
+ assert_equal true, account_info.can_purchase_postage?
43
+ assert_equal true, account_info.can_edit_cost_codes?
44
+ assert_equal false, account_info.must_use_cost_codes?
45
+ assert_equal true, account_info.can_view_online_reports?
46
+
47
+ assert_equal '987.65', account_info.per_print_limit
48
+ end
49
+
50
+ def test_purchase_postage
51
+ response_chain(xml_fixture('stamps/purchase_postage_response'))
52
+
53
+ purchase_status = @carrier.purchase_postage('543.21', '123.45')
54
+
55
+ assert_equal 'ReactiveShipping::StampsPurchasePostageResponse', purchase_status.class.name
56
+
57
+ assert_equal 'Pending', purchase_status.purchase_status
58
+ assert_equal '1234', purchase_status.transaction_id
59
+ assert_equal '543.21', purchase_status.available_postage
60
+ assert_equal '123.45', purchase_status.control_total
61
+ end
62
+
63
+ def test_purchase_status
64
+ response_chain(xml_fixture('stamps/get_purchase_status_response'))
65
+
66
+ purchase_status = @carrier.purchase_status('1234')
67
+
68
+ assert_equal 'ReactiveShipping::StampsPurchasePostageResponse', purchase_status.class.name
69
+
70
+ assert_equal 'Success', purchase_status.purchase_status
71
+ assert_nil purchase_status.transaction_id
72
+ end
73
+
74
+ def test_validate_address
75
+ response_chain(xml_fixture('stamps/cleanse_address_response'))
76
+
77
+ location = Location.new(
78
+ name: 'Geoff Anton',
79
+ company: 'stamps.com',
80
+ address1: '12959 Coral Tree Pl',
81
+ city: 'Los Angeles',
82
+ state: 'CA',
83
+ zip: '90066'
84
+ )
85
+ cleansed_address = @carrier.validate_address(location)
86
+
87
+ assert_equal 'ReactiveShipping::StampsCleanseAddressResponse', cleansed_address.class.name
88
+
89
+ assert_equal true, cleansed_address.address_match?
90
+ assert_equal true, cleansed_address.city_state_zip_ok?
91
+ assert_equal 'GEOFF ANTON', cleansed_address.address.name
92
+ assert_equal 'STAMPS.COM', cleansed_address.address.company
93
+ assert_equal '12959 CORAL TREE PL', cleansed_address.address.address1
94
+ assert_equal 'LOS ANGELES', cleansed_address.address.city
95
+ assert_equal 'CA', cleansed_address.address.state
96
+ assert_equal '90066-7020', cleansed_address.address.zip
97
+ assert_equal '7SWYAzuNh82cWhIQyRFXRNa71HFkZWFkYmVlZg==20100210', cleansed_address.cleanse_hash
98
+ assert_equal 'Tdwp4JlTc02DhscYxbI7l7o08apkZWFkYmVlZg==20100210', cleansed_address.override_hash
99
+ end
100
+
101
+ def test_get_rates
102
+ response_chain(xml_fixture('stamps/get_rates_response'))
103
+
104
+ origin = Location.new(zip: '90405')
105
+ destination = Location.new(zip: '90066')
106
+ package = Package.new((12 * 16), [1, 2, 3], value: 100.00, units: :imperial)
107
+
108
+ rates = @carrier.find_rates(origin, destination, package)
109
+
110
+ assert_equal 'ReactiveShipping::RateResponse', rates.class.name
111
+
112
+ assert_equal 2, rates.rates.length
113
+
114
+ assert_equal 'ReactiveShipping::StampsRateEstimate', rates.rates[0].class.name
115
+
116
+ rate = rates.rates.first
117
+ assert_equal '90405', rate.origin.zip
118
+ assert_equal '90066', rate.destination.zip
119
+ assert_equal 'US-PM', rate.service_code
120
+ assert_equal 'USPS Priority Mail', rate.service_name
121
+ assert_equal 'USD', rate.currency
122
+ assert_equal Date.new(2014, 1, 31), rate.shipping_date
123
+ assert_equal [Date.new(2014, 2, 1), Date.new(2014, 2, 3)], rate.delivery_range
124
+ assert_equal Date.new(2014, 2, 3), rate.delivery_date
125
+ assert_equal 1217, rate.price
126
+ assert_equal 260, rate.insurance_price
127
+ assert_equal %w(US-A-SC US-A-CM), rate.add_ons['US-A-DC'][:prohibited_with]
128
+ assert_equal '2.6', rate.add_ons['SC-A-INS'][:amount]
129
+ assert_equal %w(US-A-REG US-A-INS), rate.add_ons['SC-A-INS'][:prohibited_with]
130
+ assert_equal 17, rate.available_add_ons.length
131
+ end
132
+
133
+ def test_create_shipment
134
+ response_chain(xml_fixture('stamps/create_indicium_response'))
135
+
136
+ origin = Location.new(
137
+ name: 'Some Body',
138
+ address1: '3420 Ocean Park Bl',
139
+ address2: 'Ste 1000',
140
+ city: 'Santa Monica',
141
+ state: 'CA',
142
+ zip: '90405'
143
+ )
144
+
145
+ destination = Location.new(
146
+ name: 'GEOFF ANTON',
147
+ compnay: 'STAMPS.COM',
148
+ address1: '12959 CORAL TREE PL',
149
+ city: 'LOS ANGELES',
150
+ state: 'CA',
151
+ zip: '90066-7020'
152
+ )
153
+
154
+ package = Package.new((12 * 16), [], units: :imperial)
155
+
156
+ options = { service: 'US-PM', insured_value: 100, add_ons: %w(US-A-DC SC-A-INS)}
157
+
158
+ indicium = @carrier.create_shipment(origin, destination, package, [], options)
159
+
160
+ assert_equal 'ReactiveShipping::StampsShippingResponse', indicium.class.name
161
+
162
+ assert_equal '1234567890ABCDEF', indicium.shipping_id
163
+ assert_equal '9101010521290895036903', indicium.tracking_number
164
+
165
+ assert_equal '90405', indicium.rate.origin.zip
166
+ assert_equal '90066', indicium.rate.destination.zip
167
+ assert_equal 'US-PM', indicium.rate.service_code
168
+ assert_equal 'USPS Priority Mail', indicium.rate.service_name
169
+ assert_equal 'USD', indicium.rate.currency
170
+ assert_equal Date.new(2009, 8, 31), indicium.rate.shipping_date
171
+ assert_equal [Date.new(2009, 9, 1), Date.new(2009, 9, 3)], indicium.rate.delivery_range
172
+ assert_equal Date.new(2009, 9, 3), indicium.rate.delivery_date
173
+ assert_equal 1036, indicium.rate.price
174
+ assert_equal 185, indicium.rate.insurance_price
175
+ assert_equal Hash.new, indicium.rate.add_ons['US-A-DC']
176
+ assert_equal '1.85', indicium.rate.add_ons['SC-A-INS'][:amount]
177
+ assert_equal %w(US-A-DC SC-A-INS), indicium.rate.available_add_ons
178
+
179
+ assert_equal '0dd49299-d89c-4997-b8ac-28db5542edc9', indicium.stamps_tx_id
180
+
181
+ assert_equal '123.45', indicium.available_postage
182
+ assert_equal '543.21', indicium.control_total
183
+ end
184
+
185
+ def test_track_shipment
186
+ response_chain(xml_fixture('stamps/track_shipment_response'))
187
+
188
+ tracking_response = @carrier.find_tracking_info('c605aec1-322e-48d5-bf81-b0bb820f9c22', stamps_tx_id: true)
189
+
190
+ assert_equal 'ReactiveShipping::TrackingResponse', tracking_response.class.name
191
+
192
+ assert_equal 3, tracking_response.shipment_events.length
193
+
194
+ assert_equal 'Electronic Notification', tracking_response.shipment_events[0].name
195
+ assert_equal '90066', tracking_response.shipment_events[0].location.zip
196
+ assert_equal 'United States', tracking_response.shipment_events[0].location.country.name
197
+ assert_equal Time.utc(2008, 2, 13, 16, 9, 0), tracking_response.shipment_events[0].time
198
+
199
+ assert_equal 'PROCESSED', tracking_response.shipment_events[1].name
200
+ assert_equal 'INDIANAPOLIS', tracking_response.shipment_events[1].location.city
201
+ assert_equal 'IN', tracking_response.shipment_events[1].location.state
202
+ assert_equal '46206', tracking_response.shipment_events[1].location.zip
203
+ assert_equal 'United States', tracking_response.shipment_events[1].location.country.name
204
+ assert_equal Time.utc(2008, 2, 15, 16, 58, 0), tracking_response.shipment_events[1].time
205
+
206
+ assert_equal 'DELIVERED', tracking_response.shipment_events[2].name
207
+ assert_equal 'FORT WAYNE', tracking_response.shipment_events[2].location.city
208
+ assert_equal 'IN', tracking_response.shipment_events[2].location.state
209
+ assert_equal '46809', tracking_response.shipment_events[2].location.zip
210
+ assert_equal 'United States', tracking_response.shipment_events[2].location.country.name
211
+ assert_equal Time.utc(2008, 2, 19, 10, 32, 0), tracking_response.shipment_events[2].time
212
+
213
+ assert_equal :delivered, tracking_response.status
214
+ assert_equal 'Delivered', tracking_response.status_code
215
+ end
216
+
217
+ def test_authenticator_renewal
218
+ fixtures = [
219
+ @authentication_response,
220
+ xml_fixture('stamps/get_account_info_response'),
221
+ xml_fixture('stamps/expired_authenticator_response'),
222
+ @authentication_response,
223
+ xml_fixture('stamps/get_account_info_response')
224
+ ]
225
+
226
+ @carrier.expects(:ssl_post).times(5).returns(*fixtures)
227
+
228
+ # The first call gets initial authenticator, second call receives
229
+ # expired authenticator
230
+ @carrier.account_info
231
+ account_info = @carrier.account_info
232
+
233
+ assert_equal 'ReactiveShipping::StampsAccountInfoResponse', account_info.class.name
234
+ end
235
+
236
+ private
237
+
238
+ def response_chain(primary_response)
239
+ @carrier.expects(:ssl_post).twice.returns(@authentication_response, primary_response)
240
+ end
241
+
242
+ def test_maximum_address_field_length
243
+ assert_equal 255, @carrier.maximum_address_field_length
244
+ end
245
+ end