active_fulfillment 1.0.3 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,5 +1,9 @@
1
1
  = ActiveFulfillment CHANGELOG
2
2
 
3
+ == Version 2.0.0 (Jan 5, 2013)
4
+
5
+ * API Change on tracking numbers, returns array instead of single string [csaunders]
6
+
3
7
  == Version 1.0.3 (Jan 21, 2010)
4
8
 
5
9
  * Include "pending" counts in stock levels for Shipwire [wisq]
data/Rakefile CHANGED
@@ -1,9 +1,9 @@
1
- require 'rubygems'
1
+ require 'bundler'
2
+ Bundler::GemHelper.install_tasks
3
+
2
4
  require 'rake'
3
5
  require 'rake/testtask'
4
6
  require 'rake/rdoctask'
5
- require 'rake/gempackagetask'
6
- require 'rake/contrib/rubyforgepublisher'
7
7
 
8
8
  desc "Default Task"
9
9
  task :default => 'test:units'
@@ -34,30 +34,3 @@ Rake::RDocTask.new do |rdoc|
34
34
  rdoc.rdoc_files.include('README', 'CHANGELOG')
35
35
  rdoc.rdoc_files.include('lib/**/*.rb')
36
36
  end
37
-
38
- task :install => [:package] do
39
- `gem install pkg/#{PKG_FILE_NAME}.gem`
40
- end
41
-
42
- begin
43
- require 'jeweler'
44
- Jeweler::Tasks.new do |gemspec|
45
- gemspec.name = 'active_fulfillment'
46
- gemspec.summary = "Framework and tools for dealing with shipping, tracking and order fulfillment services."
47
- gemspec.email = "cody@shopify.com"
48
- gemspec.homepage = "http://github.com/shopify/active_fulfillment"
49
- gemspec.authors = ["Cody Fauser", "James MacAulay"]
50
- gemspec.add_dependency('activesupport', '>= 2.3.2')
51
- gemspec.add_dependency('builder', '>= 2.0.0')
52
- end
53
- rescue LoadError
54
- puts "Jeweler not available. Install it with: gem install jeweler"
55
- end
56
-
57
- desc "Update common files from active_merchant directory"
58
- task :update_common do
59
- STDERR.puts "Updating common include from ../active_merchant. Please make sure this is up-to-date"
60
- system("diff -u lib/active_merchant/common.rb ../active_merchant/lib/active_merchant/common.rb | patch -p0")
61
- system("diff -ur lib/active_merchant/common ../active_merchant/lib/active_merchant/common | patch -p0")
62
- STDERR.puts "done.."
63
- end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.3
1
+ 2.0.0
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{active_fulfillment}
8
- s.version = "1.0.3"
8
+ s.version = "2.0.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Cody Fauser", "James MacAulay"]
@@ -25,16 +25,6 @@ Gem::Specification.new do |s|
25
25
  "lib/active_fulfillment/fulfillment/services/amazon.rb",
26
26
  "lib/active_fulfillment/fulfillment/services/shipwire.rb",
27
27
  "lib/active_fulfillment/fulfillment/services/webgistix.rb",
28
- "lib/active_merchant/common.rb",
29
- "lib/active_merchant/common/connection.rb",
30
- "lib/active_merchant/common/country.rb",
31
- "lib/active_merchant/common/error.rb",
32
- "lib/active_merchant/common/post_data.rb",
33
- "lib/active_merchant/common/posts_data.rb",
34
- "lib/active_merchant/common/requires_parameters.rb",
35
- "lib/active_merchant/common/utils.rb",
36
- "lib/active_merchant/common/validateable.rb",
37
- "lib/certs/cacert.pem",
38
28
  "test/fixtures.yml",
39
29
  "test/fixtures/xml/amazon/inventory_get_response.xml",
40
30
  "test/fixtures/xml/amazon/inventory_list_response.xml",
@@ -69,20 +59,11 @@ Gem::Specification.new do |s|
69
59
  "test/unit/services/webgistix_test.rb"
70
60
  ]
71
61
 
72
- if s.respond_to? :specification_version then
73
- current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
74
- s.specification_version = 3
62
+ s.add_dependency('activesupport', '>= 2.3.11')
63
+ s.add_dependency('builder', '>= 2.0.0')
64
+ s.add_dependency('active_utils', '>= 1.0.1')
75
65
 
