active_fulfillment 2.0.1 → 2.0.2

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 (32) hide show
  1. checksums.yaml +4 -4
  2. data/lib/active_fulfillment.rb +4 -18
  3. data/lib/active_fulfillment/fulfillment/services/amazon_mws.rb +438 -0
  4. data/lib/active_fulfillment/fulfillment/services/shipwire.rb +39 -34
  5. data/lib/active_fulfillment/fulfillment/services/webgistix.rb +5 -1
  6. data/lib/active_fulfillment/fulfillment/version.rb +6 -0
  7. data/test/fixtures/xml/amazon_mws/fulfillment_get_fulfillment_order.xml +114 -0
  8. data/test/fixtures/xml/amazon_mws/fulfillment_get_fulfillment_order_2.xml +90 -0
  9. data/test/fixtures/xml/amazon_mws/fulfillment_get_fullfillment_order_with_multiple_tracking_numbers.xml +121 -0
  10. data/test/fixtures/xml/amazon_mws/fulfillment_list_all_fulfillment_orders.xml +70 -0
  11. data/test/fixtures/xml/amazon_mws/inventory_list_inventory_item_supply.xml +32 -0
  12. data/test/fixtures/xml/amazon_mws/inventory_list_inventory_supply.xml +75 -0
  13. data/test/fixtures/xml/amazon_mws/inventory_list_inventory_supply_by_next_token.xml +38 -0
  14. data/test/fixtures/xml/amazon_mws/tracking_response_error.xml +9 -0
  15. data/test/fixtures/xml/amazon_mws/tracking_response_not_found.xml +9 -0
  16. data/test/fixtures/xml/shipwire/fulfillment_failure_response.xml +7 -0
  17. data/test/fixtures/xml/shipwire/invalid_login_response.xml +7 -0
  18. data/test/fixtures/xml/shipwire/inventory_get_response.xml +44 -0
  19. data/test/fixtures/xml/shipwire/successful_empty_tracking_response.xml +8 -0
  20. data/test/fixtures/xml/shipwire/successful_live_tracking_response.xml +53 -0
  21. data/test/fixtures/xml/shipwire/successful_tracking_response.xml +16 -0
  22. data/test/fixtures/xml/shipwire/successful_tracking_response_with_tracking_urls.xml +31 -0
  23. data/test/fixtures/xml/webgistix/multiple_tracking_response.xml +21 -0
  24. data/test/remote/amazon_mws_test.rb +114 -0
  25. data/test/unit/services/amazon_mws_test.rb +357 -0
  26. data/test/unit/services/shipwire_test.rb +20 -95
  27. data/test/unit/services/webgistix_test.rb +12 -1
  28. metadata +57 -11
  29. data/Rakefile +0 -36
  30. data/VERSION +0 -1
  31. data/active_fulfillment.gemspec +0 -70
  32. data/init.rb +0 -1
