input_sanitizer 0.2.2 → 0.3.33

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.
Files changed (47) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +2 -0
  3. data/.travis.yml +2 -0
  4. data/CHANGELOG +92 -0
  5. data/LICENSE +201 -22
  6. data/README.md +7 -0
  7. data/input_sanitizer.gemspec +15 -5
  8. data/lib/input_sanitizer/errors.rb +142 -0
  9. data/lib/input_sanitizer/extended_converters/comma_joined_integers_converter.rb +15 -0
  10. data/lib/input_sanitizer/extended_converters/comma_joined_strings_converter.rb +15 -0
  11. data/lib/input_sanitizer/extended_converters/positive_integer_converter.rb +12 -0
  12. data/lib/input_sanitizer/extended_converters/specific_values_converter.rb +19 -0
  13. data/lib/input_sanitizer/extended_converters.rb +5 -55
  14. data/lib/input_sanitizer/restricted_hash.rb +49 -8
  15. data/lib/input_sanitizer/v1/clean_field.rb +38 -0
  16. data/lib/input_sanitizer/{default_converters.rb → v1/default_converters.rb} +8 -11
  17. data/lib/input_sanitizer/v1/sanitizer.rb +163 -0
  18. data/lib/input_sanitizer/v1.rb +22 -0
  19. data/lib/input_sanitizer/v2/clean_field.rb +36 -0
  20. data/lib/input_sanitizer/v2/clean_payload_collection_field.rb +41 -0
  21. data/lib/input_sanitizer/v2/clean_query_collection_field.rb +40 -0
  22. data/lib/input_sanitizer/v2/error_collection.rb +49 -0
  23. data/lib/input_sanitizer/v2/nested_sanitizer_factory.rb +19 -0
  24. data/lib/input_sanitizer/v2/payload_sanitizer.rb +130 -0
  25. data/lib/input_sanitizer/v2/payload_transform.rb +42 -0
  26. data/lib/input_sanitizer/v2/query_sanitizer.rb +33 -0
  27. data/lib/input_sanitizer/v2/types.rb +213 -0
  28. data/lib/input_sanitizer/v2.rb +13 -0
  29. data/lib/input_sanitizer/version.rb +1 -1
  30. data/lib/input_sanitizer.rb +5 -2
  31. data/spec/extended_converters/comma_joined_integers_converter_spec.rb +18 -0
  32. data/spec/extended_converters/comma_joined_strings_converter_spec.rb +18 -0
  33. data/spec/extended_converters/positive_integer_converter_spec.rb +18 -0
  34. data/spec/extended_converters/specific_values_converter_spec.rb +27 -0
  35. data/spec/restricted_hash_spec.rb +37 -7
  36. data/spec/sanitizer_spec.rb +32 -22
  37. data/spec/spec_helper.rb +3 -1
  38. data/spec/{default_converters_spec.rb → v1/default_converters_spec.rb} +27 -9
  39. data/spec/v2/converters_spec.rb +174 -0
  40. data/spec/v2/payload_sanitizer_spec.rb +460 -0
  41. data/spec/v2/payload_transform_spec.rb +98 -0
  42. data/spec/v2/query_sanitizer_spec.rb +300 -0
  43. data/v2.md +52 -0
  44. metadata +86 -30
  45. data/Gemfile.lock +0 -44
  46. data/lib/input_sanitizer/sanitizer.rb +0 -179
  47. data/spec/extended_converters_spec.rb +0 -78
@@ -0,0 +1,13 @@
1
+ module InputSanitizer::V2
2
+ end
3
+
4
+ dir = File.dirname(__FILE__)
5
+ require File.join(dir, 'v2/types')
6
+ require File.join(dir, 'v2/clean_payload_collection_field')
7
+ require File.join(dir, 'v2/clean_query_collection_field')
8
+ require File.join(dir, 'v2/clean_field')
9
+ require File.join(dir, 'v2/nested_sanitizer_factory')
10
+ require File.join(dir, 'v2/error_collection')
11
+ require File.join(dir, 'v2/payload_sanitizer')
12
+ require File.join(dir, 'v2/query_sanitizer')
13
+ require File.join(dir, 'v2/payload_transform')
@@ -1,3 +1,3 @@
1
1
  module InputSanitizer
