active_shipping 1.8.6 → 1.9.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.
@@ -257,6 +257,25 @@ module ActiveShipping
257
257
  xml_builder.to_xml
258
258
  end
259
259
 
260
+ # Builds an XML node to request UPS shipping rates for the given packages
261
+ #
262
+ # @param origin [ActiveShipping::Location] Where the shipment will originate from
263
+ # @param destination [ActiveShipping::Location] Where the package will go
264
+ # @param packages [Array<ActiveShipping::Package>] The list of packages that will
265
+ # be in the shipment
266
+ # @options options [Hash] rate-specific options
267
+ # @return [ActiveShipping::RateResponse] The response from the UPS, which
268
+ # includes 0 or more rate estimates for different shipping products
269
+ #
270
+ # options:
271
+ # * service: name of the service
272
+ # * pickup_type: symbol for PICKUP_CODES
273
+ # * customer_classification: symbol for CUSTOMER_CLASSIFICATIONS
274
+ # * shipper: who is sending the package and where it should be returned
275
+ # if it is undeliverable.
276
+ # * imperial: if truthy, measurements will use the metric system
277
+ # * negotiated_rates: if truthy, negotiated rates will be requested from
278
+ # UPS. Only valid if shipper account has negotiated rates.
260
279
  def build_rate_request(origin, destination, packages, options = {})
261
280
  xml_builder = Nokogiri::XML::Builder.new do |xml|
262
281
  xml.RatingServiceSelectionRequest do
@@ -1,78 +1,4 @@
1
1
  module ActiveShipping #:nodoc:
2
- # A package item is a unique item(s) that is physically in a package.
3
- # A single package can have many items. This is only required
4
- # for shipping methods (label creation) right now.
5
- class PackageItem
6
- include Quantified
7
-
8
- attr_reader :sku, :hs_code, :value, :name, :weight, :quantity, :options
9
-
10
- def initialize(name, grams_or_ounces, value, quantity, options = {})
11
- @name = name
12
-
13
- imperial = (options[:units] == :imperial) ||
14
- (grams_or_ounces.respond_to?(:unit) && m.unit.to_sym == :imperial)
15
-
16
- @unit_system = imperial ? :imperial : :metric
17
-
18
- @weight = attribute_from_metric_or_imperial(grams_or_ounces, Mass, :grams, :ounces)
19
-
20
- @value = Package.cents_from(value)
21
- @quantity = quantity > 0 ? quantity : 1
22
-
23
- @sku = options[:sku]
24
- @hs_code = options[:hs_code]
25
- @options = options
26
- end
27
-
28
- def weight(options = {})
29
- case options[:type]
30
- when nil, :actual
31
- @weight
32
- when :volumetric, :dimensional
33
- @volumetric_weight ||= begin
34
- m = Mass.new((centimetres(:box_volume) / 6.0), :grams)
35
- @unit_system == :imperial ? m.in_ounces : m
36
- end
37
- when :billable
38
- [weight, weight(:type => :volumetric)].max
39
- end
40
- end
41
- alias_method :mass, :weight
42
-
43
- def ounces(options = {})
44
- weight(options).in_ounces.amount
45
- end
46
- alias_method :oz, :ounces
47
-
48
- def grams(options = {})
49
- weight(options).in_grams.amount
50
- end
51
- alias_method :g, :grams
52
-
53
- def pounds(options = {})
54
- weight(options).in_pounds.amount
55
- end
56
- alias_method :lb, :pounds
57
- alias_method :lbs, :pounds
58
-
59
- def kilograms(options = {})
60
- weight(options).in_kilograms.amount
61
- end
62
- alias_method :kg, :kilograms
63
- alias_method :kgs, :kilograms
64
-
65
- private
66
-
67
- def attribute_from_metric_or_imperial(obj, klass, metric_unit, imperial_unit)
68
- if obj.is_a?(klass)
69
- return value
70
- else
71
- return klass.new(obj, (@unit_system == :imperial ? imperial_unit : metric_unit))
72
- end
73
- end
74
- end
75
-
76
2
  class Package