@@ -0,0 +1,357 @@
1
+ require 'test_helper'
2
+
3
+ class AmazonMarketplaceWebServiceTest < Test::Unit::TestCase
4
+ def setup
5
+ @service = AmazonMarketplaceWebService.new(
6
+ :login => 'l',
7
+ :password => 'p'
8
+ )
9
+
10
+ @options = {
11
+ :shipping_method => 'Standard',
12
+ :order_date => Time.now.utc.yesterday,
13
+ :comment => "Delayed due to tornados"
14
+ }
15
+
16
+ @address = {
17
+ :name => 'Johnny Chase',
18
+ :address1 => '100 Information Super Highway',
19
+ :address2 => 'Suite 66',
20
+ :city => 'Beverly Hills',
21
+ :state => 'CA',
22
+ :country => 'US',
23
+ :zip => '90210',
24
+ :phone => "(555)555-5555"
25
+ }
26
+
27
+ @line_items = [
28
+ { :sku => 'SETTLERS1',
29
+ :quantity => 1,
30
+ :comment => 'Awesome'
31
+ }
32
+ ]
33
+ end
34
+
35
+ def test_get_default_fulfillment_gateway
36
+ assert_equal AmazonMarketplaceWebService::ENDPOINTS[:us], @service.endpoint
37
+ end
38
+
39
+ def test_create_service_with_different_fulfillment_gateway
40
+ service = AmazonMarketplaceWebService.new(:login => 'l', :password => 'p', :endpoint => :jp)
41
+ assert_equal AmazonMarketplaceWebService::ENDPOINTS[:jp], service.endpoint
42
+ end
43
+
44
+ def test_build_basic_api_query
45
+ options = {
46
+ "Action" => "SubmitFeed",
47
+ "FeedType" => "_POST_INVENTORY_AVAILABILITY_DATA_",
48
+ "Merchant" => "SuperMerchant123"
49
+ }
50
+ expected_keys = ["AWSAccessKeyId", "Action", "FeedType", "Merchant", "SignatureMethod", "SignatureVersion", "Timestamp", "Version"]
51
+ opts = @service.build_basic_api_query(options)
52
+ assert_equal expected_keys.sort, opts.keys.map(&:to_s).sort
53
+ assert_equal "l", opts["AWSAccessKeyId"]
54
+ assert_equal AmazonMarketplaceWebService::SIGNATURE_VERSION, opts["SignatureVersion"]
55
+ assert_equal "Hmac#{AmazonMarketplaceWebService::SIGNATURE_METHOD}", opts["SignatureMethod"]
56
+ assert_equal AmazonMarketplaceWebService::VERSION, opts["Version"]
57
+ end
58
+
59
+ def test_build_inventory_list_request
60
+ skus = ["CITADELS", "INNOVATION", "JAIPUR"]
61
+ request_params = @service.build_inventory_list_request(:skus => skus)
62
+ keys = request_params.keys
63
+
64
+ assert keys.include?("SellerSkus.member.1")
65
+ assert keys.include?("SellerSkus.member.2")
66
+ assert keys.include?("SellerSkus.member.3")
67
+ assert_equal 'CITADELS', request_params['SellerSkus.member.1']
68
+ assert_equal 'INNOVATION', request_params['SellerSkus.member.2']
69
+ assert_equal 'JAIPUR', request_params["SellerSkus.member.3"]
70
+ end
71
+
72
+ def test_create_signature
73
+ service = AmazonMarketplaceWebService.new(:login => "0PExampleR2", :password => "sekrets")
74
+ expected_signature = "39XxH6iKLysjjDmWZSkyr2z8iSxfECHBYE1Pd0Qqpwo%3D"
75
+ options = {
76
+ "AWSAccessKeyId" => "0PExampleR2",
77
+ "Action" => "SubmitFeed",
78
+ "FeedType" => "_POST_INVENTORY_AVAILABILITY_DATA_",
79
+ "Marketplace" => "ATExampleER",
80
+ "Merchant" => "A1ExampleE6",
81
+ "SignatureMethod" => "HmacSHA256",
82
+ "SignatureVersion" => "2",
83
+ "Timestamp" => "2009-08-20T01:10:27.607Z",
84
+ "Version" => "2009-01-01"
85
+ }
86
+
87
+ uri = URI.parse("https://#{AmazonMarketplaceWebService::ENDPOINTS[:us]}")
88
+
89
+ assert_equal expected_signature, service.sign(:POST, uri, options)
90
+ end
91
+
92
+ def test_verify_amazon_response
93
+ service = AmazonMarketplaceWebService.new(:login => "AKIAFJPPO5KLY6G4XO7Q", :password => "aaa")
94
+ string_signed_by_amazon = "POST\nhttps://www.vendor.com/mwsApp1\n/orders/listRecentOrders.jsp?sessionId=123"
95
+ string_signed_by_amazon += "\nAWSAccessKeyId=AKIAFJPPO5KLY6G4XO7Q&Marketplace=ATVPDKIKX0DER&Merchant=A047950713KM6AGKQCBRD&SignatureMethod=HmacSHA256&SignatureVersion=2"
96
+ assert service.amazon_request?(string_signed_by_amazon, "b0hxWov1RfBOqNk77UDfNRRZmf3tkdM7vuNa%2FolfnWg%3D")
97
+ end
98
+
99
+ def test_build_address
100
+ expected_items = {
101
+ "DestinationAddress.Name" => @address[:name],
102
+ "DestinationAddress.Line1" => @address[:address1],
103
+ "DestinationAddress.Line2" => @address[:address2],
104
+ "DestinationAddress.City" => @address[:city],
105
+ "DestinationAddress.StateOrProvinceCode" => @address[:state],
106
+ "DestinationAddress.CountryCode" => @address[:country],
107
+ "DestinationAddress.PostalCode" => @address[:zip],
108
+ "DestinationAddress.PhoneNumber" => @address[:phone]
109
+ }
110
+ assert_equal expected_items, @service.build_address(@address)
111
+ end
112
+
113
+ def test_build_address_with_missing_fields
114
+ expected_items = {
115
+ "DestinationAddress.Name" => @address[:name],
116
+ "DestinationAddress.Line1" => @address[:address1],
117
+ "DestinationAddress.City" => @address[:city],
118
+ "DestinationAddress.StateOrProvinceCode" => @address[:state],
119
+ "DestinationAddress.CountryCode" => @address[:country],
120
+ "DestinationAddress.PostalCode" => @address[:zip],
121
+ "DestinationAddress.PhoneNumber" => @address[:phone]
122
+ }
123
+ @address[:address2] = ""
124
+
125
+ assert_equal expected_items, @service.build_address(@address)
126
+ end
127
+
128
+ def test_integrated_registration_url_creation
129
+ service = AmazonMarketplaceWebService.new(:login => "AKIAFJPPO5KLY6G4XO7Q", :password => "aaa", :app_id => "1014f5ad-c359-4e86-8e50-bb8f8e431a9")
130
+ options = {
131
+ "returnPathAndParameters" => "/orders/listRecentOrders.jsp?sessionId=123"
132
+ }
133
+ expected_registration_url = "#{AmazonMarketplaceWebService::REGISTRATION_URI.to_s}?AWSAccessKeyId=AKIAFJPPO5KLY6G4XO7Q&SignatureMethod=HmacSHA256&SignatureVersion=2&id=1014f5ad-c359-4e86-8e50-bb8f8e431a9&returnPathAndParameters=%2Forders%2FlistRecentOrders.jsp%3FsessionId%3D123&Signature=zpZyHd8rMf5gg5rpO5ri5RGUi0kks03ZkhAtPm4npVk%3D"
134
+ assert_equal expected_registration_url, service.registration_url(options)
135
+ end
136
+
137
+ def test_build_items
138
+ expected_items = {
139
+ "Items.member.1.DisplayableComment" => "Awesome",
140
+ "Items.member.1.Quantity" => 1,
141
+ "Items.member.1.SellerFulfillmentOrderItemId" => "SETTLERS1",
142
+ "Items.member.1.SellerSKU" => "SETTLERS1"
143
+ }
144
+
145
+ actual_items = @service.build_items(@line_items)
146
+
147
+ assert_equal expected_items, @service.build_items(@line_items)
148
+ end
149
+
150
+ def test_successful_fulfillment
151
+ @service.expects(:ssl_post).returns(successful_fulfillment_response)
152
+ response = @service.fulfill('12345678', @address, @line_items, @options)
153
+ assert response.success?
154
+ end
155
+
156
+ def test_invalid_arguments
157
+ http_response = build_mock_response(invalid_params_response, "", 500)
158
+ @service.expects(:ssl_post).raises(ActiveMerchant::ResponseError.new(http_response))
159
+ response = @service.fulfill('12345678', @address, @line_items, @options)
160
+ assert !response.success?
161
+ assert_equal "MalformedInput: timestamp must follow ISO8601", response.params['response_comment']
162
+ end
163
+
164
+ def test_missing_order_date
165
+ @options.delete(:order_date)
166
+ assert_raise(ArgumentError) { @service.fulfill('12345678', @address, @line_items, @options) }
167
+ end
168
+
169
+ def test_missing_shipping_method
170
+ @options.delete(:shipping_method)
171
+ assert_raise(ArgumentError) { @service.fulfill('12345678', @address, @line_items, @options) }
172
+ end
173
+
174
+ def test_get_service_status
175
+ @service.expects(:ssl_post).returns(successful_status_response)
176
+
177
+ response = @service.status
178
+ assert response.success?
179
+ end
180
+
181
+ def test_get_inventory
182
+ @service.expects(:ssl_post).returns(xml_fixture('amazon_mws/inventory_list_inventory_supply'))
183
+
184
+ response = @service.fetch_stock_levels
185
+ assert response.success?
186
+ assert_equal 202, response.stock_levels['GN-00-01A']
187
+ assert_equal 199, response.stock_levels['GN-00-02A']
188
+ end
189
+
190
+ def test_get_inventory_multipage
191
+ @service.expects(:ssl_post).with() { |uri, query, headers|
192
+ query.include?('ListInventorySupply') && !query.include?('ListInventorySupplyByNextToken')
193
+ }.returns(xml_fixture('amazon_mws/inventory_list_inventory_supply_by_next_token'))
194
+
195
+ @service.expects(:ssl_post).with() { |uri, query, headers|
196
+ query.include?('ListInventorySupplyByNextToken') && query.include?('NextToken')
197
+ }.returns(xml_fixture('amazon_mws/inventory_list_inventory_supply'))
198
+
199
+ response = @service.fetch_stock_levels
200
+ assert response.success?
201
+
202
+ assert_equal 202, response.stock_levels['GN-00-01A']
203
+ assert_equal 199, response.stock_levels['GN-00-02A']
204
+ assert_equal 0, response.stock_levels['GN-01-01A']
205
+ assert_equal 5259, response.stock_levels['GN-01-02A']
206
+ end
207
+
208
+ def test_get_next_page_builds_query_with_proper_params
209
+ @service.expects(:build_basic_api_query).with(:NextToken => "abracadabra", :Action => 'ListInventorySupplyByNextToken')
210
+ @service.send(:build_next_inventory_list_request, "abracadabra")
211
+ end
212
+
213
+ def test_fetch_tracking_numbers
214
+ @service.expects(:ssl_post).twice.
215
+ returns(xml_fixture('amazon_mws/fulfillment_get_fulfillment_order')).
216
+ returns(xml_fixture('amazon_mws/fulfillment_get_fulfillment_order_2'))
217
+
218
+ response = @service.fetch_tracking_numbers(['extern_id_1154539615776', 'extern_id_1154539615777'])
219
+ assert response.success?
220
+ assert_equal %w{93ZZ00}, response.tracking_numbers['extern_id_1154539615776']
221
+ assert_nil response.tracking_numbers['extern_id_1154539615777']
222
+ end
223
+
224
+
225
+ def test_fetch_multiple_tracking_numbers
226
+ @service.expects(:ssl_post).returns(xml_fixture('amazon_mws/fulfillment_get_fullfillment_order_with_multiple_tracking_numbers'))
227
+
228
+ response = @service.fetch_tracking_numbers(['extern_id_1154539615776'])
229
+ assert response.success?
230
+ assert_equal %w{93YY00 93ZZ00}, response.tracking_numbers['extern_id_1154539615776']
231
+ end
232
+
233
+ def test_that_generated_requests_do_not_double_escape_spaces
234
+ fulfillment_request = @service.send(:build_fulfillment_request, "12345", @address, @line_items, @options)
235
+ result = @service.build_full_query(:post, URI.parse("http://example.com/someservice/2011"), fulfillment_request)
236
+
237
+ assert !result.include?('%2520')
238
+ end
239
+
240
+ def test_fetch_tracking_numbers_ignores_not_found
241
+ response = mock('response')
242
+ response.stubs(:code).returns(500)
243
+ response.stubs(:message).returns("Internal Server Error")
244
+ response.stubs(:body).returns(xml_fixture('amazon_mws/tracking_response_not_found'))
245
+
246
+ @service.expects(:ssl_post).times(3).
247
+ returns(xml_fixture('amazon_mws/fulfillment_get_fulfillment_order')).
248
+ raises(ActiveMerchant::ResponseError.new(response)).
249
+ returns(xml_fixture('amazon_mws/fulfillment_get_fulfillment_order_2'))
250
+
251
+ response = @service.fetch_tracking_numbers(['extern_id_1154539615776', 'dafdfafsdafdafasdfa', 'extern_id_1154539615777'])
252
+ assert response.success?
253
+ assert_equal %w{93ZZ00}, response.tracking_numbers['extern_id_1154539615776']
254
+ end
255
+
256
+ def test_fetch_tracking_numbers_aborts_on_error
257
+ response = mock('response')
258
+ response.stubs(:code).returns(500)
259
+ response.stubs(:message).returns("Internal Server Error")
260
+ response.stubs(:body).returns(xml_fixture('amazon_mws/tracking_response_error'))
261
+
262
+ @service.expects(:ssl_post).twice.
263
+ returns(xml_fixture('amazon_mws/fulfillment_get_fulfillment_order')).
264
+ raises(ActiveMerchant::ResponseError.new(response))
265
+
266
+ response = @service.fetch_tracking_numbers(['extern_id_1154539615776', 'ERROR', 'extern_id_1154539615777'])
267
+ assert !response.success?
268
+ assert_equal 'Something has gone terribly wrong!', response.faultstring
269
+ end
270
+
271
+ def test_404_error
272
+ http_response = build_mock_response(response_from_404, "Not Found", "404")
273
+ @service.expects(:ssl_post).raises(ActiveMerchant::ResponseError.new(http_response))
274
+
275
+ response = @service.fulfill('987654321', @address, @line_items, @options)
276
+ assert !response.success?
277
+
278
+ assert_equal "404: Not Found", response.response_comment
279
+ assert_equal "404", response.http_code
280
+ assert_equal "Not Found", response.http_message
281
+ assert_equal response_from_404, response.http_body
282
+ end
283
+
284
+ def test_building_address_skips_nil_values
285
+ @address[:address2] = nil
286
+ assert_nothing_raised do
287
+ @service.send(:build_address, @address)
288
+ end
289
+ end
290
+
291
+ def test_building_a_full_query_does_not_cause_query_to_fail
292
+ @address[:company] = "Powerthirst Inc."
293
+
294
+ constructed_address = @service.send(:build_address, @address)
295
+ assert !constructed_address[nil]
296
+ end
297
+
298
+ private
299
+ def build_mock_response(response, message, code = "200")
300
+ http_response = mock(:code => code, :message => message)
301
+ http_response.stubs(:body).returns(response)
302
+ http_response
303
+ end
304
+
305
+ def successful_fulfillment_response
306
+ <<-XML
307
+ <?xml version="1.0"?>
308
+ <CreateFulfillmentOrderResponse
309
+ xmlns="http://mws.amazonaws.com/FulfillmentOutboundShipment/2010-10-01/">
310
+ <ResponseMetadata>
311
+ <RequestId>d95be26c-16cf-4bbc-ab58-dce89fd4ac53</RequestId>
312
+ </ResponseMetadata>
313
+ </CreateFulfillmentOrderResponse>
314
+ XML
315
+ end
316
+
317
+ def successful_status_response
318
+ <<-XML
319
+ <?xml version="1.0"?>
320
+ <GetServiceStatusResponse
321
+ xmlns="http://mws.amazonaws.com/FulfillmentOutboundShipment/2010-10-01/">
322
+ <GetServiceStatusResult>
323
+ <Status>GREEN_I</Status>
324
+ <Timestamp>2010-11-01T21:38:09.676Z</Timestamp>
325
+ <MessageId>173964729I</MessageId>
326
+ <Messages>
327
+ <Message>
328
+ <Locale>en_US</Locale>
329
+ <Text>We are experiencing high latency in UK because of heavy
330
+ traffic.</Text>
331
+ </Message>
332
+ </Messages>
333
+ </GetServiceStatusResult>
334
+ <ResponseMetadata>
335
+ <RequestId>d80c6c7b-f7c7-4fa7-bdd7-854711cb3bcc</RequestId>
336
+ </ResponseMetadata>
337
+ </GetServiceStatusResponse>
338
+ XML
339
+ end
340
+
341
+ def response_from_404
342
+ '<html><head><title>Apache Tomcat</title></head><body>That was not found</body></html>'
343
+ end
344
+
345
+ def invalid_params_response
346
+ <<-XML
347
+ <ErrorResponse xmlns="http://mws.amazonaws.com/FulfillmentInventory/2010-10-01/">
348
+ <Error>
349
+ <Type>Sender</Type>
350
+ <Code>MalformedInput</Code>
351
+ <Message>timestamp must follow ISO8601</Message>
352
+ </Error>
353
+ <RequestId>e71f72f5-3df6-4306-bb67-9f55bd9d9665</RequestId>
354
+ </ErrorResponse>
355
+ XML
356
+ end
357
+ end
@@ -98,6 +98,7 @@ class ShipwireTest < Test::Unit::TestCase
98
98
  end
