dry-validation 0.13.3 → 1.3.1

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 (206) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +233 -12
  3. data/LICENSE +1 -1
  4. data/README.md +13 -9
  5. data/config/errors.yml +3 -88
  6. data/lib/dry-validation.rb +2 -0
  7. data/lib/dry/validation.rb +47 -28
  8. data/lib/dry/validation/config.rb +24 -0
  9. data/lib/dry/validation/constants.rb +43 -0
  10. data/lib/dry/validation/contract.rb +160 -0
  11. data/lib/dry/validation/contract/class_interface.rb +223 -0
  12. data/lib/dry/validation/evaluator.rb +197 -0
  13. data/lib/dry/validation/extensions/hints.rb +69 -0
  14. data/lib/dry/validation/extensions/monads.rb +23 -7
  15. data/lib/dry/validation/extensions/predicates_as_macros.rb +75 -0
  16. data/lib/dry/validation/failures.rb +58 -0
  17. data/lib/dry/validation/function.rb +44 -0
  18. data/lib/dry/validation/macro.rb +38 -0
  19. data/lib/dry/validation/macros.rb +104 -0
  20. data/lib/dry/validation/message.rb +79 -79
  21. data/lib/dry/validation/message_set.rb +108 -88
  22. data/lib/dry/validation/messages/resolver.rb +79 -0
  23. data/lib/dry/validation/result.rb +154 -42
  24. data/lib/dry/validation/rule.rb +129 -0
  25. data/lib/dry/validation/schema_ext.rb +46 -0
  26. data/lib/dry/validation/values.rb +94 -0
  27. data/lib/dry/validation/version.rb +3 -1
  28. metadata +41 -336
  29. data/.codeclimate.yml +0 -17
  30. data/.gitignore +0 -9
  31. data/.rspec +0 -3
  32. data/.travis.yml +0 -29
  33. data/CONTRIBUTING.md +0 -31
  34. data/Gemfile +0 -25
  35. data/Rakefile +0 -22
  36. data/benchmarks/benchmark_form_invalid.rb +0 -64
  37. data/benchmarks/benchmark_form_valid.rb +0 -64
  38. data/benchmarks/benchmark_schema_invalid_huge.rb +0 -52
  39. data/benchmarks/profile_schema_call_invalid.rb +0 -20
  40. data/benchmarks/profile_schema_call_valid.rb +0 -20
  41. data/benchmarks/profile_schema_definition.rb +0 -14
  42. data/benchmarks/profile_schema_huge_invalid.rb +0 -30
  43. data/benchmarks/profile_schema_messages_invalid.rb +0 -20
  44. data/benchmarks/suite.rb +0 -5
  45. data/dry-validation.gemspec +0 -28
  46. data/examples/basic.rb +0 -15
  47. data/examples/each.rb +0 -14
  48. data/examples/json.rb +0 -12
  49. data/examples/multiple.rb +0 -27
  50. data/examples/nested.rb +0 -22
  51. data/examples/params.rb +0 -11
  52. data/lib/dry/validation/compat/form.rb +0 -67
  53. data/lib/dry/validation/deprecations.rb +0 -24
  54. data/lib/dry/validation/executor.rb +0 -91
  55. data/lib/dry/validation/extensions.rb +0 -7
  56. data/lib/dry/validation/extensions/struct.rb +0 -32
  57. data/lib/dry/validation/input_processor_compiler.rb +0 -137
  58. data/lib/dry/validation/input_processor_compiler/json.rb +0 -45
  59. data/lib/dry/validation/input_processor_compiler/params.rb +0 -49
  60. data/lib/dry/validation/input_processor_compiler/sanitizer.rb +0 -47
  61. data/lib/dry/validation/message_compiler.rb +0 -188
  62. data/lib/dry/validation/message_compiler/visitor_opts.rb +0 -37
  63. data/lib/dry/validation/messages.rb +0 -14
  64. data/lib/dry/validation/messages/abstract.rb +0 -119
  65. data/lib/dry/validation/messages/i18n.rb +0 -47
  66. data/lib/dry/validation/messages/namespaced.rb +0 -39
  67. data/lib/dry/validation/messages/yaml.rb +0 -61
  68. data/lib/dry/validation/predicate_registry.rb +0 -115
  69. data/lib/dry/validation/predicates.rb +0 -19
  70. data/lib/dry/validation/schema.rb +0 -126
  71. data/lib/dry/validation/schema/check.rb +0 -37
  72. data/lib/dry/validation/schema/class_interface.rb +0 -190
  73. data/lib/dry/validation/schema/deprecated.rb +0 -30
  74. data/lib/dry/validation/schema/dsl.rb +0 -118
  75. data/lib/dry/validation/schema/form.rb +0 -9
  76. data/lib/dry/validation/schema/json.rb +0 -21
  77. data/lib/dry/validation/schema/key.rb +0 -71
  78. data/lib/dry/validation/schema/params.rb +0 -22
  79. data/lib/dry/validation/schema/rule.rb +0 -202
  80. data/lib/dry/validation/schema/value.rb +0 -211
  81. data/lib/dry/validation/schema_compiler.rb +0 -81
  82. data/lib/dry/validation/template.rb +0 -66
  83. data/lib/dry/validation/type_specs.rb +0 -70
  84. data/spec/extensions/monads/result_spec.rb +0 -40
  85. data/spec/extensions/struct/schema_spec.rb +0 -32
  86. data/spec/fixtures/locales/en.yml +0 -8
  87. data/spec/fixtures/locales/pl.yml +0 -22
  88. data/spec/integration/custom_error_messages_spec.rb +0 -54
  89. data/spec/integration/custom_predicates_spec.rb +0 -228
  90. data/spec/integration/hints_spec.rb +0 -170
  91. data/spec/integration/injecting_rules_spec.rb +0 -30
  92. data/spec/integration/json/defining_base_schema_spec.rb +0 -41
  93. data/spec/integration/localized_error_messages_spec.rb +0 -72
  94. data/spec/integration/message_compiler_spec.rb +0 -405
  95. data/spec/integration/messages/i18n_spec.rb +0 -104
  96. data/spec/integration/optional_keys_spec.rb +0 -28
  97. data/spec/integration/params/predicates/array_spec.rb +0 -287
  98. data/spec/integration/params/predicates/empty_spec.rb +0 -263
  99. data/spec/integration/params/predicates/eql_spec.rb +0 -327
  100. data/spec/integration/params/predicates/even_spec.rb +0 -455
  101. data/spec/integration/params/predicates/excluded_from_spec.rb +0 -455
  102. data/spec/integration/params/predicates/excludes_spec.rb +0 -391
  103. data/spec/integration/params/predicates/false_spec.rb +0 -455
  104. data/spec/integration/params/predicates/filled_spec.rb +0 -467
  105. data/spec/integration/params/predicates/format_spec.rb +0 -454
  106. data/spec/integration/params/predicates/gt_spec.rb +0 -519
  107. data/spec/integration/params/predicates/gteq_spec.rb +0 -519
  108. data/spec/integration/params/predicates/included_in_spec.rb +0 -455
  109. data/spec/integration/params/predicates/includes_spec.rb +0 -391
  110. data/spec/integration/params/predicates/key_spec.rb +0 -67
  111. data/spec/integration/params/predicates/lt_spec.rb +0 -519
  112. data/spec/integration/params/predicates/lteq_spec.rb +0 -519
  113. data/spec/integration/params/predicates/max_size_spec.rb +0 -391
  114. data/spec/integration/params/predicates/min_size_spec.rb +0 -391
  115. data/spec/integration/params/predicates/none_spec.rb +0 -265
  116. data/spec/integration/params/predicates/not_eql_spec.rb +0 -327
  117. data/spec/integration/params/predicates/odd_spec.rb +0 -455
  118. data/spec/integration/params/predicates/size/fixed_spec.rb +0 -393
  119. data/spec/integration/params/predicates/size/range_spec.rb +0 -396
  120. data/spec/integration/params/predicates/true_spec.rb +0 -455
  121. data/spec/integration/params/predicates/type_spec.rb +0 -391
  122. data/spec/integration/result_spec.rb +0 -81
  123. data/spec/integration/schema/array_schema_spec.rb +0 -59
  124. data/spec/integration/schema/check_rules_spec.rb +0 -119
  125. data/spec/integration/schema/check_with_nested_el_spec.rb +0 -37
  126. data/spec/integration/schema/check_with_nth_el_spec.rb +0 -25
  127. data/spec/integration/schema/default_settings_spec.rb +0 -11
  128. data/spec/integration/schema/defining_base_schema_spec.rb +0 -41
  129. data/spec/integration/schema/dynamic_predicate_args_spec.rb +0 -43
  130. data/spec/integration/schema/each_with_set_spec.rb +0 -70
  131. data/spec/integration/schema/extending_dsl_spec.rb +0 -27
  132. data/spec/integration/schema/form_spec.rb +0 -236
  133. data/spec/integration/schema/hash_schema_spec.rb +0 -47
  134. data/spec/integration/schema/inheriting_schema_spec.rb +0 -31
  135. data/spec/integration/schema/input_processor_spec.rb +0 -46
  136. data/spec/integration/schema/json/explicit_types_spec.rb +0 -157
  137. data/spec/integration/schema/json_spec.rb +0 -163
  138. data/spec/integration/schema/macros/confirmation_spec.rb +0 -35
  139. data/spec/integration/schema/macros/each_spec.rb +0 -268
  140. data/spec/integration/schema/macros/filled_spec.rb +0 -87
  141. data/spec/integration/schema/macros/input_spec.rb +0 -139
  142. data/spec/integration/schema/macros/maybe_spec.rb +0 -99
  143. data/spec/integration/schema/macros/rule_spec.rb +0 -75
  144. data/spec/integration/schema/macros/value_spec.rb +0 -119
  145. data/spec/integration/schema/macros/when_spec.rb +0 -62
  146. data/spec/integration/schema/nested_schemas_spec.rb +0 -236
  147. data/spec/integration/schema/nested_values_spec.rb +0 -46
  148. data/spec/integration/schema/not_spec.rb +0 -34
  149. data/spec/integration/schema/numbers_spec.rb +0 -19
  150. data/spec/integration/schema/option_with_default_spec.rb +0 -64
  151. data/spec/integration/schema/or_spec.rb +0 -87
  152. data/spec/integration/schema/params/defining_base_schema_spec.rb +0 -41
  153. data/spec/integration/schema/params/explicit_types_spec.rb +0 -195
  154. data/spec/integration/schema/params_spec.rb +0 -234
  155. data/spec/integration/schema/predicate_verification_spec.rb +0 -9
  156. data/spec/integration/schema/predicates/array_spec.rb +0 -295
  157. data/spec/integration/schema/predicates/custom_spec.rb +0 -103
  158. data/spec/integration/schema/predicates/empty_spec.rb +0 -263
  159. data/spec/integration/schema/predicates/eql_spec.rb +0 -327
  160. data/spec/integration/schema/predicates/even_spec.rb +0 -455
  161. data/spec/integration/schema/predicates/excluded_from/array_spec.rb +0 -459
  162. data/spec/integration/schema/predicates/excluded_from/range_spec.rb +0 -459
  163. data/spec/integration/schema/predicates/excludes_spec.rb +0 -391
  164. data/spec/integration/schema/predicates/filled_spec.rb +0 -467
  165. data/spec/integration/schema/predicates/format_spec.rb +0 -455
  166. data/spec/integration/schema/predicates/gt_spec.rb +0 -519
  167. data/spec/integration/schema/predicates/gteq_spec.rb +0 -519
  168. data/spec/integration/schema/predicates/hash_spec.rb +0 -69
  169. data/spec/integration/schema/predicates/included_in/array_spec.rb +0 -459
  170. data/spec/integration/schema/predicates/included_in/range_spec.rb +0 -459
  171. data/spec/integration/schema/predicates/includes_spec.rb +0 -391
  172. data/spec/integration/schema/predicates/key_spec.rb +0 -88
  173. data/spec/integration/schema/predicates/lt_spec.rb +0 -520
  174. data/spec/integration/schema/predicates/lteq_spec.rb +0 -519
  175. data/spec/integration/schema/predicates/max_size_spec.rb +0 -391
  176. data/spec/integration/schema/predicates/min_size_spec.rb +0 -391
  177. data/spec/integration/schema/predicates/none_spec.rb +0 -265
  178. data/spec/integration/schema/predicates/not_eql_spec.rb +0 -391
  179. data/spec/integration/schema/predicates/odd_spec.rb +0 -455
  180. data/spec/integration/schema/predicates/size/fixed_spec.rb +0 -398
  181. data/spec/integration/schema/predicates/size/range_spec.rb +0 -395
  182. data/spec/integration/schema/predicates/type_spec.rb +0 -413
  183. data/spec/integration/schema/reusing_schema_spec.rb +0 -33
  184. data/spec/integration/schema/using_types_spec.rb +0 -135
  185. data/spec/integration/schema/validate_spec.rb +0 -120
  186. data/spec/integration/schema/xor_spec.rb +0 -35
  187. data/spec/integration/schema_builders_spec.rb +0 -17
  188. data/spec/integration/schema_spec.rb +0 -173
  189. data/spec/shared/message_compiler.rb +0 -11
  190. data/spec/shared/predicate_helper.rb +0 -15
  191. data/spec/shared/rule_compiler.rb +0 -8
  192. data/spec/spec_helper.rb +0 -62
  193. data/spec/support/define_struct.rb +0 -25
  194. data/spec/support/matchers.rb +0 -38
  195. data/spec/support/mutant.rb +0 -9
  196. data/spec/support/predicates_integration.rb +0 -7
  197. data/spec/unit/input_processor_compiler/json_spec.rb +0 -283
  198. data/spec/unit/input_processor_compiler/params_spec.rb +0 -328
  199. data/spec/unit/message_compiler/visit_failure_spec.rb +0 -38
  200. data/spec/unit/message_compiler/visit_spec.rb +0 -16
  201. data/spec/unit/message_compiler_spec.rb +0 -7
  202. data/spec/unit/predicate_registry_spec.rb +0 -34
  203. data/spec/unit/schema/key_spec.rb +0 -38
  204. data/spec/unit/schema/rule_spec.rb +0 -42
  205. data/spec/unit/schema/value_spec.rb +0 -131
  206. data/spec/unit/schema_spec.rb +0 -35
