Skip to content

Commit c1e0cb6

Browse files
committed
Properly handle checksums of '0' in usps mod10.
Current implementation returns 10, which does not equal 0.
1 parent b1901cd commit c1e0cb6

2 files changed

Lines changed: 5 additions & 1 deletion

File tree

lib/active_model/validations/tracking_number_validator.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def uss39?(value)
4444

4545
MOD10_WEIGHTS = [3,1]
4646
def usps_mod10(chars)
47-
10 - weighted_sum(chars.reverse, MOD10_WEIGHTS) % 10
47+
(10 - weighted_sum(chars.reverse, MOD10_WEIGHTS) % 10) % 10
4848
end
4949

5050
MOD11_WEIGHTS = [8,6,4,2,3,5,9,7]

test/validations/tracking_number_test.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ def assert_invalid_tracking_number(carrier_opts, tracking_number, &block)
6868
assert_valid_tracking_number({:carrier => :usps}, '71123456789123456787')
6969
end
7070

71+
it '20 character USS128 tracking number with valid MOD10 check digit ending in 0' do
72+
assert_valid_tracking_number({:carrier => :usps}, '03110240000115809160')
73+
end
74+
7175
it '22 character USS128 tracking number with valid MOD10 check digit' do
7276
assert_valid_tracking_number({:carrier => :usps}, '9171969010756003077385')
7377
end

0 commit comments

Comments
 (0)