2
- VERSION = "0.2.2"
2
+ VERSION = "0.3.33"
3
3
  end
@@ -1,5 +1,8 @@
1
1
  module InputSanitizer
2
2
  end
3
3
 
4
- require "input_sanitizer/version"
5
- require 'input_sanitizer/sanitizer'
4
+ require 'method_struct'
5
+
6
+ require 'input_sanitizer/version'
7
+ require 'input_sanitizer/v1'
8
+ require 'input_sanitizer/v2'
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+ require 'input_sanitizer/extended_converters/comma_joined_integers_converter'
3
+
4
+ describe InputSanitizer::CommaJoinedIntegersConverter do
5
+ let(:converter) { described_class.new }
6
+
7
+ it "parses to array of ids" do
8
+ converter.call("1,2,3,5").should eq([1, 2, 3, 5])
9
+ end
10
+
11
+ it "converts to array if given an integer" do
12
+ converter.call(7).should eq([7])
13
+ end
14
+
15
+ it "raises on invalid character" do
16
+ lambda { converter.call(":") }.should raise_error(InputSanitizer::ConversionError)
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+ require 'input_sanitizer/extended_converters/comma_joined_strings_converter'
3
+
4
+ describe InputSanitizer::CommaJoinedStringsConverter do
5
+ let(:converter) { described_class.new }
6
+
7
+ it "parses to array of ids" do
8
+ converter.call("input,Sanitizer,ROCKS").should eq(["input", "Sanitizer", "ROCKS"])
9
+ end
10
+
11
+ it "allows underscores" do
12
+ converter.call("input_sanitizer,rocks").should eq(["input_sanitizer", "rocks"])
13
+ end
14
+
15
+ it "raises on invalid character" do
16
+ lambda { converter.call(":") }.should raise_error(InputSanitizer::ConversionError)
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+ require 'input_sanitizer/extended_converters/positive_integer_converter'
3
+
4
+ describe InputSanitizer::PositiveIntegerConverter do
5
+ let(:converter) { described_class.new }
6
+
7
+ it "casts string to integer" do
8
+ converter.call("3").should == 3
9
+ end
10
+
11
+ it "raises error if integer less than zero" do
12
+ lambda { converter.call("-3") }.should raise_error(InputSanitizer::ConversionError)
13
+ end
14
+
15
+ it "raises error if integer equals zero" do
16
+ lambda { converter.call("0") }.should raise_error(InputSanitizer::ConversionError)
17
+ end
18
+ end
@@ -0,0 +1,27 @@
1
+ require 'spec_helper'
2
+ require 'input_sanitizer/extended_converters/specific_values_converter'
3
+
4
+ describe InputSanitizer::SpecificValuesConverter do
5
+ let(:converter) { described_class.new(values) }
6
+ let(:values) { [:a, :b] }
7
+
8
+ it "converts valid value to symbol" do
9
+ converter.call("b").should eq(:b)
10
+ end
11
+
12
+ it "raises on invalid value" do
13
+ lambda { converter.call("c") }.should raise_error(InputSanitizer::ConversionError)
14
+ end
15
+
16
+ it "raises on nil value" do
17
+ lambda { converter.call(nil) }.should raise_error(InputSanitizer::ConversionError)
18
+ end
19
+
20
+ context "when specific values are strings" do
21
+ let(:values) { ["a", "b"] }
22
+
23
+ it "keeps given value as string" do
24
+ converter.call("a").should eq("a")
25
+ end
26
+ end
27
+ end
@@ -1,19 +1,49 @@
1
- require "spec_helper"
1
+ require 'spec_helper'
2
2
 
3
3
  describe InputSanitizer::RestrictedHash do