76
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
77
- s.add_runtime_dependency(%q<activesupport>, [">= 2.3.2"])
78
- s.add_runtime_dependency(%q<builder>, [">= 2.0.0"])
79
- else
80
- s.add_dependency(%q<activesupport>, [">= 2.3.2"])
81
- s.add_dependency(%q<builder>, [">= 2.0.0"])
82
- end
83
- else
84
- s.add_dependency(%q<activesupport>, [">= 2.3.2"])
85
- s.add_dependency(%q<builder>, [">= 2.0.0"])
86
- end
66
+ s.add_development_dependency('rake')
67
+ s.add_development_dependency('mocha')
87
68
  end
88
69
 
@@ -1,14 +1,10 @@
1
1
  module ActiveMerchant
2
2
  module Fulfillment
3
-
4
- class Error < StandardError
5
- end
6
-
7
3
  class Response
8
4
  attr_reader :params
9
5
  attr_reader :message
10
6
  attr_reader :test
11
-
7
+
12
8
  def success?
13
9
  @success
14
10
  end
@@ -16,17 +12,17 @@ module ActiveMerchant
16
12
  def test?
17
13
  @test
18
14
  end
19
-
15
+
20
16
  def initialize(success, message, params = {}, options = {})
21
17
  @success, @message, @params = success, message, params.stringify_keys
22
- @test = options[:test] || false
18
+ @test = options[:test] || false
23
19
  end
24
-
20
+
25
21
  private
26
22
  def method_missing(method, *args)
27
23
  @params[method.to_s] || super
28
24
  end
29
25
  end
30
-
26
+
31
27
  end
32
- end
28
+ end
@@ -342,7 +342,7 @@ module ActiveMerchant
342
342
  track_node = REXML::XPath.first(document, '//ns1:FulfillmentShipmentPackage/ns1:TrackingNumber')
343
343
  if track_node
344
344
  id_node = REXML::XPath.first(document, '//ns1:MerchantFulfillmentOrderId')
345
- response[:tracking_numbers][id_node.text] = track_node.text
345
+ response[:tracking_numbers][id_node.text] = [track_node.text]
346
346
  end
347
347
 
348
348
  response[:response_status] = SUCCESS
@@ -27,8 +27,10 @@ module ActiveMerchant
27
27
  'UK' => 'United Kingdom'
28
28
  }
29
29
 
30
- INVALID_LOGIN = /Error with EmailAddress, valid email is required/
31
-
30
+ INVALID_LOGIN = /(Error with Valid Username\/EmailAddress and Password Required)|(Could not verify Username\/EmailAddress and Password combination)/
31
+
32
+ class_attribute :affiliate_id
33
+
32
34
  # The first is the label, and the last is the code
33
35
  def self.shipping_methods