99
99
 
100
100
  def test_no_tracking_numbers_available
101
+ successful_empty_tracking_response = xml_fixture('shipwire/successful_empty_tracking_response')
101
102
  @shipwire.expects(:ssl_post).returns(successful_empty_tracking_response)
102
103
  response = @shipwire.fetch_tracking_numbers(['1234'])
103
104
  assert response.success?
@@ -108,6 +109,7 @@ class ShipwireTest < Test::Unit::TestCase
108
109
  expected = { "2986" => ["1ZW682E90326614239"],
109
110
  "2987" => ["1ZW682E90326795080"] }
110
111
 
112
+ successful_tracking_response = xml_fixture('shipwire/successful_tracking_response')
111
113
  @shipwire.expects(:ssl_post).returns(successful_tracking_response)
112
114
  response = @shipwire.fetch_tracking_numbers(["2986", "2987"])
113
115
  assert response.success?
@@ -119,6 +121,7 @@ class ShipwireTest < Test::Unit::TestCase
119
121
  end
120
122
 
121
123
  def test_successful_tracking_with_live_data
124
+ successful_live_tracking_response = xml_fixture('shipwire/successful_live_tracking_response')
122
125
  @shipwire.expects(:ssl_post).returns(successful_live_tracking_response)
123
126
  response = @shipwire.fetch_tracking_numbers([
124
127
  '21', '22', '23', '24', '25',
@@ -133,12 +136,28 @@ class ShipwireTest < Test::Unit::TestCase
133
136
  assert_equal 13, response.tracking_numbers.size
134
137
  end
135
138
 
139
+ def test_successful_tracking_with_urls
140
+ successful_tracking_response_with_urls = xml_fixture('shipwire/successful_tracking_response_with_tracking_urls')
141
+ @shipwire.expects(:ssl_post).returns(successful_tracking_response_with_urls)
142
+ response = @shipwire.fetch_tracking_numbers(["40289"])
143
+ assert response.success?
144
+ assert_equal "1", response.params["total_orders"]
145
+ assert_equal "Test", response.params["status"]
146
+ assert_equal "1", response.params["total_shipped_orders"]
147
+
148
+ assert_equal ["9400110200793596422990"], response.tracking_numbers["40298"]
149
+ assert_equal "USPS", response.tracking_company["40298"]
150
+ assert_equal ["http://trkcnfrm1.smi.usps.com/PTSInternetWeb/InterLabelInquiry.do?origTrackNum=9400110200793596422990"], response.tracking_urls["40298"]
151
+ end
152
+
136
153
  def test_valid_credentials
137
- @shipwire.expects(:ssl_post).returns(successful_empty_tracking_response)
154
+ successful_empty_tracing_response = xml_fixture('shipwire/successful_empty_tracking_response')
155
+ @shipwire.expects(:ssl_post).returns(successful_empty_tracing_response)
138
156
  assert @shipwire.valid_credentials?
139
157
  end
140
158
 
141
159
  def test_invalid_credentials
160
+ invalid_login_response = xml_fixture('shipwire/invalid_login_response')
142
161
  @shipwire.expects(:ssl_post).returns(invalid_login_response)
143
162
  assert !@shipwire.valid_credentials?
144
163
  end
@@ -175,98 +194,4 @@ class ShipwireTest < Test::Unit::TestCase
175
194
  assert !@shipwire.valid_credentials?
176
195
  end
177
196
 
178
- private
179
- def successful_empty_tracking_response
180
- "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\r\n<TrackingUpdateResponse><Status>Test</Status><TotalOrders></TotalOrders><TotalShippedOrders></TotalShippedOrders><TotalProducts></TotalProducts><Bookmark></Bookmark></TrackingUpdateResponse>"
181
- end
182
-
183
- def successful_tracking_response
184
- <<-XML
185
- <?xml version="1.0"?>
186
- <TrackingUpdateResponse>
187
- <Status>Test</Status>
188
- <Order id="2986" shipped="YES" shipper="UPS GD" handling="1.00" shipping="13.66" total="14.66">
189
- <TrackingNumber>1ZW682E90326614239</TrackingNumber>
190
- </Order>
191
- <Order id="2987" shipped="YES" shipper="UPS GD" handling="1.50" shipping="9.37" total="10.87">
192
- <TrackingNumber>1ZW682E90326795080</TrackingNumber>
193
- </Order>
194
- <Order id="2988" shipped="NO" shipper="UPS GD" handling="" shipping="" total="">
195
- <TrackingNumber></TrackingNumber>
196
- </Order>
197
- <TotalOrders>3</TotalOrders>
198
- <TotalShippedOrders>2</TotalShippedOrders>
199
- <Bookmark>2006-04-28 20:35:45</Bookmark>
200
- </TrackingUpdateResponse>
201
- XML
202
- end
203
-
204
- def successful_live_tracking_response
205
- <<-XML
206
- <?xml version="1.0" encoding="ISO-8859-1"?>
207
- <TrackingUpdateResponse>
208
- <Status>0</Status>
209
- <Order id="21" shipped="YES" shipper="5" handling="0.00" shipping="6.58" total="6.58">
210
- <TrackingNumber>1Z6296VW0398500001</TrackingNumber>
211
- </Order>
212
- <Order id="22" shipped="YES" shipper="5" handling="0.00" shipping="8.13" total="8.13">
213
- <TrackingNumber>1Z6296VW0390790002</TrackingNumber>
214
- </Order>
215
- <Order id="23" shipped="YES" shipper="5" handling="0.00" shipping="7.63" total="7.63">
216
- <TrackingNumber>1Z6296VW0396490003</TrackingNumber>
217
- </Order>
218
- <Order id="24" shipped="YES" shipper="5" handling="0.00" shipping="8.97" total="8.97">
219
- <TrackingNumber>1Z6296VW0390200004</TrackingNumber>
220
- </Order>
221
- <Order id="25" shipped="YES" shipper="5" handling="0.00" shipping="8.42" total="8.42">
222
- <TrackingNumber>1Z6296VW0393240005</TrackingNumber>
223
- </Order>
224
- <Order id="26" shipped="YES" shipper="5" handling="0.00" shipping="8.42" total="8.42">
225
- <TrackingNumber>1Z6296VW0396400006</TrackingNumber>
226
- </Order>
227
- <Order id="2581" shipped="YES" shipper="5" handling="0.00" shipping="8.21" total="8.21">
228
- <TrackingNumber>1Z6296VW0391160007</TrackingNumber>
229
- </Order>
230
- <Order id="2576" shipped="YES" shipper="43" handling="0.00" shipping="18.60" total="18.60">
231
- <TrackingNumber>CJ3026000018US</TrackingNumber>
232
- </Order>
233
- <Order id="2593" shipped="YES" shipper="5" handling="0.00" shipping="7.63" total="7.63">
234
- <TrackingNumber>1Z6296VW0398660008</TrackingNumber>
235
- </Order>
236
- <Order id="2598" shipped="YES" shipper="5" handling="0.00" shipping="9.84" total="9.84">
237
- <TrackingNumber>1Z6296VW0391610009</TrackingNumber>
238
- </Order>
239
- <Order id="2610" shipped="YES" shipper="5" handling="0.00" shipping="7.63" total="7.63">
240
- <TrackingNumber>1Z6296VW0395650010</TrackingNumber>
241
- </Order>
242
- <Order id="2611" shipped="YES" shipper="5" handling="0.00" shipping="7.13" total="7.13">
243
- <TrackingNumber>1Z6296VW0397050011</TrackingNumber>
244
- </Order>
245
- <Order id="2613" shipped="YES" shipper="5" handling="0.00" shipping="8.97" total="8.97">
246
- <TrackingNumber>1Z6296VW0398970012</TrackingNumber>
247
- </Order>
248
- <Order id="2616" shipped="NO" shipper="5" handling="0.00" shipping="9.84" total="9.84">
249
- <TrackingNumber></TrackingNumber>
250
- </Order>
251
- <Order id="2631" shipped="NO" shipper="" handling="" shipping="" total="">
252
- <TrackingNumber></TrackingNumber>
253
- </Order>
254
- <TotalOrders>15</TotalOrders>
255
- <TotalShippedOrders>13</TotalShippedOrders>
256
- <TotalProducts/>
257
- <Bookmark/>
258
- </TrackingUpdateResponse>
259
-
260
- XML
261
- end
262
-
263
- def invalid_login_response
264
- <<-XML
265
- <?xml version="1.0" encoding="ISO-8859-1"?>
266
- <TrackingUpdateResponse><Status>Error</Status><ErrorMessage>
267
- Error with Valid Username/EmailAddress and Password Required.
268
- There is an error in XML document.
269
- </ErrorMessage></TrackingUpdateResponse>
270
- XML
271
- end
272
197
  end