4
- let(:hash) { InputSanitizer::RestrictedHash.new([:a, :b]) }
5
- subject { hash }
4
+ let(:hash) { InputSanitizer::RestrictedHash.new([:a]) }
6
5
 
7
- it "does not allow bad keys" do
8
- lambda{hash[:c]}.should raise_error(InputSanitizer::KeyNotAllowedError)
6
+ it 'does not allow bad keys' do
7
+ lambda{ hash[:b] }.should raise_error(InputSanitizer::KeyNotAllowedError)
9
8
  end
10
9
 
11
- it "does allow correct keys" do
10
+ it 'does allow correct keys' do
12
11
  hash[:a].should be_nil
13
12
  end
14
13
 
15
- it "returns value for correct key" do
14
+ it 'returns value for correct key' do
16
15
  hash[:a] = 'stuff'
17
16
  hash[:a].should == 'stuff'
18
17
  end
18
+
19
+ it 'allows to set value for a new key' do
20
+ hash[:b] = 'other stuff'
21
+ hash[:b].should == 'other stuff'
22
+ hash.key_allowed?(:b).should be_truthy
23
+ end
24
+
25
+ it 'adds new allowed keys after `transform_keys` is done' do
26
+ hash[:a] = 'stuff'
27
+ hash.transform_keys! { |key| key.to_s }
28
+ hash['a'].should == 'stuff'
29
+ hash.key_allowed?('a').should be_truthy
30
+ end
31
+
32
+ it 'removes previous allowed keys after `transform_keys` is done' do
33
+ hash[:a] = 'stuff'
34
+ hash.transform_keys! { |key| key.to_s }
35
+ lambda{ hash[:a] }.should raise_error(InputSanitizer::KeyNotAllowedError)
36
+ end
37
+
38
+ it 'updates allowed keys on merge!' do
39
+ merge_hash = { merged: '1' }
40
+ hash.merge!(merge_hash)
41
+ hash.key_allowed?(:merged).should be_truthy
42
+ end
43
+
44
+ it 'updates allowed keys on merge' do
45
+ merge_hash = { merged: '1' }
46
+ new_hash = hash.merge(some_key: merge_hash)
47
+ new_hash.key_allowed?(:some_key).should be_truthy
48
+ end
19
49
  end
@@ -73,6 +73,12 @@ describe InputSanitizer::Sanitizer do
73
73
  cleaned.should_not have_key(:d)
74
74
  end
75
75
 
76
+ it "does not include ommited fields" do
77
+ @params = { "x" => 1, "z" => 3 }
78
+
79
+ cleaned.should_not have_key(:y)
80
+ end
81
+
76
82
  it "freezes cleaned hash" do
77
83
  @params = {}
78
84
 
@@ -217,6 +223,23 @@ describe InputSanitizer::Sanitizer do
217
223
  ]
218
224
  cleaned[:stuff].should eq(expected)
219
225
  end
226
+
227
+ it "propagates errors" do
228
+ nested = [ { :nested => { :foo => "INVALID" } } ]
229
+ @params = { :stuff => nested }
230
+
231
+ sanitizer.should_not be_valid
232
+ end
233
+
234
+ it "returns an error when given a nil for a nested value" do
235
+ @params = { :stuff => nil }
236
+ sanitizer.should_not be_valid
237
+ end
238
+
239
+ it "returns an error when given a string for a nested value" do
240
+ @params = { :stuff => 'nope' }
241
+ sanitizer.should_not be_valid
242
+ end
220
243
  end
221
244
 
222
245
  describe ".converters" do
@@ -224,43 +247,25 @@ describe InputSanitizer::Sanitizer do
224
247
 
225
248
  it "includes :integer type" do
226
249
  sanitizer.converters.should have_key(:integer)
227
- sanitizer.converters[:integer].should be_a(InputSanitizer::IntegerConverter)
250
+ sanitizer.converters[:integer].should be_a(InputSanitizer::V1::IntegerConverter)
228
251
  end
229
252
 
