Skip to content

Commit e1244c9

Browse files
authored
Allow commas in numeric string values (#29)
1 parent d133a43 commit e1244c9

File tree

3 files changed

+97
-3
lines changed

3 files changed

+97
-3
lines changed

lib/mini_defender/rules/numeric.rb

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,27 @@ def self.signature
66
end
77

88
def coerce(value)
9-
value.is_a?(Numeric) ? value : Float(value.to_s)
9+
if value.is_a?(Numeric)
10+
return value
11+
end
12+
13+
if value.is_a?(String)
14+
value = value.gsub(',', '')
15+
end
16+
17+
Float(value.to_s)
1018
end
1119

1220
def passes?(attribute, value, validator)
13-
value.is_a?(Numeric) || Float(value.to_s) rescue false
21+
if value.is_a?(Numeric)
22+
return true
23+
end
24+
25+
if value.is_a?(String)
26+
value = value.gsub(',', '')
27+
end
28+
29+
Float(value.to_s) rescue false
1430
end
1531

1632
def message(attribute, value, validator)

lib/mini_defender/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# frozen_string_literal: true
22

33
module MiniDefender
4-
VERSION = "0.6.8"
4+
VERSION = "0.6.9"
55
end

test/rules/numeric_test.rb

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,83 @@
33
require 'test_helper'
44

55
class NumericTest < Minitest::Test
6+
def setup
7+
@rule = MiniDefender::Rules::Numeric.new
8+
end
69

10+
def test_passes_with_integer
11+
assert @rule.passes?(nil, 25, true)
12+
end
13+
14+
def test_passes_with_float
15+
assert @rule.passes?(nil, 19.99, true)
16+
end
17+
18+
def test_passes_with_zero
19+
assert @rule.passes?(nil, 0, true)
20+
end
21+
22+
def test_passes_with_negative_number
23+
assert @rule.passes?(nil, -10, true)
24+
end
25+
26+
def test_passes_with_numeric_string
27+
assert @rule.passes?(nil, "42", true)
28+
end
29+
30+
def test_passes_with_float_string
31+
assert @rule.passes?(nil, "72.5", true)
32+
end
33+
34+
def test_passes_with_string_with_commas
35+
assert @rule.passes?(nil, "50,000", true)
36+
end
37+
38+
def test_fails_with_non_numeric_string
39+
refute @rule.passes?(nil, "John", true)
40+
end
41+
42+
def test_fails_with_empty_string
43+
refute @rule.passes?(nil, "", true)
44+
end
45+
46+
def test_fails_with_nil
47+
refute @rule.passes?(nil, nil, true)
48+
end
49+
50+
def test_fails_with_boolean
51+
refute @rule.passes?(nil, true, true)
52+
end
53+
54+
def test_fails_with_array
55+
refute @rule.passes?(nil, [1, 2, 3], true)
56+
end
57+
58+
def test_fails_with_hash
59+
refute @rule.passes?(nil, { key: "value" }, true)
60+
end
61+
62+
def test_coerce_with_integer
63+
assert_equal 42, @rule.coerce(42)
64+
end
65+
66+
def test_coerce_with_float
67+
assert_equal 3.14, @rule.coerce(3.14)
68+
end
69+
70+
def test_coerce_with_numeric_string
71+
assert_equal 42.0, @rule.coerce("42")
72+
end
73+
74+
def test_coerce_with_string_with_commas
75+
assert_equal 1000.0, @rule.coerce("1,000")
76+
end
77+
78+
def test_coerce_raises_error_with_non_numeric_string
79+
assert_raises(ArgumentError) { @rule.coerce("abc") }
80+
end
81+
82+
def test_message
83+
assert_equal "The field must contain a numeric value.", @rule.message(nil, "abc", true)
84+
end
785
end

0 commit comments

Comments
 (0)