34
36
  [ ['1 Day Service', '1D'],
@@ -72,6 +74,10 @@ module ActiveMerchant
72
74
  @options[:include_pending_stock]
73
75
  end
74
76
 
77
+ def include_empty_stock?
78
+ @options[:include_empty_stock]
79
+ end
80
+
75
81
  private
76
82
  def build_fulfillment_request(order_id, shipping_address, line_items, options)
77
83
  xml = Builder::XmlMarkup.new :indent => 2
@@ -93,6 +99,7 @@ module ActiveMerchant
93
99
  add_credentials(xml)
94
100
  xml.tag! 'Warehouse', WAREHOUSES[options[:warehouse]]
95
101
  xml.tag! 'ProductCode', options[:sku]
102
+ xml.tag! 'IncludeEmpty' if include_empty_stock?
96
103
  end
97
104
  end
98
105
 
@@ -113,6 +120,7 @@ module ActiveMerchant
113
120
  xml.tag! 'EmailAddress', @options[:login]
114
121
  xml.tag! 'Password', @options[:password]
115
122
  xml.tag! 'Server', test? ? 'Test' : 'Production'
123
+ xml.tag! 'AffiliateId', affiliate_id if affiliate_id.present?
116
124
  end
117
125
 
118
126
  def add_order(xml, order_id, shipping_address, line_items, options)
@@ -125,6 +133,9 @@ module ActiveMerchant
125
133
  Array(line_items).each_with_index do |line_item, index|
126
134
  add_item(xml, line_item, index)
127
135
  end
136
+ xml.tag! 'Note' do
137
+ xml.cdata! options[:note] unless options[:note].blank?
138
+ end
128
139
  end
129
140
  end
130
141
 
@@ -134,14 +145,10 @@ module ActiveMerchant
134
145
  xml.tag! 'Full', address[:name]
135
146
  end
136
147
 
137
- if address[:company].blank?
138
- xml.tag! 'Address1', address[:address1]
139
- xml.tag! 'Address2', address[:address2]
140
- else
141
- xml.tag! 'Address1', address[:company]
142
- xml.tag! 'Address2', address[:address1]
143
- xml.tag! 'Address3', address[:address2]
144
- end
148
+ xml.tag! 'Address1', address[:address1]
149
+ xml.tag! 'Address2', address[:address2]
150
+
151
+ xml.tag! 'Company', address[:company]
145
152
 
146
153
  xml.tag! 'City', address[:city]
147
154
  xml.tag! 'State', address[:state] unless address[:state].blank?
@@ -186,7 +193,7 @@ module ActiveMerchant
186
193
 
187
194
  document = REXML::Document.new(xml)
188
195
  document.root.elements.each do |node|
189
- response[node.name.underscore.to_sym] = node.text
196
+ response[node.name.underscore.to_sym] = text_content(node)
190
197
  end
191
198
 
192
199
  response[:success] = response[:status] == '0'
@@ -207,7 +214,7 @@ module ActiveMerchant
207
214
  amount = to_check.sum { |a| node.attributes[a].to_i }
208
215
  response[:stock_levels][node.attributes['code']] = amount
209
216
  else
210
- response[node.name.underscore.to_sym] = node.text
217
+ response[node.name.underscore.to_sym] = text_content(node)
211
218
  end
212
219
  end
213
220
 
@@ -225,9 +232,12 @@ module ActiveMerchant
225
232
 
226
233
  document.root.elements.each do |node|
227
234
  if node.name == 'Order'
228
- response[:tracking_numbers][node.attributes['id']] = node.attributes['trackingNumber'] if node.attributes["shipped"] == "YES"
235
+ if node.attributes["shipped"] == "YES" && node.elements['TrackingNumber']
236
+ tracking_number = node.elements['TrackingNumber'].text
237
+ response[:tracking_numbers][node.attributes['id']] = [tracking_number]
238
+ end
229
239
  else
230
- response[node.name.underscore.to_sym] = node.text
240
+ response[node.name.underscore.to_sym] = text_content(node)
231
241
  end
232
242
  end
233
243
 
@@ -240,6 +250,12 @@ module ActiveMerchant
240
250
  return if string.blank?
241
251
  string.gsub("\n", '').squeeze(" ")
242
252
  end
253
+
254
+ def text_content(xml_node)
255
+ text = xml_node.text
256
+ text = xml_node.cdatas.join if text.blank?
257
+ text
258
+ end
243
259
  end
244
260
  end
245
261
  end
@@ -28,7 +28,9 @@ module ActiveMerchant
28
28
  def self.shipping_methods
29
29
  [
30
30
  ["UPS Ground Shipping", "Ground"],
31
+ ["UPS Ground", "Ground"],
31
32
  ["UPS Standard Shipping (Canada Only)", "Standard"],
33
+ ["UPS Standard Shipping (CA & MX Only)", "Standard"],
32
34
  ["UPS 3-Business Day", "3-Day Select"],
33
35
  ["UPS 2-Business Day", "2nd Day Air"],
34
36
  ["UPS 2-Business Day AM", "2nd Day Air AM"],
@@ -299,7 +301,7 @@ module ActiveMerchant
299
301
  params = node.elements.to_a.each_with_object({}) {|elem, hash| hash[elem.name] = elem.text}
300
302
 
301
303
  tracking = params['ShipmentTrackingNumber']
302
- response[:tracking_numbers][params['InvoiceNumber']] = tracking unless tracking == NOT_SHIPPED
304
+ response[:tracking_numbers][params['InvoiceNumber']] = [tracking] unless tracking == NOT_SHIPPED
303
305
  end
304
306
 
305
307
  response
@@ -1,3 +1,4 @@
1
1
  require 'active_fulfillment/fulfillment/services/shipwire'
2
2
  require 'active_fulfillment/fulfillment/services/webgistix'
3
3
  require 'active_fulfillment/fulfillment/services/amazon'
4
+ require 'active_fulfillment/fulfillment/services/amazon_mws'
@@ -30,9 +30,10 @@ rescue LoadError
30
30
  require 'active_support'
31
31
  end
32
32
 
33
- require 'active_support/core_ext/class/inheritable_attributes'
33
+ require 'active_support/core_ext/class/attribute'
34
34
  require 'active_support/core_ext/class/delegating_attributes'
35
35
  require 'active_support/core_ext/time/calculations'
36
+ require 'active_support/core_ext/date/calculations'
36
37
  require 'active_support/core_ext/numeric/time'
37
38
  require 'active_support/core_ext/enumerable'
38
39
  begin
@@ -51,7 +52,7 @@ end
51
52
  require 'cgi'
52
53
  require 'net/https'
53
54
  require 'rexml/document'
54
- require 'active_merchant/common'
55
+ require 'active_utils'
55
56
 
56
57
  require 'active_fulfillment/fulfillment/base'
57
58
  require 'active_fulfillment/fulfillment/response'
data/test/fixtures.yml CHANGED
@@ -8,4 +8,9 @@ webgistix:
8
8
 
9
9
  amazon:
10
10
  login:
11
- password:
11
+ password:
12
+
13
+ amazon_mws:
14
+ login:
15
+ password:
16
+ seller_id:
@@ -33,7 +33,7 @@ class RemoteAmazonTest < Test::Unit::TestCase
33
33
  end
34
34
 
35
35
  def test_successful_order_submission
36
- response = @service.fulfill(generate_order_id, @address, @line_items, @options)
36
+ response = @service.fulfill(ActiveMerchant::Utils.generate_unique_id, @address, @line_items, @options)
37
37
  assert response.success?
38
38
  assert !response.test?
39
39
  end
@@ -45,7 +45,7 @@ class RemoteAmazonTest < Test::Unit::TestCase
45
45
  }
46
46
  )