230
253
  it "includes :string type" do
231
254
  sanitizer.converters.should have_key(:string)
232
- sanitizer.converters[:string].should be_a(InputSanitizer::StringConverter)
255
+ sanitizer.converters[:string].should be_a(InputSanitizer::V1::StringConverter)
233
256
  end
234
257
 
235
258
  it "includes :date type" do
236
259
  sanitizer.converters.should have_key(:date)
237
- sanitizer.converters[:date].should be_a(InputSanitizer::DateConverter)
260
+ sanitizer.converters[:date].should be_a(InputSanitizer::V1::DateConverter)
238
261
  end
239
262
 
240
263
  it "includes :boolean type" do
241
264
  sanitizer.converters.should have_key(:boolean)
242
- sanitizer.converters[:boolean].should be_a(InputSanitizer::BooleanConverter)
265
+ sanitizer.converters[:boolean].should be_a(InputSanitizer::V1::BooleanConverter)
243
266
  end
244
267
  end
245
268
 
246
- describe '.extract_options' do
247
-
248
- it "extracts hash from array if is last" do
249
- options = { :a => 1}
250
- array = [1,2, options]
251
- BasicSanitizer.extract_options(array).should == options
252
- array.should == [1,2, options]
253
- end
254
-
255
- it "does not extract the last element if not a hash and returns default empty hash" do
256
- array = [1,2]
257
- BasicSanitizer.extract_options(array).should_not == 2
258
- BasicSanitizer.extract_options(array).should == {}
259
- array.should == [1,2]
260
- end
261
-
262
- end
263
-
264
269
  describe '.extract_options!' do
265
270
 
266
271
  it "extracts hash from array if is last" do
@@ -327,4 +332,9 @@ describe InputSanitizer::Sanitizer do
327
332
  error[:field].should == :c1
328
333
  end
329
334
  end
335
+
336
+ it "is valid when given extra params" do
337
+ @params = { :extra => 'test' }
338
+ sanitizer.should be_valid
339
+ end
330
340
  end
data/spec/spec_helper.rb CHANGED
@@ -1,7 +1,9 @@
1
1
  require 'bundler'
2
2
  Bundler.setup(:test)
3
3
 
4
- unless ENV['CI']
4
+ skip_coverage = ENV['CI'] || RUBY_VERSION =~ /^1\.8/
5
+
6
+ unless skip_coverage
5
7
  require 'simplecov'
6
8
  SimpleCov.start
7
9
  end
@@ -1,7 +1,7 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe InputSanitizer::IntegerConverter do
4
- let(:converter) { InputSanitizer::IntegerConverter.new }
3
+ describe InputSanitizer::V1::IntegerConverter do
4
+ let(:converter) { InputSanitizer::V1::IntegerConverter.new }
5
5
 
6
6
  it "casts string to integer" do
7
7
  converter.call("42").should == 42
@@ -16,8 +16,8 @@ describe InputSanitizer::IntegerConverter do
16
16
  end
17
17
  end
18
18
 
19
- describe InputSanitizer::DateConverter do
20
- let(:converter) { InputSanitizer::DateConverter.new }
19
+ describe InputSanitizer::V1::DateConverter do
20
+ let(:converter) { InputSanitizer::V1::DateConverter.new }
21
21
 
22
22
  it "casts dates in iso format" do
23
23
  converter.call("2012-05-15").should == Date.new(2012, 5, 15)
@@ -28,8 +28,8 @@ describe InputSanitizer::DateConverter do
28
28
  end
29
29
  end
30
30
 
31
- describe InputSanitizer::BooleanConverter do
32
- let(:converter) { InputSanitizer::BooleanConverter.new }
31
+ describe InputSanitizer::V1::BooleanConverter do
32
+ let(:converter) { InputSanitizer::V1::BooleanConverter.new }
33
33
 
34
34
  it "casts 'true' to true" do
35
35
  converter.call('true').should eq(true)
@@ -68,9 +68,8 @@ describe InputSanitizer::BooleanConverter do
68
68
  end