77
3
  include Quantified
78
4
 
@@ -136,7 +62,9 @@ module ActiveShipping #:nodoc:
136
62
  end
137
63
  alias_method :tube?, :cylinder?
138
64
 
139
- def gift?; @gift end
65
+ def gift?
66
+ @gift
67
+ end
140
68
 
141
69
  def ounces(options = {})
142
70
  weight(options).in_ounces.amount
@@ -0,0 +1,72 @@
1
+ module ActiveShipping #:nodoc:
2
+ class PackageItem
3
+ include Quantified
4
+
5
+ attr_reader :sku, :hs_code, :value, :name, :weight, :quantity, :options
6
+
7
+ def initialize(name, grams_or_ounces, value, quantity, options = {})
8
+ @name = name
9
+
10
+ imperial = (options[:units] == :imperial) ||
11
+ (grams_or_ounces.respond_to?(:unit) && m.unit.to_sym == :imperial)
12
+
13
+ @unit_system = imperial ? :imperial : :metric
14
+
15
+ @weight = attribute_from_metric_or_imperial(grams_or_ounces, Mass, :grams, :ounces)
16
+
17
+ @value = Package.cents_from(value)
18
+ @quantity = quantity > 0 ? quantity : 1
19
+
20
+ @sku = options[:sku]
21
+ @hs_code = options[:hs_code]
22
+ @options = options
23
+ end
24
+
25
+ def weight(options = {})
26
+ case options[:type]
27
+ when nil, :actual
28
+ @weight
29
+ when :volumetric, :dimensional
30
+ @volumetric_weight ||= begin
31
+ m = Mass.new((centimetres(:box_volume) / 6.0), :grams)
32
+ @unit_system == :imperial ? m.in_ounces : m
33
+ end
34
+ when :billable
35
+ [weight, weight(:type => :volumetric)].max
36
+ end
37
+ end
38
+ alias_method :mass, :weight
39
+
40
+ def ounces(options = {})
41
+ weight(options).in_ounces.amount
42
+ end
43
+ alias_method :oz, :ounces
44
+
45
+ def grams(options = {})
46
+ weight(options).in_grams.amount
47
+ end
48
+ alias_method :g, :grams
49
+
50
+ def pounds(options = {})
51
+ weight(options).in_pounds.amount
52
+ end
53
+ alias_method :lb, :pounds
54
+ alias_method :lbs, :pounds
55
+
56
+ def kilograms(options = {})
57
+ weight(options).in_kilograms.amount
58
+ end
59
+ alias_method :kg, :kilograms
60
+ alias_method :kgs, :kilograms
61
+
62
+ private
63
+
64
+ def attribute_from_metric_or_imperial(obj, klass, metric_unit, imperial_unit)
65
+ if obj.is_a?(klass)
66
+ return value
67
+ else
68
+ return klass.new(obj, (@unit_system == :imperial ? imperial_unit : metric_unit))
69
+ end
70
+ end
71
+ end
72
+ end
@@ -1,3 +1,3 @@
1
1
  module ActiveShipping
2
- VERSION = "1.8.6"
2
+ VERSION = "1.9.0"
3
3
  end
@@ -225,7 +225,7 @@ class RemoteFedExTest < Minitest::Test
225
225
  assert_equal "Delivered", response.status_description
226
226
 
227
227
  assert_equal Time.parse('Fri, 03 Jan 2014'), response.ship_time
228
- assert_equal nil, response.scheduled_delivery_date
228
+ assert_nil response.scheduled_delivery_date
229
229
  assert_equal Time.parse('2014-01-09 18:31:00 +0000'), response.actual_delivery_date
230
230
 