47
47
 
48
- response = @service.fulfill(generate_order_id, @address, @line_items, @options)
48
+ response = @service.fulfill(ActiveMerchant::Utils.generate_unique_id, @address, @line_items, @options)
49
49
  assert response.success?
50
50
  end
51
51
 
@@ -54,7 +54,7 @@ class RemoteAmazonTest < Test::Unit::TestCase
54
54
  :login => 'y',
55
55
  :password => 'p')
56
56
 
57
- response = service.fulfill(generate_order_id, @address, @line_items, @options)
57
+ response = service.fulfill(ActiveMerchant::Utils.generate_unique_id, @address, @line_items, @options)
58
58
  assert !response.success?
59
59
  assert_equal "aws:Client.InvalidClientTokenId The AWS Access Key Id you provided does not exist in our records.", response.message
60
60
  end
@@ -114,4 +114,4 @@ class RemoteAmazonTest < Test::Unit::TestCase
114
114
  assert response.success?
115
115
  end
116
116
 
117
- end
117
+ end
@@ -45,7 +45,7 @@ class RemoteShipwireTest < Test::Unit::TestCase
45
45
  assert !response.success?
46
46
  assert response.test?
47
47
  assert_equal 'Error', response.params['status']
48
- assert_equal "Could not verify e-mail/password combination", response.message
48
+ assert_equal "Could not verify Username/EmailAddress and Password combination", response.message
49
49
  end
50
50
 
51
51
  def test_successful_order_submission_to_us
@@ -112,7 +112,7 @@ class RemoteShipwireTest < Test::Unit::TestCase
112
112
  assert !response.success?
113
113
  assert response.test?
114
114
  assert_equal 'Error', response.params['status']
115
- assert_equal "Error with EmailAddress, valid email is required. There is an error in XML document.", response.message
115
+ assert_equal "Error with Valid Username/EmailAddress and Password Required. There is an error in XML document.", response.message
116
116
  end