@@ -1,234 +0,0 @@
1
- RSpec.describe Dry::Validation::Schema::Params, 'defining a schema' do
2
- subject(:schema) do
3
- Dry::Validation.Params do
4
- configure do
5
- def email?(value)
6
- true
7
- end
8
- end
9
-
10
- required(:email).filled
11
-
12
- required(:age).maybe(:int?, gt?: 18)
13
-
14
- required(:address).schema do
15
- required(:city).filled
16
- required(:street).filled
17
-
18
- required(:loc).schema do
19
- required(:lat).filled(:float?)
20
- required(:lng).filled(:float?)
21
- end
22
- end
23
-
24
- optional(:password).maybe.confirmation
25
-
26
- optional(:phone_number).maybe(:int?, gt?: 0)
27
-
28
- rule(:email_valid) { value(:email).email? }
29
- end
30
- end
31
-
32
- describe '#messages' do
33
- it 'returns compiled error messages' do
34
- result = schema.('email' => '', 'age' => '19')
35
-
36
- expect(result.messages).to eql(
37
- email: ['must be filled'],
38
- address: ['is missing']
39
- )
40
-
41
- expect(result.output).to eql(email: '', age: 19)
42
- end
43
-
44
- it 'returns hints for nested data' do
45
- result = schema.(
46
- 'email' => 'jane@doe.org',
47
- 'age' => '19',
48
- 'address' => {
49
- 'city' => '',
50
- 'street' => 'Street 1/2',
51
- 'loc' => { 'lat' => '123.456', 'lng' => '' }
52
- }
53
- )
54
-
55
- expect(result.messages).to eql(
56
- address: {
57
- loc: { lng: ['must be filled'] },
58
- city: ['must be filled']
59
- }
60
- )
61
- end
62
- end
63
-
64
- describe '#call' do
65
- it 'passes when attributes are valid' do
66
- result = schema.(
67
- 'email' => 'jane@doe.org',
68
- 'age' => '19',
69
- 'address' => {
70
- 'city' => 'NYC',
71
- 'street' => 'Street 1/2',
72
- 'loc' => { 'lat' => '123.456', 'lng' => '456.123' }
73
- }
74
- )
75
-
76
- expect(result).to be_success
77
-
78
- expect(result.output).to eql(
79
- email: 'jane@doe.org', age: 19,
80
- address: {
81
- city: 'NYC', street: 'Street 1/2',
82
- loc: { lat: 123.456, lng: 456.123 }
83
- }
84
- )
85
- end
86
-
87
- it 'validates presence of an email and min age value' do
88
- result = schema.('email' => '', 'age' => '18')
89
-
90
- expect(result.messages).to eql(
91
- address: ['is missing'],
92
- age: ['must be greater than 18'],
93
- email: ['must be filled']
94
- )
95
- end
96
-
97
- it 'handles optionals' do
98
- result = schema.(
99
- 'email' => 'jane@doe.org',
100
- 'age' => '19',
101
- 'phone_number' => '12',
102
- 'address' => {
103
- 'city' => 'NYC',
104
- 'street' => 'Street 1/2',
105
- 'loc' => { 'lat' => '123.456', 'lng' => '456.123' }
106
- }
107
- )
108
-
109
- expect(result).to be_success
110
-
111
- expect(result.output).to eql(
112
- email: 'jane@doe.org', age: 19, phone_number: 12,
113
- address: {
114
- city: 'NYC', street: 'Street 1/2',
115
- loc: { lat: 123.456, lng: 456.123 }
116
- }
117
- )
118
- end
119
- end
120
-
121
- describe 'with an each and nested schema' do
122
- subject(:schema) do
123
- Dry::Validation.Params do
124
- required(:items).each do
125
- schema do
126
- required(:title).filled(:str?)
127
- end
128
- end
129
- end
130
- end
131
-
132
- it 'passes when each element passes schema check' do
133
- expect(schema.(items: [{ title: 'Foo' }])).to be_success
134
- end
135
-
136
- it 'fails when one or more elements did not pass schema check' do
137
- expect(schema.(items: [{ title: 'Foo' }, { title: :Foo }]).messages).to eql(
138
- items: { 1 => { title: ['must be a string'] } }
139
- )
140
- end
141
- end
142
-
143
- describe 'symbolizing keys when coercion fails' do
144
- subject(:schema) do
145
- Dry::Validation.Params do
146
- required(:email).value(size?: 8..60)
147
- required(:birthdate).value(:date?)
148
- required(:age).value(:int?, gt?: 23)
149
- required(:tags).maybe(max_size?: 3)
150
- end
151
- end
152
-
153
- let(:tags) { %(al b c) }
154
-
155
- it 'symbolizes keys and coerces values' do
156
- result = schema.(
157
- 'email' => 'jane@doe.org',
158
- 'birthdate' => '2001-02-03',
159
- 'age' => '24',
160
- 'tags' => tags
161
- ).to_h
162
-
163
- expect(result.to_h).to eql(
164
- email: 'jane@doe.org',
165
- birthdate: Date.new(2001, 2, 3),
166
- age: 24,
167
- tags: tags
168
- )
169
- end
170
-
171
- it 'symbolizes keys even when coercion fails' do
172
- result = schema.(
173
- 'email' => 'jane@doe.org',
174
- 'birthdate' => '2001-sutin-03',
175
- 'age' => ['oops'],
176
- 'tags' => nil
177
- )
178
-
179
- expect(result.to_h).to eql(
180
- email: 'jane@doe.org',
181
- birthdate: '2001-sutin-03',
182
- age: ['oops'],
183
- tags: nil
184
- )
185
-
186
- expect(result.messages).to eql(
187
- birthdate: ['must be a date'],
188
- age: ['must be an integer', 'must be greater than 23']
189
- )
190
- end
191
- end
192
-
193
- describe 'with nested schema in a high-level rule' do
194
- subject(:schema) do
195
- Dry::Validation.Params do
196
- required(:address).maybe(:hash?)
197
-
198
- required(:delivery).filled(:bool?)
199
-
200
- rule(address: [:delivery, :address]) do |delivery, address|
201
- delivery.true?.then(address.schema(AddressSchema))
202
- end
203
- end
204
- end
205
-
206
- before do
207
- AddressSchema = Dry::Validation.Params do
208
- required(:city).filled
209
- required(:zipcode).filled(:int?)
210
- end
211
- end
212
-
213
- after do
214
- Object.send(:remove_const, :AddressSchema)
215
- end
216
-
217
- it 'succeeds when nested params schema succeeds' do
218
- result = schema.(delivery: '1', address: { city: 'NYC', zipcode: '123' })
219
- expect(result).to be_success
220
- end
221
-
222
- it 'does not apply schema when there is no match' do
223
- result = schema.(delivery: '0', address: nil)
224
- expect(result).to be_success
225
- end
226
-
227
- it 'fails when nested schema fails' do
228
- result = schema.(delivery: '1', address: { city: 'NYC', zipcode: 'foo' })
229
- expect(result.messages).to eql(
230
- address: { zipcode: ['must be an integer'] }
231
- )
232
- end
233
- end
234
- end
@@ -1,9 +0,0 @@
1
- RSpec.describe 'Verifying predicates in the DSL' do
2
- it 'raises error when invalid predicate name is used' do
3
- expect { Dry::Validation.Schema { required(:age).value(filled?: 312) } }
4
- .to raise_error(ArgumentError, "filled? predicate arity is invalid")
5
-
6
- expect { Dry::Validation.Schema { required(:age) { none? | filled?(312) } } }
7
- .to raise_error(ArgumentError, "filled? predicate arity is invalid")
8
- end
9
- end
@@ -1,295 +0,0 @@
1
- RSpec.describe 'Predicates: Array' do
2
- context 'with required' do
3
- subject(:schema) do
4
- Dry::Validation.Schema do
5
- required(:foo) { array? { each { int? } } }
6
- end
7
- end
8
-
9
- context 'with valid input' do
10
- let(:input) { { foo: [3] } }
11
-
12
- it 'is successful' do
13
- expect(result).to be_successful
14
- end
15
- end
16
-
17
- context 'with missing input' do
18
- let(:input) { {} }
19
-
20
- it 'is not successful' do
21
- expect(result).to be_failing ['is missing']
22
- end
23
- end
24
-
25
- context 'with nil input' do
26
- let(:input) { { foo: nil } }
27
-
28
- it 'is not successful' do
29
- expect(result).to be_failing ['must be an array']
30
- end
31
- end
32
-
33
- context 'with blank input' do
34
- let(:input) { { foo: '' } }
35
-
36
- it 'is not successful' do
37
- expect(result).to be_failing ['must be an array']
38
- end
39
- end
40
-
41
- context 'with invalid type' do
42
- let(:input) { { foo: { a: 1 } } }
43
-
44
- it 'is not successful' do
45
- expect(result).to be_failing ['must be an array']
46
- end
47
- end
48
-
49
- context 'with invalid input (integer)' do
50
- let(:input) { { foo: 4 } }
51
-
52
- it 'is not successful' do
53
- expect(result).to be_failing ['must be an array']
54
- end
55
- end
56
-
57
- context 'with invalid input (array with non-integers)' do
58
- let(:input) { { foo: [:foo, :bar] } }
59
-
60
- it 'is not successful' do
61
- expect(result).to be_failing 0 => ['must be an integer'], 1 => ['must be an integer']
62
- end
63
- end
64
-
65
- context 'with invalid input (miexed array)' do
66
- let(:input) { { foo: [1, '2', :bar] } }
67
-
68
- it 'is not successful' do
69
- expect(result).to be_failing 1 => ['must be an integer'], 2 => ['must be an integer']
70
- end
71
- end
72
- end
73
-
74
- context 'with optional' do
75
- subject(:schema) do
76
- Dry::Validation.Schema do
77
- optional(:foo) { array? { each { int? } } }
78
- end
79
- end
80
-
81
- context 'with valid input' do
82
- let(:input) { { foo: [3] } }
83
-
84
- it 'is successful' do
85
- expect(result).to be_successful
86
- end
87
- end
88
-
89
- context 'with missing input' do
90
- let(:input) { {} }
91
-
92
- it 'is successful' do
93
- expect(result).to be_successful
94
- end
95
- end
96
-
97
- context 'with nil input' do
98
- let(:input) { { foo: nil } }
99
-
100
- it 'is not successful' do
101
- expect(result).to be_failing ['must be an array']
102
- end
103
- end
104
-
105
- context 'with blank input' do
106
- let(:input) { { foo: '' } }
107
-
108
- it 'is not successful' do
109
- expect(result).to be_failing ['must be an array']
110
- end
111
- end
112
-
113
- context 'with invalid type' do
114
- let(:input) { { foo: { a: 1 } } }
115
-
116
- it 'is not successful' do
117
- expect(result).to be_failing ['must be an array']
118
- end
119
- end
120
-
121
- context 'with invalid input (integer)' do
122
- let(:input) { { foo: 4 } }
123
-
124
- it 'is not successful' do
125
- expect(result).to be_failing ['must be an array']
126
- end
127
- end
128
-
129
- context 'with invalid input (array with non-integers)' do
130
- let(:input) { { foo: [:foo, :bar] } }
131
-
132
- it 'is not successful' do
133
- expect(result).to be_failing 0 => ['must be an integer'], 1 => ['must be an integer']
134
- end
135
- end
136
-
137
- context 'with invalid input (miexed array)' do
138
- let(:input) { { foo: [1, '2', :bar] } }
139
-
140
- it 'is not successful' do
141
- expect(result).to be_failing 1 => ['must be an integer'], 2 => ['must be an integer']
142
- end
143
- end
144
- end
145
-
146
- context 'as macro' do
147
- context 'with required' do
148
- subject(:schema) do
149
- Dry::Validation.Schema do
150
- required(:foo).each(:int?)
151
- end
152
- end
153
-
154
- context 'with missing input' do
155
- let(:input) { {} }
156
-
157
- it 'is not successful' do
158
- expect(result).to be_failing ['is missing']
159
- end
160
- end
161
-
162
- context 'with nil input' do
163
- let(:input) { { foo: nil } }
164
-
165
- it 'is not successful' do
166
- expect(result).to be_failing ['must be an array']
167
- end
168
- end
169
-
170
- context 'with blank input' do
171
- let(:input) { { foo: '' } }
172
-
173
- it 'is not successful' do
174
- expect(result).to be_failing ['must be an array']
175
- end
176
- end
177
-
178
- context 'with valid input' do
179
- let(:input) { { foo: [3] } }
180
-
181
- it 'is successful' do
182
- expect(result).to be_successful
183
- end
184
- end
185
-
186
- context 'with invalid input' do
187
- let(:input) { { foo: [:bar] } }
188
-
189
- it 'is not successful' do
190
- expect(result).to be_failing 0 => ['must be an integer']
191
- end
192
- end
193
-
194
- context "when using an input_processor" do
195
- subject(:schema) do
196
- Dry::Validation.Schema do
197
- configure do
198
- config.input_processor = :sanitizer
199
- end
200
-
201
- required(:foo).each(:int?)
202
- end
203
- end
204
-
205
- context 'with missing input' do
206
- let(:input) { {} }
207
-
208
- it 'is not successful' do
209
- expect(result).to be_failing ['is missing']
210
- end
211
- end
212
-
213
- context 'with nil input' do
214
- let(:input) { { foo: nil } }
215
-
216
- it 'is not successful' do
217
- expect(result).to be_failing ['must be an array']
218
- end
219
- end
220
-
221
- context 'with blank input' do
222
- let(:input) { { foo: '' } }
223
-
224
- it 'is not successful' do
225
- expect(result).to be_failing ['must be an array']
226
- end
227
- end
228
-
229
- context 'with valid input' do
230
- let(:input) { { foo: [3] } }
231
-
232
- it 'is successful' do
233
- expect(result).to be_successful
234
- end
235
- end
236
-
237
- context 'with invalid input' do
238
- let(:input) { { foo: [:bar] } }
239
-
240
- it 'is not successful' do
241
- expect(result).to be_failing 0 => ['must be an integer']
242
- end
243
- end
244
- end
245
- end
246
-
247
- context 'with optional' do
248
- subject(:schema) do
249
- Dry::Validation.Schema do
250
- optional(:foo).each(:int?)
251
- end
252
- end
253
-
254
- context 'with missing input' do
255
- let(:input) { {} }
256
-
257
- it 'is successful' do
258
- expect(result).to be_successful
259
- end
260
- end
261
-
262
- context 'with nil input' do
263
- let(:input) { { foo: nil } }
264
-
265
- it 'is not successful' do
266
- expect(result).to be_failing ['must be an array']
267
- end
268
- end
269
-
270
- context 'with blank input' do
271
- let(:input) { { foo: '' } }
272
-
273
- it 'is not successful' do
274
- expect(result).to be_failing ['must be an array']
275
- end
276
- end
277
-
278
- context 'with valid input' do
279
- let(:input) { { foo: [3] } }
280
-
281
- it 'is successful' do
282
- expect(result).to be_successful
283
- end
284
- end
285
-
286
- context 'with invalid input' do
287
- let(:input) { { foo: [:bar] } }
288
-
289
- it 'is not successful' do
290
- expect(result).to be_failing 0 => ['must be an integer']
291
- end
292
- end
293
- end
294
- end
295
- end