231
231
  origin_address = ActiveShipping::Location.new(
@@ -261,7 +261,7 @@ class RemoteFedExTest < Minitest::Test
261
261
  assert_equal 'OC', response.shipment_events.second.type_code
262
262
  assert_equal 'AR', response.shipment_events.third.type_code
263
263
  assert_nil response.actual_delivery_date
264
- assert_equal nil, response.scheduled_delivery_date
264
+ assert_nil response.scheduled_delivery_date
265
265
  end
266
266
 
267
267
  def test_find_tracking_info_for_in_transit_shipment_2
@@ -275,8 +275,8 @@ class RemoteFedExTest < Minitest::Test
275
275
  assert_equal "Arrived at FedEx location", response.status_description
276
276
 
277
277
  assert_equal Time.parse('Fri, 03 Jan 2014'), response.ship_time
278
- assert_equal nil, response.scheduled_delivery_date
279
- assert_equal nil, response.actual_delivery_date
278
+ assert_nil response.scheduled_delivery_date
279
+ assert_nil response.actual_delivery_date
280
280
 
281
281
  origin_address = ActiveShipping::Location.new(
282
282
  city: 'CAMBRIDGE',
@@ -391,7 +391,7 @@ class RemoteFedExTest < Minitest::Test
391
391
 
392
392
  assert response.success?
393
393
  refute_empty response.labels
394
- data = response.labels.first.img_data
394
+ data = response.labels.first.img_data
395
395
  refute_empty data
396
396
  assert data[0...4] == '%PDF'
397
397
  end
@@ -373,6 +373,7 @@ class RemoteUPSTest < Minitest::Test
373
373
 
374
374
  def test_delivery_date_estimates_intl
375
375
  today = Date.current
376
+
376
377
  response = @carrier.get_delivery_date_estimates(
377
378
  location_fixtures[:new_york_with_name],
378
379
  location_fixtures[:ottawa_with_name],
@@ -386,7 +387,7 @@ class RemoteUPSTest < Minitest::Test
386
387
  assert response.success?
387
388
  refute_empty response.delivery_estimates
388
389
  ww_express_estimate = response.delivery_estimates.select {|de| de.service_name == "UPS Worldwide Express"}.first
389
- assert_equal Date.parse(1.day.from_now.to_s), ww_express_estimate.date
390
+ assert_equal 1.business_days.after(today), ww_express_estimate.date
390
391
  end
391
392
 
392
393
  def test_void_shipment
data/test/test_helper.rb CHANGED
@@ -8,6 +8,7 @@ require 'business_time'
8
8
  require 'active_shipping'
9
9
  require 'logger'
10
10
  require 'erb'
11
+ require 'pry'
11
12
 
12
13
  # This makes sure that Minitest::Test exists when an older version of Minitest
13
14
  # (i.e. 4.x) is required by ActiveSupport.
@@ -112,7 +112,7 @@ class CanadaPostPwsTrackingTest < Minitest::Test
112
112
 
113
113
  assert_equal CPPWSTrackingResponse, response.class
114
114
  assert_equal "Expedited Parcels", response.service_name
115
- assert_equal nil, response.expected_date
115
+ assert_nil response.expected_date
116
116
  assert_equal "8213295707205355", response.tracking_number
117
117
  assert_equal 1, response.shipment_events.size
118
118
  assert_equal response.origin.city, "MAPLE"
@@ -130,7 +130,7 @@ class CanadaPostPwsTrackingTest < Minitest::Test
130
130
  response = @cp.find_tracking_info('1371134583769923', {})
131
131
 
132
132
  assert_equal false, response.delivered?
133
- assert_equal nil, response.actual_delivery_time
133
+ assert_nil response.actual_delivery_time
134
134
  end
135
135
 
136
136
  def test_parse_tracking_response_shipment_events
@@ -379,7 +379,7 @@ class FedExTest < Minitest::Test
379
379
  refute response.exception?
380
380
 
381
381
  assert_equal Date.parse('2013-12-30'), response.ship_time
382
- assert_equal nil, response.scheduled_delivery_date
382
+ assert_nil response.scheduled_delivery_date
383
383
  assert_equal Time.parse('2014-01-02T18:23:29Z'), response.actual_delivery_date
384
384
 
385
385
  origin_address = ActiveShipping::Location.new(
@@ -417,7 +417,7 @@ class FedExTest < Minitest::Test
417
417
  assert_equal 'AR', response.shipment_events.third.type_code
418
418
  assert_equal 'Delivered', response.latest_event.name
419
419
  assert_equal 'DL', response.latest_event.type_code
420
- assert_equal nil, response.delivery_signature
420
+ assert_nil response.delivery_signature
421
421
  end
422
422
 
423
423
  def test_state_degrades_to_unknown
@@ -449,13 +449,13 @@ class FedExTest < Minitest::Test
449
449
  assert_equal :in_transit, response.status
450
450
  assert_equal 'IT', response.status_code
451
451
  assert_equal "Package available for clearance", response.status_description
452
- assert_equal nil, response.delivery_signature
452
+ assert_nil response.delivery_signature
453
453
 
454
454
  assert_equal Time.parse('2014-11-17T22:39:00+11:00'), response.ship_time
455
- assert_equal nil, response.scheduled_delivery_date
456
- assert_equal nil, response.actual_delivery_date
455
+ assert_nil response.scheduled_delivery_date
456
+ assert_nil response.actual_delivery_date
457
457
 
458
- assert_equal nil, response.origin
458
+ assert_nil response.origin
459
459
 
460
460
  destination_address = ActiveShipping::Location.new(
461
461
  city: 'GRAFTON',
@@ -481,8 +481,8 @@ class FedExTest < Minitest::Test
481
481
  assert_equal "Unable to deliver", response.status_description
482
482
 
483
483
  assert_equal Date.parse('2014-01-27'), response.ship_time
484
- assert_equal nil, response.scheduled_delivery_date
485
- assert_equal nil, response.actual_delivery_date
484
+ assert_nil response.scheduled_delivery_date
485
+ assert_nil response.actual_delivery_date
486
486
 
487
487
  origin_address = ActiveShipping::Location.new(
488
488
  city: 'AUSTIN',
@@ -43,7 +43,7 @@ class KunakiTest < Minitest::Test
43
43
 
44
44
  assert rate = response.rates.first
45
45
  assert_equal "USPS Priority Mail", rate.service_name
46
- assert_equal nil, rate.service_code
46
+ assert_nil rate.service_code
47
47
  assert_equal "USPS", rate.carrier
48
48
  assert_equal 800, rate.total_price
49
49
  assert_equal ["UPS 2nd Day Air", "UPS Ground", "UPS Next Day Air Saver", "USPS Priority Mail"], response.rates.collect(&:service_name).sort
@@ -68,7 +68,7 @@ class StampsTest < Minitest::Test
68
68
  assert_equal 'ActiveShipping::StampsPurchasePostageResponse', purchase_status.class.name
69
69
 
70
70
  assert_equal 'Success', purchase_status.purchase_status
71
- assert_equal nil, purchase_status.transaction_id
71
+ assert_nil purchase_status.transaction_id
72
72
  end
73
73
 
74
74
  def test_validate_address
@@ -160,13 +160,13 @@ class USPSTest < Minitest::Test
160
160
  # USPS API doesn't tell where it's going
161
161
  @carrier.expects(:commit).returns(@tracking_response)
162
162
  response = @carrier.find_tracking_info('9102901000462189604217', :test => true)
163
- assert_equal response.destination, nil
163
+ assert_nil response.destination
164
164
  end
165
165
 
166
166
  def test_find_tracking_info_tracking_number
167
167
  @carrier.expects(:commit).returns(@tracking_response)
168
168
  response = @carrier.find_tracking_info('9102901000462189604217', :test => true)
169
- assert_equal response.tracking_number, '9102901000462189604217'
169
+ assert_equal '9102901000462189604217', response.tracking_number
170
170
  end
171
171
 
172
172
  def test_find_tracking_info_should_have_correct_status
@@ -118,24 +118,24 @@ class ExternalReturnLabelRequestTest < Minitest::Test
118
118
  end
119
119
 
120
120
  def test_sanitize
121
- assert_equal @external_request_label_req.send(:sanitize,' ').length, 0
122
- assert_equal @external_request_label_req.send(:sanitize, 'some string '), 'some string'
123
- assert_equal @external_request_label_req.send(:sanitize, {}), nil
124
- assert_equal @external_request_label_req.send(:sanitize, nil), nil
125
- assert_equal @external_request_label_req.send(:sanitize, nil), nil
126
- assert_equal @external_request_label_req.send(:sanitize, []), nil
127
- assert_equal @external_request_label_req.send(:sanitize, (1..100).to_a.join("_")).size, ExternalReturnLabelRequest::CAP_STRING_LEN
121
+ assert_equal "", @external_request_label_req.send(:sanitize,' ')
122
+ assert_equal 'some string', @external_request_label_req.send(:sanitize, 'some string ')
123
+ assert_nil @external_request_label_req.send(:sanitize, {})
124
+ assert_nil @external_request_label_req.send(:sanitize, nil)
125
+ assert_nil @external_request_label_req.send(:sanitize, nil)
126
+ assert_nil @external_request_label_req.send(:sanitize, [])
127
+ assert_equal ExternalReturnLabelRequest::CAP_STRING_LEN, @external_request_label_req.send(:sanitize, (1..100).to_a.join("_")).size
128
128
  end
129
129
 
130
130
  def test_to_bool
131
- assert_equal @external_request_label_req.send(:to_bool, 'yes'), true
132
- assert_equal @external_request_label_req.send(:to_bool, 'true'), true
133
- assert_equal @external_request_label_req.send(:to_bool, true), true
134
- assert_equal @external_request_label_req.send(:to_bool, '1'), true
135
- assert_equal @external_request_label_req.send(:to_bool, '0'), false
136
- assert_equal @external_request_label_req.send(:to_bool, 'false'), false
137
- assert_equal @external_request_label_req.send(:to_bool, false), false
138
- assert_equal @external_request_label_req.send(:to_bool, nil, false), false
131
+ assert_equal true, @external_request_label_req.send(:to_bool, 'yes')
132
+ assert_equal true, @external_request_label_req.send(:to_bool, 'true')
133
+ assert_equal true, @external_request_label_req.send(:to_bool, true)
134
+ assert_equal true, @external_request_label_req.send(:to_bool, '1')
135
+ assert_equal false, @external_request_label_req.send(:to_bool, '0')
136
+ assert_equal false, @external_request_label_req.send(:to_bool, 'false')
137
+ assert_equal false, @external_request_label_req.send(:to_bool, false)
138
+ assert_equal false, @external_request_label_req.send(:to_bool, nil, false)
139
139
  end
140
140
 
141
141
  def test_validate_range
@@ -176,8 +176,8 @@ class ExternalReturnLabelRequestTest < Minitest::Test
176
176
  assert_raises(USPSValidationError) do
177
177
  @external_request_label_req.send(:validate_email, ' ', __method__)
178
178
  end
179
- assert_equal @external_request_label_req.send(:validate_email, 'no-reply@example.com', __method__), 'no-reply@example.com'
180
- assert_equal @external_request_label_req.send(:validate_email, ' no-reply@example.com ', __method__), 'no-reply@example.com'
179
+ assert_equal 'no-reply@example.com', @external_request_label_req.send(:validate_email, 'no-reply@example.com', __method__)
180
+ assert_equal 'no-reply@example.com', @external_request_label_req.send(:validate_email, ' no-reply@example.com ', __method__)
181
181
  end
182
182
 
183
183
  def test_tag_required
@@ -0,0 +1,237 @@
1
+ require 'test_helper'
2
+
3
+ class PackageItemTest < Minitest::Test
4
+ def setup
5
+ @name = "Fancy Pants"
6
+ @weight = 100
7
+ @value = 1299
8
+ @quantity = 3
9
+ @sku = "1234567890"
10
+ @hs_code = "1234.56.78"
11
+ @options = {
12
+ units: :metric,
13
+ sku: @sku,
14
+ hs_code: @hs_code,
15
+ type: :actual,
16
+ }
17
+
18
+ @item = PackageItem.new(@name, @weight, @value, @quantity, @options)
19
+ @mass = ::Quantified::Mass.new(@weight, :grams)
20
+ end
21
+
22
+ def test_initialize_with_all_attributes
23
+ assert_equal @name, @item.name
24
+ assert_equal @options, @item.options
25
+ assert_equal @hs_code, @item.hs_code
26
+ assert_equal @sku, @item.sku
27
+ assert_equal @value, @item.value
28
+ assert_equal @quantity, @item.quantity
29
+ end
30
+
31
+ def test_initialize_assumes_symbol_keys
32
+ options = {
33
+ "units" => :imperial,
34
+ "sku" => @sku,
35
+ "hs_code" => @hs_code,
36
+ }
37
+ @item = PackageItem.new(@name, @weight, @value, @quantity, options)
38
+
39
+ assert_nil @item.hs_code
40
+ assert_nil @item.sku
41
+ refute_equal @weight, @item.ounces
42
+ assert_equal @weight, @item.grams
43
+ end
44
+
45
+ def test_initialize_negative_quantity
46
+ assert_equal 1, PackageItem.new(@name, @weight, @value, -1).quantity
47
+ assert_equal 1, PackageItem.new(@name, @weight, @value, 0).quantity
48
+ end
49
+
50
+ def test_initialize_weight_mass_object
51
+ begin
52
+ @item = PackageItem.new(@name, @mass, @value, @quantity, @options)
53
+ assert_equal @mass, @item.weight
54
+ flunk "This code path is broken but passed unexpectedly"
55
+ rescue NameError
56
+ skip "This code path is broken"
57
+ end
58
+ end
59
+
60
+ def test_initialize_weight_default_metric
61
+ assert_equal @weight, @item.grams
62
+ refute_equal @weight, @item.ounces
63
+ end
64
+
65
+ def test_initialize_weight_accepts_imperial
66
+ @item = PackageItem.new(@name, @weight, @value, @quantity, @options.merge(units: :imperial))
67
+
68
+ assert_equal @weight, @item.ounces
69
+ refute_equal @weight, @item.grams
70
+ end
71
+
72
+ def test_initialize_weight_accepts_metric
73
+ @item = PackageItem.new(@name, @weight, @value, @quantity, @options.merge(units: :metric))
74
+
75
+ assert_equal @weight, @item.grams
76
+ refute_equal @weight, @item.ounces
77
+ end
78
+
79
+ def test_initialize_weight_does_not_accept_strings
80
+ @item = PackageItem.new(@name, @weight, @value, @quantity, @options.merge(units: "imperial"))
81
+
82
+ assert_equal @weight, @item.grams
83
+ refute_equal @weight, @item.ounces
84
+ end
85
+
86
+ def test_initialize_value_from_cents
87
+ @item = PackageItem.new(@name, @weight, "1.23", @quantity, @options)
88
+
89
+ assert_equal 123, @item.value
90
+ end
91
+
92
+ def test_weight
93
+ assert_equal @mass, @item.weight
94
+ assert_instance_of ::Quantified::Mass, @item.weight
95
+ end
96
+
97
+ def test_weight_actual
98
+ assert_equal @mass, @item.weight(type: :actual)
99
+ assert_instance_of ::Quantified::Mass, @item.weight(type: :actual)
100
+ end
101
+
102
+ def test_weight_volumetric
103
+ begin
104
+ assert_equal :todo, @item.weight(type: :volumetric)
105
+ assert_instance_of ::Quantified::Mass, @item.weight(type: :volumetric)
106
+ flunk "This code path is broken but passed unexpectedly"
107
+ rescue NoMethodError
108
+ skip "This code path is broken"
109
+ end
110
+ end
111
+
112
+ def test_weight_dimensional
113
+ begin
114
+ assert_equal :todo, @item.weight(type: :dimensional)
115
+ assert_instance_of ::Quantified::Mass, @item.weight(type: :dimensional)
116
+ flunk "This code path is broken but passed unexpectedly"
117
+ rescue NoMethodError
118
+ skip "This code path is broken"
119
+ end
120
+ end
121
+
122
+ def test_weight_billable_max_weight_and_volumetric
123
+ begin
124
+ assert_equal :todo, @item.weight(type: :billable)
125
+ assert_instance_of ::Quantified::Mass, @item.weight(type: :billable)
126
+ flunk "This code path is broken but passed unexpectedly"
127
+ rescue NoMethodError
128
+ skip "This code path is broken"
129
+ end
130
+ end
131
+
132
+ def test_grams_value
133
+ assert_equal 100, @item.grams
134
+ end
135
+
136
+ def test_grams_accepts_options_with_type
137
+ begin
138
+ assert_equal :todo, @item.grams(type: :volumetric)
139
+ flunk "This code path is broken but passed unexpectedly"
140
+ rescue NoMethodError
141
+ skip "This code path is broken"
142
+ end
143
+ end
144
+
145
+ def test_grams_converts
146
+ @item = PackageItem.new(@name, 100, @value, @quantity, @options.merge(units: :imperial))
147
+
148
+ assert_in_delta 2834.9, @item.grams, 0.1
149
+ end
150
+
151
+ def test_grams_alias_g
152
+ assert_equal @item.grams, @item.g
153
+ end
154
+
155
+ def test_ounces_value
156
+ @item = PackageItem.new(@name, @weight, @value, @quantity, @options.merge(units: :imperial))
157
+
158
+ assert_equal 100, @item.ounces
159
+ end
160
+
161
+ def test_ounces_accepts_options_with_type
162
+ begin
163
+ assert_equal :todo, @item.ounces(type: :volumetric)
164
+ flunk "This code path is broken but passed unexpectedly"
165
+ rescue NoMethodError
166
+ skip "This code path is broken"
167
+ end
168
+ end
169
+
170
+ def test_ounces_converts
171
+ @item = PackageItem.new(@name, @weight, @value, @quantity, @options.merge(units: :metric))
172
+
173
+ assert_in_delta 3.5, @item.ounces, 0.1
174
+ end
175
+
176
+ def test_ounces_alias_oz
177
+ assert_equal @item.ounces, @item.oz
178
+ end
179
+
180
+ def test_pounds_value
181
+ @item = PackageItem.new(@name, 32, @value, @quantity, @options.merge(units: :imperial))
182
+
183
+ assert_equal 2, @item.pounds
184
+ end
185
+
186
+ def test_pounds_accepts_options_with_type
187
+ begin
188
+ assert_equal :todo, @item.pounds(type: :volumetric)
189
+ flunk "This code path is broken but passed unexpectedly"
190
+ rescue
191
+ skip "This code path is broken"
192
+ end
193
+ end
194
+
195
+ def test_pounds_converts
196
+ @item = PackageItem.new(@name, 1000, @value, @quantity, @options.merge(units: :metric))
197
+
198
+ assert_in_delta 2.2, @item.pounds, 0.1
199
+ end
200
+
201
+ def test_pounds_alias_lb
202
+ assert_equal @item.pounds, @item.lb
203
+ end
204
+
205
+ def test_pounds_alias_lbs
206
+ assert_equal @item.pounds, @item.lbs
207
+ end
208
+
209
+ def test_kilograms_value
210
+ @item = PackageItem.new(@name, 1000, @value, @quantity, @options.merge(units: :metric))
211
+
212
+ assert_equal 1, @item.kilograms
213
+ end
214
+
215
+ def test_kilograms_accepts_options_with_type
216
+ begin
217
+ assert_equal :todo, @item.kilograms(type: :volumetric)
218
+ flunk "This code path is broken but passed unexpectedly"
219
+ rescue
220
+ skip "This code path is broken"
221
+ end
222
+ end
223
+
224
+ def test_kilograms_converts
225
+ @item = PackageItem.new(@name, 1000, @value, @quantity, @options.merge(units: :imperial))
226
+
227
+ assert_in_delta 28.3, @item.kilograms, 0.1
228
+ end
229
+
230
+ def test_kilograms_alias_kg
231
+ assert_equal @item.kilograms, @item.kg
232
+ end
233
+
234
+ def test_kilograms_alias_kgs
235
+ assert_equal @item.kilograms, @item.kgs
236
+ end
237
+ end