117
117
 
118
118
  def test_get_inventory
@@ -142,4 +142,4 @@ class RemoteShipwireTest < Test::Unit::TestCase
142
142
  )
143
143
  assert !service.valid_credentials?
144
144
  end
145
- end
145
+ end
@@ -79,8 +79,8 @@ class RemoteWebgistixTest < Test::Unit::TestCase
79
79
  '1254658', 'FAItest123', 'Flat Rate Test Order 4'
80
80
  ])
81
81
  assert response.success?
82
- assert_equal '4209073191018052136352154', response.tracking_numbers['1254658']
83
- assert_equal '9101805213907472080032', response.tracking_numbers['Flat Rate Test Order 4']
82
+ assert_equal ['4209073191018052136352154'], response.tracking_numbers['1254658']
83
+ assert_equal ['9101805213907472080032'], response.tracking_numbers['Flat Rate Test Order 4']
84
84
  assert_nil response.tracking_numbers['FAItest123'] # 'Not Shipped'
85
85
  end
86
86
 
data/test/test_helper.rb CHANGED
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env ruby
2
2
  $:.unshift(File.dirname(__FILE__) + '/../lib')
3
3
 
4
+ require 'rubygems'
5
+ require 'bundler'
6
+ Bundler.setup
7
+
4
8
  require 'test/unit'
5
9
  require 'digest/md5'
6
10
  require 'active_fulfillment'
11
+ require 'active_utils'
7
12
 
8
- begin
9
- require 'mocha'
10
- rescue LoadError
11
- require 'rubygems'
12
- require 'mocha'
13
- end
13
+ require 'mocha'
14
14
 
15
15
  module Test
16
16
  module Unit
@@ -19,17 +19,6 @@ module Test
19
19
 
20
20
  LOCAL_CREDENTIALS = ENV['HOME'] + '/.active_merchant/fixtures.yml' unless defined?(LOCAL_CREDENTIALS)
21
21
  DEFAULT_CREDENTIALS = File.dirname(__FILE__) + '/fixtures.yml' unless defined?(DEFAULT_CREDENTIALS)
22
-
23
- def generate_order_id
24
- md5 = Digest::MD5.new
25
- now = Time.now
26
- md5 << now.to_s
27
- md5 << String(now.usec)
28
- md5 << String(rand(0))
29
- md5 << String($$)
30
- md5 << self.class.name
31
- md5.hexdigest
32
- end
33
22
 
34
23
  def all_fixtures
35
24
  @@fixtures ||= load_fixtures
@@ -98,7 +98,7 @@ class AmazonTest < Test::Unit::TestCase
98
98
 
99
99
  response = @service.fetch_tracking_numbers(['TEST-00000001', 'TEST-00000002'])
100
100
  assert response.success?
101
- assert_equal 'UPS00000001', response.tracking_numbers['TEST-00000001']
101
+ assert_equal %w{UPS00000001}, response.tracking_numbers['TEST-00000001']
102
102
  assert_nil response.tracking_numbers['TEST-00000002']
103
103
  end
104
104
 
@@ -115,7 +115,7 @@ class AmazonTest < Test::Unit::TestCase
115
115
 
116
116
  response = @service.fetch_tracking_numbers(['TEST-00000001', '#1337-1', 'TEST-00000002'])
117
117
  assert response.success?
118
- assert_equal 'UPS00000001', response.tracking_numbers['TEST-00000001']
118
+ assert_equal %w{UPS00000001}, response.tracking_numbers['TEST-00000001']
119
119
  end
120
120
 
121
121
  def test_fetch_tracking_numbers_aborts_on_error
@@ -21,6 +21,7 @@ class ShipwireTest < Test::Unit::TestCase
21
21
  :state => 'NC',
22
22
  :country => 'US',
23
23
  :zip => '23456',
24
+ :company => 'MyCorp',
24
25
  :email => 'buyer@jadedpallet.com'
25
26
  }
26
27
 
@@ -86,6 +87,16 @@ class ShipwireTest < Test::Unit::TestCase
86
87
  assert_equal 921, response.stock_levels['KingMonkey']
87
88
  end
88
89
 