69
69
  end
70
70
 
71
-
72
- describe InputSanitizer::TimeConverter do
73
- let(:converter) { InputSanitizer::TimeConverter.new }
71
+ describe InputSanitizer::V1::TimeConverter do
72
+ let(:converter) { InputSanitizer::V1::TimeConverter.new }
74
73
 
75
74
  it "raises if timezone part given" do
76
75
  lambda { converter.call("2012-05-15 13:42:54 +01:00") }.should raise_error(InputSanitizer::ConversionError)
@@ -121,3 +120,22 @@ describe InputSanitizer::TimeConverter do
121
120
  lambda { converter.call({}) }.should raise_error(InputSanitizer::ConversionError)
122
121
  end
123
122
  end
123
+
124
+ describe InputSanitizer::V1::AllowNil do
125
+ it "passes blanks" do
126
+ lambda { |_| 1 }.extend(InputSanitizer::V1::AllowNil).call("").should be_nil
127
+ end
128
+
129
+ it "passes things the extended sanitizer passes" do
130
+ lambda { |_| :something }.extend(InputSanitizer::V1::AllowNil).call(:stuff).
131
+ should eq(:something)
132
+ end
133
+
134
+ it "raises error if the extended sanitizer raises error" do
135
+ action = lambda do
136
+ lambda { |_| raise "Some error" }.extend(InputSanitizer::V1::AllowNil).call(:stuff)
137
+ end
138
+
139
+ action.should raise_error
140
+ end
141
+ end
@@ -0,0 +1,174 @@
1
+ require 'spec_helper'
2
+
3
+ # OPTIONS
4
+ # :allow_nil (default true)
5
+ # :allow_blank (default true)
6
+ # :require (default false, requires given key in params, and additionally sets :allow_nil and :allow_blank to false)
7
+
8
+ # | allow_nil | allow_blank
9
+ # __________|___________|_____________
10
+ # string | YES | YES
11
+ # url | YES | YES
12
+ # datetime | YES | YES
13
+ # integer | YES | NO
14
+ # boolean | NO | NO
15
+ # ------------------------------------
16
+
17
+ # [type, value, option] => valid? # if valid? == false then check for ValueMissing error
18
+
19
+ test_cases = {
20
+ [InputSanitizer::V2::Types::StringCheck, { :allow_nil => false }, nil] => false,
21
+ [InputSanitizer::V2::Types::StringCheck, { :allow_nil => false }, ""] => true,
22
+ [InputSanitizer::V2::Types::StringCheck, { :allow_nil => false }, "zz"] => true,
23
+ [InputSanitizer::V2::Types::StringCheck, { :allow_blank => false }, nil] => false,
24
+ [InputSanitizer::V2::Types::StringCheck, { :allow_blank => false }, ""] => false,
25
+ [InputSanitizer::V2::Types::StringCheck, { :allow_blank => false }, "zz"] => true,
26
+ [InputSanitizer::V2::Types::StringCheck, { :required => true }, nil] => false,
27
+ [InputSanitizer::V2::Types::StringCheck, { :required => true }, ""] => false,
28
+ [InputSanitizer::V2::Types::StringCheck, { :required => true }, "zz"] => true,
29
+ [InputSanitizer::V2::Types::StringCheck, { }, nil] => true,
30
+ [InputSanitizer::V2::Types::StringCheck, { }, ""] => true,
31
+ [InputSanitizer::V2::Types::StringCheck, { }, "zz"] => true,
32
+ [InputSanitizer::V2::Types::IntegerCheck, { :allow_nil => false }, nil] => false,
33
+ [InputSanitizer::V2::Types::IntegerCheck, { :allow_nil => false }, ""] => :invalid_type,
34
+ [InputSanitizer::V2::Types::IntegerCheck, { :allow_nil => false }, 1] => true,
35
+ [InputSanitizer::V2::Types::IntegerCheck, { :allow_blank => false }, nil] => false,
36
+ [InputSanitizer::V2::Types::IntegerCheck, { :allow_blank => false }, ""] => :invalid_type,
37
+ [InputSanitizer::V2::Types::IntegerCheck, { :allow_blank => false }, 1] => true,
38
+ [InputSanitizer::V2::Types::IntegerCheck, { :required => true }, nil] => false,
39
+ [InputSanitizer::V2::Types::IntegerCheck, { :required => true }, ""] => :invalid_type,
40
+ [InputSanitizer::V2::Types::IntegerCheck, { :required => true }, 1] => true,
41
+ [InputSanitizer::V2::Types::IntegerCheck, { }, nil] => true,
42
+ [InputSanitizer::V2::Types::IntegerCheck, { }, ""] => :invalid_type,
43
+ [InputSanitizer::V2::Types::IntegerCheck, { }, 1] => true,
44
+ [InputSanitizer::V2::Types::CoercingIntegerCheck, { :allow_nil => false }, nil] => false,
45
+ [InputSanitizer::V2::Types::CoercingIntegerCheck, { :allow_nil => false }, "null"] => false,
46
+ [InputSanitizer::V2::Types::CoercingIntegerCheck, { :allow_nil => false }, ""] => :invalid_type,
47
+ [InputSanitizer::V2::Types::CoercingIntegerCheck, { :allow_nil => false }, 1] => true,
48
+ [InputSanitizer::V2::Types::CoercingIntegerCheck, { :allow_blank => false }, nil] => false,
49
+ [InputSanitizer::V2::Types::CoercingIntegerCheck, { :allow_blank => false }, "null"] => false,
50
+ [InputSanitizer::V2::Types::CoercingIntegerCheck, { :allow_blank => false }, ""] => :invalid_type,
51
+ [InputSanitizer::V2::Types::CoercingIntegerCheck, { :allow_blank => false }, 1] => true,
52
+ [InputSanitizer::V2::Types::CoercingIntegerCheck, { :required => true }, nil] => false,
53
+ [InputSanitizer::V2::Types::CoercingIntegerCheck, { :required => true }, "null"] => false,
54
+ [InputSanitizer::V2::Types::CoercingIntegerCheck, { :required => true }, ""] => :invalid_type,
55
+ [InputSanitizer::V2::Types::CoercingIntegerCheck, { :required => true }, 1] => true,
56
+ [InputSanitizer::V2::Types::CoercingIntegerCheck, { }, nil] => true,
57
+ [InputSanitizer::V2::Types::CoercingIntegerCheck, { }, "null"] => true,
58
+ [InputSanitizer::V2::Types::CoercingIntegerCheck, { }, ""] => :invalid_type,
59
+ [InputSanitizer::V2::Types::CoercingIntegerCheck, { }, 1] => true,
60
+ [InputSanitizer::V2::Types::FloatCheck, { :allow_nil => false }, nil] => false,
61
+ [InputSanitizer::V2::Types::FloatCheck, { :allow_nil => false }, ""] => :invalid_type,
62
+ [InputSanitizer::V2::Types::FloatCheck, { :allow_nil => false }, 1] => true,
63
+ [InputSanitizer::V2::Types::FloatCheck, { :allow_nil => false }, 3.1415] => true,
64
+ [InputSanitizer::V2::Types::FloatCheck, { :allow_blank => false }, nil] => false,
65
+ [InputSanitizer::V2::Types::FloatCheck, { :allow_blank => false }, ""] => :invalid_type,
66
+ [InputSanitizer::V2::Types::FloatCheck, { :allow_blank => false }, 1] => true,
67
+ [InputSanitizer::V2::Types::FloatCheck, { :allow_blank => false }, 3.1415] => true,
68
+ [InputSanitizer::V2::Types::FloatCheck, { :required => true }, nil] => false,
69
+ [InputSanitizer::V2::Types::FloatCheck, { :required => true }, ""] => :invalid_type,
70
+ [InputSanitizer::V2::Types::FloatCheck, { :required => true }, 1] => true,
71
+ [InputSanitizer::V2::Types::FloatCheck, { :required => true }, 3.1415] => true,
72
+ [InputSanitizer::V2::Types::FloatCheck, { }, nil] => true,
73
+ [InputSanitizer::V2::Types::FloatCheck, { }, ""] => :invalid_type,
74
+ [InputSanitizer::V2::Types::FloatCheck, { }, 1] => true,
75
+ [InputSanitizer::V2::Types::FloatCheck, { }, 3.1415] => true,
76
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { :allow_nil => false }, nil] => false,
77
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { :allow_nil => false }, "null"] => false,
78
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { :allow_nil => false }, ""] => :invalid_type,
79
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { :allow_nil => false }, 1] => true,
80
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { :allow_nil => false }, 3.1415] => true,
81
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { :allow_nil => false }, "3.1415"] => true,
82
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { :allow_blank => false }, nil] => false,
83
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { :allow_blank => false }, "null"] => false,
84
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { :allow_blank => false }, ""] => :invalid_type,
85
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { :allow_blank => false }, 1] => true,
86
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { :allow_blank => false }, 3.1415] => true,
87
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { :allow_blank => false }, "3.1415"] => true,
88
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { :required => true }, nil] => false,
89
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { :required => true }, "null"] => false,
90
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { :required => true }, ""] => :invalid_type,
91
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { :required => true }, 1] => true,
92
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { :required => true }, 3.1415] => true,
93
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { :required => true }, "3.1415"] => true,
94
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { }, nil] => true,
95
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { }, "null"] => true,
96
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { }, ""] => :invalid_type,
97
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { }, 1] => true,
98
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { }, 3.1415] => true,
99
+ [InputSanitizer::V2::Types::CoercingFloatCheck, { }, "3.1415"] => true,
100
+ [InputSanitizer::V2::Types::BooleanCheck, { :allow_nil => false }, nil] => false,
101
+ [InputSanitizer::V2::Types::BooleanCheck, { :allow_nil => false }, ""] => :invalid_type,
102
+ [InputSanitizer::V2::Types::BooleanCheck, { :allow_nil => false }, true] => true,
103
+ [InputSanitizer::V2::Types::BooleanCheck, { :allow_blank => false }, nil] => false,
104
+ [InputSanitizer::V2::Types::BooleanCheck, { :allow_blank => false }, ""] => :invalid_type,
105
+ [InputSanitizer::V2::Types::BooleanCheck, { :allow_blank => false }, true] => true,
106
+ [InputSanitizer::V2::Types::BooleanCheck, { :required => true }, nil] => false,
107
+ [InputSanitizer::V2::Types::BooleanCheck, { :required => true }, ""] => :invalid_type,
108
+ [InputSanitizer::V2::Types::BooleanCheck, { :required => true }, true] => true,
109
+ [InputSanitizer::V2::Types::BooleanCheck, { }, nil] => false,
110
+ [InputSanitizer::V2::Types::BooleanCheck, { }, ""] => :invalid_type,
111
+ [InputSanitizer::V2::Types::BooleanCheck, { }, true] => true,
112
+ [InputSanitizer::V2::Types::DatetimeCheck, { :allow_nil => false }, nil] => false,
113
+ [InputSanitizer::V2::Types::DatetimeCheck, { :allow_nil => false }, ""] => true,
114
+ [InputSanitizer::V2::Types::DatetimeCheck, { :allow_nil => false }, "2014-08-27T16:32:56Z"] => true,
115
+ [InputSanitizer::V2::Types::DatetimeCheck, { :allow_blank => false }, nil] => false,
116
+ [InputSanitizer::V2::Types::DatetimeCheck, { :allow_blank => false }, ""] => false,
117
+ [InputSanitizer::V2::Types::DatetimeCheck, { :allow_blank => false }, "2014-08-27T16:32:56Z"] => true,
118
+ [InputSanitizer::V2::Types::DatetimeCheck, { :required => true }, nil] => false,
119
+ [InputSanitizer::V2::Types::DatetimeCheck, { :required => true }, ""] => false,
120
+ [InputSanitizer::V2::Types::DatetimeCheck, { :required => true }, "2014-08-27T16:32:56Z"] => true,
121
+ [InputSanitizer::V2::Types::DatetimeCheck, { }, nil] => true,
122
+ [InputSanitizer::V2::Types::DatetimeCheck, { }, ""] => true,
123
+ [InputSanitizer::V2::Types::DatetimeCheck, { }, "2014-08-27T16:32:56Z"] => true,
124
+ [InputSanitizer::V2::Types::DatetimeCheck, { }, 1234] => :invalid_type,
125
+ [InputSanitizer::V2::Types::DatetimeCheck, { }, []] => :invalid_type,
126
+ [InputSanitizer::V2::Types::DatetimeCheck, { }, {}] => :invalid_type,
127
+ [InputSanitizer::V2::Types::URLCheck, { :allow_nil => false }, nil] => false,
128
+ [InputSanitizer::V2::Types::URLCheck, { :allow_nil => false }, ""] => true,
129
+ [InputSanitizer::V2::Types::URLCheck, { :allow_nil => false }, "http://getbase.com"] => true,
130
+ [InputSanitizer::V2::Types::URLCheck, { :allow_blank => false }, nil] => false,
131
+ [InputSanitizer::V2::Types::URLCheck, { :allow_blank => false }, ""] => false,
132
+ [InputSanitizer::V2::Types::URLCheck, { :allow_blank => false }, "http://getbase.com"] => true,
133
+ [InputSanitizer::V2::Types::URLCheck, { :required => true }, nil] => false,
134
+ [InputSanitizer::V2::Types::URLCheck, { :required => true }, ""] => false,
135
+ [InputSanitizer::V2::Types::URLCheck, { :required => true }, "http://getbase.com"] => true,
136
+ [InputSanitizer::V2::Types::URLCheck, { }, nil] => true,
137
+ [InputSanitizer::V2::Types::URLCheck, { }, ""] => true,
138
+ [InputSanitizer::V2::Types::URLCheck, { }, "http://getbase.com"] => true,
139
+ }
140
+
141
+ describe 'type checks' do
142
+ test_cases.each do |(test_case, result)|
143
+ describe test_case[0] do
144
+ context "with options: #{test_case[1]}" do
145
+ show_value = case test_case[2]
146
+ when nil then 'nil'
147
+ when '' then "''"
148
+ else "'#{test_case[2]}'"
149
+ end
150
+
151
+ it "correctly handles value #{show_value}" do
152
+ case result
153
+ when true
154
+ lambda { test_case[0].new.call(test_case[2], test_case[1]) }.should_not raise_error
155
+ when false
156
+ lambda { test_case[0].new.call(test_case[2], test_case[1]) }.should raise_error(InputSanitizer::BlankValueError)
157
+ when :invalid_type
158
+ lambda { test_case[0].new.call(test_case[2], test_case[1]) }.should raise_error(InputSanitizer::TypeMismatchError)
159
+ end
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
165
+
166
+ # Generating test cases:
167
+
168
+ # types = ['string', 'integer', 'boolean', 'datetime', 'url']
169
+ # options = [:allow_nil_false, :allow_blank_false, :required_true, :no_params]
170
+ # values = [nil, '', lambda { |type| { 'string' => 'zz', 'integer' => 1, 'boolean' => true, 'datetime' => '2014-08-27T16:32:56Z', 'url' => 'http://getbase.com' }[type] }]
171
+ # test_cases = types.product(options).product(values).map(&:flatten).map! do |test_case|
172
+ # test_case[2] = test_case[2].call(test_case[0]) if test_case[2].is_a?(Proc); test_case
173
+ # end
174
+ # test_cases.each { |test_case| puts "#{test_case.inspect} => []," }; nil