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.
- checksums.yaml +4 -4
- data/.travis.yml +12 -7
- data/CONTRIBUTING.md +14 -38
- data/MIT-LICENSE +2 -2
- data/README.md +61 -24
- data/Rakefile +3 -0
- data/active_shipping.gemspec +25 -26
- data/{Gemfile.activesupport32 → gemfiles/activesupport32.gemfile} +2 -1
- data/{Gemfile.activesupport40 → gemfiles/activesupport40.gemfile} +2 -1
- data/{Gemfile.activesupport41 → gemfiles/activesupport41.gemfile} +2 -1
- data/{Gemfile.activesupport42 → gemfiles/activesupport42.gemfile} +2 -1
- data/{Gemfile.activesupport50 → gemfiles/activesupport50.gemfile} +2 -1
- data/gemfiles/activesupport_master.gemfile +5 -0
- data/lib/active_shipping.rb +1 -23
- data/lib/active_shipping/carrier.rb +3 -3
- data/lib/active_shipping/carriers/canada_post_pws.rb +8 -8
- data/lib/active_shipping/carriers/ups.rb +19 -0
- data/lib/active_shipping/package.rb +3 -75
- data/lib/active_shipping/package_item.rb +72 -0
- data/lib/active_shipping/version.rb +1 -1
- data/test/remote/fedex_test.rb +5 -5
- data/test/remote/ups_test.rb +2 -1
- data/test/test_helper.rb +1 -0
- data/test/unit/carriers/canada_post_pws_tracking_test.rb +2 -2
- data/test/unit/carriers/fedex_test.rb +8 -8
- data/test/unit/carriers/kunaki_test.rb +1 -1
- data/test/unit/carriers/stamps_test.rb +1 -1
- data/test/unit/carriers/usps_test.rb +2 -2
- data/test/unit/external_return_label_request_test.rb +17 -17
- data/test/unit/package_item_test.rb +237 -0
- data/test/unit/package_test.rb +393 -58
- metadata +13 -12
data/test/unit/package_test.rb
CHANGED
@@ -1,68 +1,403 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
3
|
class PackageTest < Minitest::Test
|
4
|
-
include ActiveShipping::Test::Fixtures
|
5
|
-
|
6
|
-
GRAMS_IN_AN_OUNCE = 28.349523125
|
7
|
-
OUNCES_IN_A_GRAM = 0.0352739619495804
|
8
|
-
INCHES_IN_A_CM = 0.393700787401575
|
9
|
-
CM_IN_AN_INCH = 2.54
|
10
|
-
|
11
4
|
def setup
|
12
|
-
@
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
@
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
[:z, :min, :height, :high, :depth, :deep].each do |sym|
|
40
|
-
assert_equal 4.5, wii.inches(sym)
|
41
|
-
assert_equal 4.5, wii.in(sym)
|
42
|
-
assert_equal 4.5 * CM_IN_AN_INCH, wii.centimetres(sym)
|
43
|
-
assert_equal 4.5 * CM_IN_AN_INCH, wii.cm(sym)
|
44
|
-
end
|
45
|
-
[:pounds, :lbs, :lb].each do |sym|
|
46
|
-
assert_equal 7.5, wii.send(sym)
|
47
|
-
end
|
48
|
-
[:ounces, :oz].each do |sym|
|
49
|
-
assert_equal 120, wii.send(sym)
|
50
|
-
end
|
51
|
-
[:grams, :g].each do |sym|
|
52
|
-
assert_equal 120 * GRAMS_IN_AN_OUNCE, wii.send(sym)
|
53
|
-
end
|
54
|
-
[:kilograms, :kgs, :kg].each do |sym|
|
55
|
-
assert_equal 120 * GRAMS_IN_AN_OUNCE / 1000, wii.send(sym)
|
56
|
-
end
|
57
|
-
assert_equal 675.0, wii.inches(:volume)
|
58
|
-
assert_equal 675.0, wii.inches(:box_volume)
|
5
|
+
@weight = 100
|
6
|
+
@dimensions = [5, 6, 7]
|
7
|
+
@value = 1299
|
8
|
+
@currency = "USD"
|
9
|
+
@cylinder = false
|
10
|
+
@tube = false
|
11
|
+
@gift = false
|
12
|
+
@oversized = false
|
13
|
+
@unpackaged = false
|
14
|
+
@dim_units = :metric
|
15
|
+
@units = :metric
|
16
|
+
@weight_units = :metric
|
17
|
+
@options = {
|
18
|
+
value: @value,
|
19
|
+
currency: @currency,
|
20
|
+
cylinder: @cylinder,
|
21
|
+
tube: @tube,
|
22
|
+
gift: @gift,
|
23
|
+
oversized: @oversized,
|
24
|
+
unpackaged: @unpackaged,
|
25
|
+
dim_units: @dim_units,
|
26
|
+
units: @units,
|
27
|
+
weight_units: @weight_units,
|
28
|
+
}
|
29
|
+
|
30
|
+
@package = Package.new(@weight, @dimensions, @options)
|
31
|
+
@imperial_package = Package.new(@weight, @dimensions, @options.merge(units: :imperial, dim_units: :imperial, weight_units: :imperial))
|
59
32
|
|
60
|
-
|
61
|
-
assert_equal 26999, wii.value
|
33
|
+
@mass = ::Quantified::Mass.new(@weight, :grams)
|
62
34
|
end
|
63
35
|
|
64
36
|
def test_package_from_mass
|
65
|
-
|
66
|
-
assert_equal 10,
|
37
|
+
package = Package.new(Quantified::Mass.new(10, :pounds), [])
|
38
|
+
assert_equal 10, package.weight
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_initialize_defaults
|
42
|
+
assert_equal @value, @package.value
|
43
|
+
assert_equal @currency, @package.currency
|
44
|
+
assert_equal @cylinder, @package.cylinder?
|
45
|
+
assert_equal @tube, @package.tube?
|
46
|
+
assert_equal @oversized, @package.oversized?
|
47
|
+
assert_equal @unpackaged, @package.unpackaged?
|
48
|
+
assert_equal @gift, @package.gift?
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_currency_cents
|
52
|
+
@package = Package.new(@weight, @dimensions, value: money)
|
53
|
+
assert_equal @currency, @package.currency
|
54
|
+
assert_equal @value, @package.value
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_initialize_sorted_dimensions
|
58
|
+
@package = Package.new(@weight, [9, 8, 7], @options)
|
59
|
+
|
60
|
+
assert_equal [7, 8, 9], @package.centimetres
|
61
|
+
end
|
62
|
+
|
63
|
+
def test_initialize_blank_dimensions
|
64
|
+
@package = Package.new(@weight, [], @options)
|
65
|
+
|
66
|
+
assert_equal [0, 0, 0], @package.centimetres
|
67
|
+
end
|
68
|
+
|
69
|
+
def test_initialize_increases_dimension_size_to_three
|
70
|
+
@package = Package.new(@weight, [2], @options)
|
71
|
+
|
72
|
+
assert_equal [2, 2, 2], @package.centimetres
|
73
|
+
end
|
74
|
+
|
75
|
+
def test_initialize_default_units
|
76
|
+
assert_equal @dimensions, @package.centimetres
|
77
|
+
assert_equal @weight, @package.grams
|
78
|
+
end
|
79
|
+
|
80
|
+
def test_initialize_units
|
81
|
+
assert_equal @dimensions, @imperial_package.inches
|
82
|
+
end
|
83
|
+
|
84
|
+
def test_initialize_weight_units
|
85
|
+
@package = Package.new(@weight, @dimensions, @options.merge(weight_units: :imperial))
|
86
|
+
|
87
|
+
assert_equal @weight, @package.ounces
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_unpackaged
|
91
|
+
assert_predicate Package.new(@weight, @dimensions, unpackaged: true), :unpackaged?
|
92
|
+
refute_predicate Package.new(@weight, @dimensions, unpackaged: false), :unpackaged?
|
93
|
+
end
|
94
|
+
|
95
|
+
def test_oversized
|
96
|
+
assert_predicate Package.new(@weight, @dimensions, oversized: true), :oversized?
|
97
|
+
refute_predicate Package.new(@weight, @dimensions, oversized: false), :oversized?
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_gift
|
101
|
+
assert_predicate Package.new(@weight, @dimensions, gift: true), :gift?
|
102
|
+
refute_predicate Package.new(@weight, @dimensions, gift: false), :gift?
|
103
|
+
end
|
104
|
+
|
105
|
+
def test_cylinder_tube
|
106
|
+
@package = Package.new(@weight, @dimensions, cylinder: false, tube: false)
|
107
|
+
refute_predicate @package, :cylinder?
|
108
|
+
refute_predicate @package, :tube?
|
109
|
+
|
110
|
+
@package = Package.new(@weight, @dimensions, cylinder: true, tube: false)
|
111
|
+
assert_predicate @package, :cylinder?
|
112
|
+
assert_predicate @package, :tube?
|
113
|
+
|
114
|
+
@package = Package.new(@weight, @dimensions, cylinder: false, tube: true)
|
115
|
+
assert_predicate @package, :cylinder?
|
116
|
+
assert_predicate @package, :tube?
|
117
|
+
|
118
|
+
@package = Package.new(@weight, @dimensions, cylinder: true, tube: true)
|
119
|
+
assert_predicate @package, :cylinder?
|
120
|
+
assert_predicate @package, :tube?
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_inches_number_index
|
124
|
+
assert_equal @dimensions[0], @imperial_package.inches(0)
|
125
|
+
assert_equal @dimensions[1], @imperial_package.inches(1)
|
126
|
+
assert_equal @dimensions[2], @imperial_package.inches(2)
|
127
|
+
assert_nil @imperial_package.inches(3)
|
128
|
+
end
|
129
|
+
|
130
|
+
def test_inches_x
|
131
|
+
assert_equal @dimensions[2], @imperial_package.inches(:x)
|
132
|
+
assert_equal @dimensions[2], @imperial_package.inches(:max)
|
133
|
+
assert_equal @dimensions[2], @imperial_package.inches(:length)
|
134
|
+
assert_equal @dimensions[2], @imperial_package.inches(:long)
|
135
|
+
end
|
136
|
+
|
137
|
+
def test_inches_y
|
138
|
+
assert_equal @dimensions[1], @imperial_package.inches(:y)
|
139
|
+
assert_equal @dimensions[1], @imperial_package.inches(:mid)
|
140
|
+
assert_equal @dimensions[1], @imperial_package.inches(:width)
|
141
|
+
assert_equal @dimensions[1], @imperial_package.inches(:wide)
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_inches_z
|
145
|
+
assert_equal @dimensions[0], @imperial_package.inches(:z)
|
146
|
+
assert_equal @dimensions[0], @imperial_package.inches(:min)
|
147
|
+
assert_equal @dimensions[0], @imperial_package.inches(:height)
|
148
|
+
assert_equal @dimensions[0], @imperial_package.inches(:depth)
|
149
|
+
assert_equal @dimensions[0], @imperial_package.inches(:high)
|
150
|
+
assert_equal @dimensions[0], @imperial_package.inches(:deep)
|
151
|
+
end
|
152
|
+
|
153
|
+
def test_inches_girth_cylinder
|
154
|
+
@imperial_package = Package.new(@weight, @dimensions, @options.merge(cylinder: true, units: :imperial, dim_units: :imperial))
|
155
|
+
|
156
|
+
assert_predicate @imperial_package, :cylinder?
|
157
|
+
assert_in_delta 17.2, @imperial_package.inches(:girth), 1
|
158
|
+
assert_in_delta 17.2, @imperial_package.inches(:around), 1
|
159
|
+
assert_in_delta 17.2, @imperial_package.inches(:circumference), 1
|
160
|
+
|
161
|
+
end
|
162
|
+
|
163
|
+
def test_inches_girth
|
164
|
+
refute_predicate @imperial_package, :cylinder?
|
165
|
+
assert_in_delta 22, @imperial_package.inches(:girth), 1
|
166
|
+
assert_in_delta 22, @imperial_package.inches(:around), 1
|
167
|
+
assert_in_delta 22, @imperial_package.inches(:circumference), 1
|
168
|
+
end
|
169
|
+
|
170
|
+
def test_inches_volume_cylinder
|
171
|
+
@imperial_package = Package.new(@weight, @dimensions, @options.merge(cylinder: true, units: :imperial, dim_units: :imperial))
|
172
|
+
|
173
|
+
assert_predicate @imperial_package, :cylinder?
|
174
|
+
assert_in_delta 522.4, @imperial_package.inches(:volume), 1
|
175
|
+
end
|
176
|
+
|
177
|
+
def test_inches_volume
|
178
|
+
refute_predicate @imperial_package, :cylinder?
|
179
|
+
assert_equal 210, @imperial_package.inches(:volume)
|
180
|
+
end
|
181
|
+
|
182
|
+
def test_inches_box_volume
|
183
|
+
assert_equal 210, @imperial_package.inches(:box_volume)
|
184
|
+
end
|
185
|
+
|
186
|
+
def test_inches_unknown
|
187
|
+
assert_nil @imperial_package.inches(:unknown)
|
188
|
+
end
|
189
|
+
|
190
|
+
def test_inches_alias_in
|
191
|
+
assert_equal @dimensions, @imperial_package.inches
|
192
|
+
assert_equal @dimensions, @imperial_package.in
|
193
|
+
end
|
194
|
+
|
195
|
+
def test_centimetres_number_index
|
196
|
+
assert_equal @dimensions[0], @package.centimetres(0)
|
197
|
+
assert_equal @dimensions[1], @package.centimetres(1)
|
198
|
+
assert_equal @dimensions[2], @package.centimetres(2)
|
199
|
+
assert_nil @package.centimetres(3)
|
200
|
+
end
|
201
|
+
|
202
|
+
def test_centimetres_x
|
203
|
+
assert_equal @dimensions[2], @package.centimetres(:x)
|
204
|
+
assert_equal @dimensions[2], @package.centimetres(:max)
|
205
|
+
assert_equal @dimensions[2], @package.centimetres(:length)
|
206
|
+
assert_equal @dimensions[2], @package.centimetres(:long)
|
207
|
+
end
|
208
|
+
|
209
|
+
def test_centimetres_y
|
210
|
+
assert_equal @dimensions[1], @package.centimetres(:y)
|
211
|
+
assert_equal @dimensions[1], @package.centimetres(:mid)
|
212
|
+
assert_equal @dimensions[1], @package.centimetres(:width)
|
213
|
+
assert_equal @dimensions[1], @package.centimetres(:wide)
|
214
|
+
end
|
215
|
+
|
216
|
+
def test_centimetres_z
|
217
|
+
assert_equal @dimensions[0], @package.centimetres(:z)
|
218
|
+
assert_equal @dimensions[0], @package.centimetres(:min)
|
219
|
+
assert_equal @dimensions[0], @package.centimetres(:height)
|
220
|
+
assert_equal @dimensions[0], @package.centimetres(:depth)
|
221
|
+
assert_equal @dimensions[0], @package.centimetres(:high)
|
222
|
+
assert_equal @dimensions[0], @package.centimetres(:deep)
|
223
|
+
end
|
224
|
+
|
225
|
+
def test_centimetres_girth_cylinder
|
226
|
+
@package = Package.new(@weight, @dimensions, @options.merge(cylinder: true, units: :metric, dim_units: :metric))
|
227
|
+
|
228
|
+
assert_predicate @package, :cylinder?
|
229
|
+
assert_in_delta 17.2, @package.centimetres(:girth), 1
|
230
|
+
assert_in_delta 17.2, @package.centimetres(:around), 1
|
231
|
+
assert_in_delta 17.2, @package.centimetres(:circumference), 1
|
232
|
+
|
233
|
+
end
|
234
|
+
|
235
|
+
def test_centimetres_girth
|
236
|
+
refute_predicate @package, :cylinder?
|
237
|
+
assert_in_delta 22, @package.centimetres(:girth), 1
|
238
|
+
assert_in_delta 22, @package.centimetres(:around), 1
|
239
|
+
assert_in_delta 22, @package.centimetres(:circumference), 1
|
240
|
+
end
|
241
|
+
|
242
|
+
def test_centimetres_volume_cylinder
|
243
|
+
@package = Package.new(@weight, @dimensions, @options.merge(cylinder: true, units: :metric, dim_units: :metric))
|
244
|
+
|
245
|
+
assert_predicate @package, :cylinder?
|
246
|
+
assert_in_delta 522.4, @package.centimetres(:volume), 1
|
247
|
+
end
|
248
|
+
|
249
|
+
def test_centimetres_volume
|
250
|
+
refute_predicate @package, :cylinder?
|
251
|
+
assert_equal 210, @package.centimetres(:volume)
|
252
|
+
end
|
253
|
+
|
254
|
+
def test_centimetres_box_volume
|
255
|
+
assert_equal 210, @package.centimetres(:box_volume)
|
256
|
+
end
|
257
|
+
|
258
|
+
def test_centimetres_unknown
|
259
|
+
assert_nil @package.centimetres(:unknown)
|
260
|
+
end
|
261
|
+
|
262
|
+
def test_centimetres_alias_cm
|
263
|
+
assert_equal @dimensions, @package.centimetres
|
264
|
+
assert_equal @dimensions, @package.cm
|
265
|
+
end
|
266
|
+
|
267
|
+
def test_weight
|
268
|
+
assert_equal @mass, @package.weight
|
269
|
+
assert_instance_of ::Quantified::Mass, @package.weight
|
270
|
+
end
|
271
|
+
|
272
|
+
def test_weight_actual
|
273
|
+
assert_equal @mass, @package.weight(type: :actual)
|
274
|
+
assert_instance_of ::Quantified::Mass, @package.weight(type: :actual)
|
275
|
+
end
|
276
|
+
|
277
|
+
def test_weight_volumetric
|
278
|
+
assert_equal ::Quantified::Mass.new(35, :grams), @package.weight(type: :volumetric)
|
279
|
+
end
|
280
|
+
|
281
|
+
def test_weight_dimensional
|
282
|
+
assert_equal ::Quantified::Mass.new(35, :grams), @package.weight(type: :dimensional)
|
283
|
+
end
|
284
|
+
|
285
|
+
def test_weight_billable_max_weight_and_volumetric
|
286
|
+
assert_equal ::Quantified::Mass.new(100, :grams), @package.weight(type: :billable)
|
287
|
+
|
288
|
+
@package = Package.new(500, [1, 1, 1], @options)
|
289
|
+
assert_equal ::Quantified::Mass.new(500, :grams), @package.weight(type: :billable)
|
290
|
+
end
|
291
|
+
|
292
|
+
def test_grams_value
|
293
|
+
assert_equal 100, @package.grams
|
294
|
+
end
|
295
|
+
|
296
|
+
def test_grams_accepts_options_with_type
|
297
|
+
assert_in_delta 35, @package.grams(type: :volumetric), 1
|
298
|
+
end
|
299
|
+
|
300
|
+
def test_grams_converts
|
301
|
+
@package = Package.new(@weight, @dimensions, weight_units: :imperial)
|
302
|
+
|
303
|
+
assert_in_delta 2834.9, @package.grams, 1
|
304
|
+
end
|
305
|
+
|
306
|
+
def test_grams_alias_g
|
307
|
+
assert_equal @package.grams, @package.g
|
308
|
+
end
|
309
|
+
|
310
|
+
def test_ounces_value
|
311
|
+
assert_equal 100, @imperial_package.ounces
|
312
|
+
end
|
313
|
+
|
314
|
+
def test_ounces_accepts_options_with_type
|
315
|
+
assert_in_delta 20.2, @imperial_package.ounces(type: :volumetric), 1
|
316
|
+
end
|
317
|
+
|
318
|
+
def test_ounces_converts
|
319
|
+
assert_in_delta 3.5, @package.ounces, 1
|
320
|
+
end
|
321
|
+
|
322
|
+
def test_ounces_alias_oz
|
323
|
+
assert_equal @imperial_package.ounces, @imperial_package.oz
|
324
|
+
end
|
325
|
+
|
326
|
+
def test_pounds_value
|
327
|
+
assert_equal 6.25, @imperial_package.pounds
|
328
|
+
end
|
329
|
+
|
330
|
+
def test_pounds_accepts_options_with_type
|
331
|
+
assert_in_delta 0.07, @package.pounds(type: :volumetric), 0.01
|
332
|
+
end
|
333
|
+
|
334
|
+
def test_pounds_converts
|
335
|
+
assert_in_delta 0.22, @package.pounds, 0.01
|
336
|
+
end
|
337
|
+
|
338
|
+
def test_pounds_alias_lb
|
339
|
+
assert_equal @package.pounds, @package.lb
|
340
|
+
end
|
341
|
+
|
342
|
+
def test_pounds_alias_lbs
|
343
|
+
assert_equal @package.pounds, @package.lbs
|
344
|
+
end
|
345
|
+
|
346
|
+
def test_kilograms_value
|
347
|
+
assert_equal 0.1, @package.kilograms
|
348
|
+
end
|
349
|
+
|
350
|
+
def test_kilograms_accepts_options_with_type
|
351
|
+
assert_equal 0.035, @package.kilograms(type: :volumetric)
|
352
|
+
end
|
353
|
+
|
354
|
+
def test_kilograms_converts
|
355
|
+
assert_in_delta 2.8, @imperial_package.kilograms, 1
|
356
|
+
end
|
357
|
+
|
358
|
+
def test_kilograms_alias_kg
|
359
|
+
assert_equal 0.1, @package.kg
|
360
|
+
end
|
361
|
+
|
362
|
+
def test_kilograms_alias_kgs
|
363
|
+
assert_equal @package.kilograms, @package.kgs
|
364
|
+
end
|
365
|
+
|
366
|
+
def test_cents_from_nil
|
367
|
+
assert_nil Package.cents_from(nil)
|
368
|
+
end
|
369
|
+
|
370
|
+
def test_cents_from_cents
|
371
|
+
assert_equal @value, Package.cents_from(money)
|
372
|
+
end
|
373
|
+
|
374
|
+
def test_cents_from_float
|
375
|
+
assert_equal 120, Package.cents_from(1.2)
|
376
|
+
end
|
377
|
+
|
378
|
+
def test_cents_from_string
|
379
|
+
assert_equal 120, Package.cents_from("1.20")
|
380
|
+
end
|
381
|
+
|
382
|
+
def test_cents_from_int
|
383
|
+
assert_equal 12, Package.cents_from(12)
|
384
|
+
end
|
385
|
+
|
386
|
+
def test_cents_from_nonsense
|
387
|
+
exception = assert_raises NoMethodError do
|
388
|
+
Package.cents_from(Object.new)
|
389
|
+
end
|
390
|
+
assert_match /undefined method `to_i'/, exception.message
|
391
|
+
end
|
392
|
+
|
393
|
+
private
|
394
|
+
|
395
|
+
def money
|
396
|
+
@money ||= begin
|
397
|
+
value = Class.new { attr_accessor :currency, :cents }.new
|
398
|
+
value.currency = @currency
|
399
|
+
value.cents = @value
|
400
|
+
value
|
401
|
+
end
|
67
402
|
end
|
68
403
|
end
|