90
+ def test_inventory_request_with_include_empty_tag
91
+ @shipwire = ShipwireService.new(
92
+ :login => 'cody@example.com',
93
+ :password => 'test',
94
+ :include_empty_stock => true
95
+ )
96
+ xml = REXML::Document.new(@shipwire.send(:build_inventory_request, {}))
97
+ assert REXML::XPath.first(xml, '//IncludeEmpty')
98
+ end
99
+
89
100
  def test_no_tracking_numbers_available
90
101
  @shipwire.expects(:ssl_post).returns(successful_empty_tracking_response)
91
102
  response = @shipwire.fetch_tracking_numbers(['1234'])
@@ -94,8 +105,8 @@ class ShipwireTest < Test::Unit::TestCase
94
105
  end
95
106
 
96
107
  def test_successful_tracking
97
- expected = { "2986" => "1ZW682E90326614239",
98
- "2987" => "1ZW682E90326795080" }
108
+ expected = { "2986" => ["1ZW682E90326614239"],
109
+ "2987" => ["1ZW682E90326795080"] }
99
110
 
100
111
  @shipwire.expects(:ssl_post).returns(successful_tracking_response)
101
112
  response = @shipwire.fetch_tracking_numbers(["2986", "2987"])
@@ -132,6 +143,38 @@ class ShipwireTest < Test::Unit::TestCase
132
143
  assert !@shipwire.valid_credentials?
133
144
  end
134
145
 
146
+ def test_affiliate_id
147
+ ActiveMerchant::Fulfillment::ShipwireService.affiliate_id = 'affiliate_id'
148
+
149
+ xml = REXML::Document.new(@shipwire.send(:build_fulfillment_request, '123456', @address, @line_items, @options))
150
+ affiliate_id = REXML::XPath.first(xml, "//AffiliateId")
151
+ assert_equal 'affiliate_id', affiliate_id.text
152
+ end
153
+
154
+ def test_company_name_in_request
155
+ xml = REXML::Document.new(@shipwire.send(:build_fulfillment_request, '123456', @address, @line_items, @options))
156
+ company_node = REXML::XPath.first(xml, "//Company")
157
+ assert_equal 'MyCorp', company_node.text
158
+ end
159
+
160
+ def test_order_excludes_note_by_default
161
+ xml = REXML::Document.new(@shipwire.send(:build_fulfillment_request, '123456', @address, @line_items, @options))
162
+ note_node = REXML::XPath.first(xml, "//Note").cdatas.first
163
+ assert_nil note_node
164
+ end
165
+
166
+ def test_order_includes_note_when_present
167
+ @options[:note] = "A test note"
168
+ xml = REXML::Document.new(@shipwire.send(:build_fulfillment_request, '123456', @address, @line_items, @options))
169
+ note_node = REXML::XPath.first(xml, "//Note").cdatas.first
170
+ assert_equal "A test note", note_node.to_s
171
+ end
172
+
173
+ def test_error_response_cdata_parsing
174
+ @shipwire.expects(:ssl_post).returns(xml_fixture('shipwire/fulfillment_failure_response'))
175
+ assert !@shipwire.valid_credentials?
176
+ end
177
+
135
178
  private
136
179
  def successful_empty_tracking_response
137
180
  "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>\r\n<TrackingUpdateResponse><Status>Test</Status><TotalOrders></TotalOrders><TotalShippedOrders></TotalShippedOrders><TotalProducts></TotalProducts><Bookmark></Bookmark></TrackingUpdateResponse>"
@@ -142,9 +185,15 @@ class ShipwireTest < Test::Unit::TestCase
142
185
  <?xml version="1.0"?>
143
186
  <TrackingUpdateResponse>
144
187
  <Status>Test</Status>
145
- <Order id="2986" shipped="YES" trackingNumber="1ZW682E90326614239" shipper="UPS GD" handling="1.00" shipping="13.66" total="14.66"/>
146
- <Order id="2987" shipped="YES" trackingNumber="1ZW682E90326795080" shipper="UPS GD" handling="1.50" shipping="9.37" total="10.87"/>
147
- <Order id="2988" shipped="NO" trackingNumber="" shipper="UPS GD" handling="" shipping="" total=""/>
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>
148
197
  <TotalOrders>3</TotalOrders>
149
198
  <TotalShippedOrders>2</TotalShippedOrders>
150
199
  <Bookmark>2006-04-28 20:35:45</Bookmark>
@@ -157,21 +206,51 @@ class ShipwireTest < Test::Unit::TestCase
157
206
  <?xml version="1.0" encoding="ISO-8859-1"?>
158
207
  <TrackingUpdateResponse>
159
208
  <Status>0</Status>
160
- <Order id="21" shipped="YES" trackingNumber="1Z6296VW0398500001" shipper="5" handling="0.00" shipping="6.58" total="6.58"/>
161
- <Order id="22" shipped="YES" trackingNumber="1Z6296VW0390790002" shipper="5" handling="0.00" shipping="8.13" total="8.13"/>
162
- <Order id="23" shipped="YES" trackingNumber="1Z6296VW0396490003" shipper="5" handling="0.00" shipping="7.63" total="7.63"/>
163
- <Order id="24" shipped="YES" trackingNumber="1Z6296VW0390200004" shipper="5" handling="0.00" shipping="8.97" total="8.97"/>
164
- <Order id="25" shipped="YES" trackingNumber="1Z6296VW0393240005" shipper="5" handling="0.00" shipping="8.42" total="8.42"/>
165
- <Order id="26" shipped="YES" trackingNumber="1Z6296VW0396400006" shipper="5" handling="0.00" shipping="8.42" total="8.42"/>
166
- <Order id="2581" shipped="YES" trackingNumber="1Z6296VW0391160007" shipper="5" handling="0.00" shipping="8.21" total="8.21"/>
167
- <Order id="2576" shipped="YES" trackingNumber="CJ3026000018US" shipper="43" handling="0.00" shipping="18.60" total="18.60"/>
168
- <Order id="2593" shipped="YES" trackingNumber="1Z6296VW0398660008" shipper="5" handling="0.00" shipping="7.63" total="7.63"/>
169
- <Order id="2598" shipped="YES" trackingNumber="1Z6296VW0391610009" shipper="5" handling="0.00" shipping="9.84" total="9.84"/>
170
- <Order id="2610" shipped="YES" trackingNumber="1Z6296VW0395650010" shipper="5" handling="0.00" shipping="7.63" total="7.63"/>
171
- <Order id="2611" shipped="YES" trackingNumber="1Z6296VW0397050011" shipper="5" handling="0.00" shipping="7.13" total="7.13"/>
172
- <Order id="2613" shipped="YES" trackingNumber="1Z6296VW0398970012" shipper="5" handling="0.00" shipping="8.97" total="8.97"/>
173
- <Order id="2616" shipped="NO" trackingNumber="" shipper="5" handling="0.00" shipping="9.84" total="9.84"/>
174
- <Order id="2631" shipped="NO" trackingNumber="" shipper="" handling="" shipping="" total=""/>
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>
175
254
  <TotalOrders>15</TotalOrders>
176
255
  <TotalShippedOrders>13</TotalShippedOrders>
177
256
  <TotalProducts/>
@@ -185,7 +264,7 @@ class ShipwireTest < Test::Unit::TestCase
185
264
  <<-XML
186
265
  <?xml version="1.0" encoding="ISO-8859-1"?>
187
266
  <TrackingUpdateResponse><Status>Error</Status><ErrorMessage>
188
- Error with EmailAddress, valid email is required.
267
+ Error with Valid Username/EmailAddress and Password Required.
189
268
  There is an error in XML document.
190
269
  </ErrorMessage></TrackingUpdateResponse>
191
270
  XML
@@ -106,7 +106,7 @@ class WebgistixTest < Test::Unit::TestCase
106
106
  response = @service.fetch_tracking_numbers(['AB12345', 'XY4567'])
107
107
  assert response.success?
108
108
  assert_equal WebgistixService::SUCCESS_MESSAGE, response.message
109
- assert_equal '1Z8E5A380396682872', response.tracking_numbers['AB12345']
109
+ assert_equal ['1Z8E5A380396682872'], response.tracking_numbers['AB12345']
110
110
  assert_nil response.tracking_numbers['XY4567']
111
111
  end
112
112