dry-validation 0.7.4 → 0.8.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/.gitignore +1 -0
- data/.travis.yml +9 -6
- data/CHANGELOG.md +58 -0
- data/Gemfile +3 -3
- data/benchmarks/benchmark_form_invalid.rb +64 -0
- data/benchmarks/benchmark_form_valid.rb +64 -0
- data/benchmarks/profile_schema_call_invalid.rb +20 -0
- data/benchmarks/profile_schema_call_valid.rb +20 -0
- data/benchmarks/profile_schema_definition.rb +14 -0
- data/benchmarks/profile_schema_messages_invalid.rb +20 -0
- data/benchmarks/suite.rb +5 -0
- data/config/errors.yml +12 -5
- data/dry-validation.gemspec +2 -2
- data/examples/basic.rb +2 -2
- data/examples/form.rb +2 -2
- data/examples/json.rb +2 -2
- data/examples/nested.rb +6 -6
- data/lib/dry/validation.rb +22 -3
- data/lib/dry/validation/deprecations.rb +23 -0
- data/lib/dry/validation/error_compiler.rb +31 -11
- data/lib/dry/validation/error_compiler/input.rb +44 -57
- data/lib/dry/validation/hint_compiler.rb +15 -7
- data/lib/dry/validation/input_processor_compiler.rb +13 -6
- data/lib/dry/validation/input_processor_compiler/form.rb +2 -0
- data/lib/dry/validation/input_processor_compiler/sanitizer.rb +1 -1
- data/lib/dry/validation/messages/abstract.rb +9 -1
- data/lib/dry/validation/predicate_registry.rb +101 -0
- data/lib/dry/validation/result.rb +8 -1
- data/lib/dry/validation/schema.rb +110 -44
- data/lib/dry/validation/schema/check.rb +4 -2
- data/lib/dry/validation/schema/deprecated.rb +31 -0
- data/lib/dry/validation/schema/dsl.rb +18 -11
- data/lib/dry/validation/schema/form.rb +1 -0
- data/lib/dry/validation/schema/json.rb +1 -0
- data/lib/dry/validation/schema/key.rb +23 -10
- data/lib/dry/validation/schema/rule.rb +81 -20
- data/lib/dry/validation/schema/value.rb +110 -25
- data/lib/dry/validation/version.rb +1 -1
- data/spec/fixtures/locales/en.yml +1 -0
- data/spec/fixtures/locales/pl.yml +1 -1
- data/spec/integration/custom_error_messages_spec.rb +2 -2
- data/spec/integration/custom_predicates_spec.rb +98 -15
- data/spec/integration/error_compiler_spec.rb +111 -96
- data/spec/integration/form/predicates/array_spec.rb +243 -0
- data/spec/integration/form/predicates/empty_spec.rb +263 -0
- data/spec/integration/form/predicates/eql_spec.rb +327 -0
- data/spec/integration/form/predicates/even_spec.rb +455 -0
- data/spec/integration/form/predicates/excluded_from_spec.rb +455 -0
- data/spec/integration/form/predicates/excludes_spec.rb +391 -0
- data/spec/integration/form/predicates/false_spec.rb +455 -0
- data/spec/integration/form/predicates/filled_spec.rb +467 -0
- data/spec/integration/form/predicates/format_spec.rb +454 -0
- data/spec/integration/form/predicates/gt_spec.rb +519 -0
- data/spec/integration/form/predicates/gteq_spec.rb +519 -0
- data/spec/integration/form/predicates/included_in_spec.rb +455 -0
- data/spec/integration/form/predicates/includes_spec.rb +391 -0
- data/spec/integration/form/predicates/key_spec.rb +75 -0
- data/spec/integration/form/predicates/lt_spec.rb +519 -0
- data/spec/integration/form/predicates/lteq_spec.rb +519 -0
- data/spec/integration/form/predicates/max_size_spec.rb +391 -0
- data/spec/integration/form/predicates/min_size_spec.rb +391 -0
- data/spec/integration/form/predicates/none_spec.rb +265 -0
- data/spec/integration/form/predicates/not_eql_spec.rb +327 -0
- data/spec/integration/form/predicates/odd_spec.rb +455 -0
- data/spec/integration/form/predicates/size/fixed_spec.rb +399 -0
- data/spec/integration/form/predicates/size/range_spec.rb +398 -0
- data/spec/integration/form/predicates/true_spec.rb +455 -0
- data/spec/integration/form/predicates/type_spec.rb +391 -0
- data/spec/integration/hints_spec.rb +90 -4
- data/spec/integration/injecting_rules_spec.rb +2 -2
- data/spec/integration/localized_error_messages_spec.rb +2 -2
- data/spec/integration/messages/i18n_spec.rb +3 -3
- data/spec/integration/optional_keys_spec.rb +3 -3
- data/spec/integration/schema/array_schema_spec.rb +49 -13
- data/spec/integration/schema/check_rules_spec.rb +6 -6
- data/spec/integration/schema/check_with_nested_el_spec.rb +3 -3
- data/spec/integration/schema/check_with_nth_el_spec.rb +1 -1
- data/spec/integration/schema/each_with_set_spec.rb +3 -3
- data/spec/integration/schema/extending_dsl_spec.rb +27 -0
- data/spec/integration/schema/form/explicit_types_spec.rb +182 -0
- data/spec/integration/schema/form_spec.rb +90 -18
- data/spec/integration/schema/hash_schema_spec.rb +47 -0
- data/spec/integration/schema/inheriting_schema_spec.rb +4 -4
- data/spec/integration/schema/input_processor_spec.rb +8 -8
- data/spec/integration/schema/json/explicit_types_spec.rb +157 -0
- data/spec/integration/schema/json_spec.rb +18 -18
- data/spec/integration/schema/macros/confirmation_spec.rb +1 -1
- data/spec/integration/schema/macros/each_spec.rb +177 -43
- data/spec/integration/schema/macros/{required_spec.rb → filled_spec.rb} +34 -6
- data/spec/integration/schema/macros/input_spec.rb +21 -0
- data/spec/integration/schema/macros/maybe_spec.rb +39 -2
- data/spec/integration/schema/macros/value_spec.rb +105 -0
- data/spec/integration/schema/macros/when_spec.rb +28 -8
- data/spec/integration/schema/nested_values_spec.rb +11 -8
- data/spec/integration/schema/not_spec.rb +2 -2
- data/spec/integration/schema/numbers_spec.rb +1 -1
- data/spec/integration/schema/option_with_default_spec.rb +1 -1
- data/spec/integration/schema/predicate_verification_spec.rb +9 -0
- data/spec/integration/schema/predicates/array_spec.rb +295 -0
- data/spec/integration/schema/predicates/custom_spec.rb +103 -0
- data/spec/integration/schema/predicates/empty_spec.rb +263 -0
- data/spec/integration/schema/predicates/eql_spec.rb +327 -0
- data/spec/integration/schema/predicates/even_spec.rb +455 -0
- data/spec/integration/schema/predicates/excluded_from_spec.rb +455 -0
- data/spec/integration/schema/predicates/excludes_spec.rb +391 -0
- data/spec/integration/schema/predicates/filled_spec.rb +467 -0
- data/spec/integration/schema/predicates/format_spec.rb +455 -0
- data/spec/integration/schema/predicates/gt_spec.rb +519 -0
- data/spec/integration/schema/predicates/gteq_spec.rb +519 -0
- data/spec/integration/schema/predicates/hash_spec.rb +69 -0
- data/spec/integration/schema/predicates/included_in_spec.rb +455 -0
- data/spec/integration/schema/predicates/includes_spec.rb +391 -0
- data/spec/integration/schema/predicates/key_spec.rb +88 -0
- data/spec/integration/schema/predicates/lt_spec.rb +520 -0
- data/spec/integration/schema/predicates/lteq_spec.rb +519 -0
- data/spec/integration/schema/predicates/max_size_spec.rb +391 -0
- data/spec/integration/schema/predicates/min_size_spec.rb +391 -0
- data/spec/integration/schema/predicates/none_spec.rb +265 -0
- data/spec/integration/schema/predicates/not_eql_spec.rb +391 -0
- data/spec/integration/schema/predicates/odd_spec.rb +455 -0
- data/spec/integration/schema/predicates/size/fixed_spec.rb +401 -0
- data/spec/integration/schema/predicates/size/range_spec.rb +399 -0
- data/spec/integration/schema/predicates/type_spec.rb +391 -0
- data/spec/integration/schema/reusing_schema_spec.rb +4 -4
- data/spec/integration/schema/using_types_spec.rb +24 -6
- data/spec/integration/schema/xor_spec.rb +2 -2
- data/spec/integration/schema_builders_spec.rb +15 -0
- data/spec/integration/schema_spec.rb +37 -12
- data/spec/shared/predicate_helper.rb +13 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/support/matchers.rb +38 -0
- data/spec/support/predicates_integration.rb +7 -0
- data/spec/unit/hint_compiler_spec.rb +10 -8
- data/spec/unit/input_processor_compiler/form_spec.rb +45 -43
- data/spec/unit/input_processor_compiler/json_spec.rb +37 -35
- data/spec/unit/predicate_registry_spec.rb +34 -0
- data/spec/unit/schema/key_spec.rb +12 -14
- data/spec/unit/schema/rule_spec.rb +4 -2
- data/spec/unit/schema/value_spec.rb +38 -121
- metadata +150 -16
- data/lib/dry/validation/schema/attr.rb +0 -15
- data/spec/integration/attr_spec.rb +0 -122
@@ -0,0 +1,391 @@
|
|
1
|
+
RSpec.describe 'Predicates: Type' do
|
2
|
+
context 'with required' do
|
3
|
+
subject(:schema) do
|
4
|
+
Dry::Validation.Form do
|
5
|
+
required(:foo) { type?(Integer) }
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
context 'with valid input' do
|
10
|
+
let(:input) { { 'foo' => '23' } }
|
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', 'must be Integer']
|
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 Integer']
|
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 Integer']
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
context 'with invalid type' do
|
42
|
+
let(:input) { { 'foo' => ['x'] } }
|
43
|
+
|
44
|
+
it 'is not successful' do
|
45
|
+
expect(result).to be_failing ['must be Integer']
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'with optional' do
|
51
|
+
subject(:schema) do
|
52
|
+
Dry::Validation.Form do
|
53
|
+
optional(:foo) { type?(Integer) }
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context 'with valid input' do
|
58
|
+
let(:input) { { 'foo' => '23' } }
|
59
|
+
|
60
|
+
it 'is successful' do
|
61
|
+
expect(result).to be_successful
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'with missing input' do
|
66
|
+
let(:input) { {} }
|
67
|
+
|
68
|
+
it 'is successful' do
|
69
|
+
expect(result).to be_successful
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
context 'with nil input' do
|
74
|
+
let(:input) { { 'foo' => nil } }
|
75
|
+
|
76
|
+
it 'is not successful' do
|
77
|
+
expect(result).to be_failing ['must be Integer']
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'with blank input' do
|
82
|
+
let(:input) { { 'foo' => '' } }
|
83
|
+
|
84
|
+
it 'is not successful' do
|
85
|
+
expect(result).to be_failing ['must be Integer']
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
context 'with invalid type' do
|
90
|
+
let(:input) { { 'foo' => ['x'] } }
|
91
|
+
|
92
|
+
it 'is not successful' do
|
93
|
+
expect(result).to be_failing ['must be Integer']
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'as macro' do
|
99
|
+
context 'with required' do
|
100
|
+
context 'with value' do
|
101
|
+
subject(:schema) do
|
102
|
+
Dry::Validation.Form do
|
103
|
+
required(:foo).value(type?: Integer)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'with valid input' do
|
108
|
+
let(:input) { { 'foo' => '23' } }
|
109
|
+
|
110
|
+
it 'is successful' do
|
111
|
+
expect(result).to be_successful
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
context 'with missing input' do
|
116
|
+
let(:input) { {} }
|
117
|
+
|
118
|
+
it 'is not successful' do
|
119
|
+
expect(result).to be_failing ['is missing', 'must be Integer']
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
context 'with nil input' do
|
124
|
+
let(:input) { { 'foo' => nil } }
|
125
|
+
|
126
|
+
it 'is not successful' do
|
127
|
+
expect(result).to be_failing ['must be Integer']
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
context 'with blank input' do
|
132
|
+
let(:input) { { 'foo' => '' } }
|
133
|
+
|
134
|
+
it 'is not successful' do
|
135
|
+
expect(result).to be_failing ['must be Integer']
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
context 'with invalid type' do
|
140
|
+
let(:input) { { 'foo' => ['x'] } }
|
141
|
+
|
142
|
+
it 'is not successful' do
|
143
|
+
expect(result).to be_failing ['must be Integer']
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
context 'with filled' do
|
149
|
+
subject(:schema) do
|
150
|
+
Dry::Validation.Form do
|
151
|
+
required(:foo).filled(type?: Integer)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
context 'with valid input' do
|
156
|
+
let(:input) { { 'foo' => '23' } }
|
157
|
+
|
158
|
+
it 'is successful' do
|
159
|
+
expect(result).to be_successful
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
context 'with missing input' do
|
164
|
+
let(:input) { {} }
|
165
|
+
|
166
|
+
it 'is not successful' do
|
167
|
+
expect(result).to be_failing ['is missing', 'must be Integer']
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
171
|
+
context 'with nil input' do
|
172
|
+
let(:input) { { 'foo' => nil } }
|
173
|
+
|
174
|
+
it 'is not successful' do
|
175
|
+
expect(result).to be_failing ['must be filled', 'must be Integer']
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
context 'with blank input' do
|
180
|
+
let(:input) { { 'foo' => '' } }
|
181
|
+
|
182
|
+
it 'is not successful' do
|
183
|
+
expect(result).to be_failing ['must be filled', 'must be Integer']
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
context 'with invalid type' do
|
188
|
+
let(:input) { { 'foo' => ['x'] } }
|
189
|
+
|
190
|
+
it 'is not successful' do
|
191
|
+
expect(result).to be_failing ['must be Integer']
|
192
|
+
end
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
context 'with maybe' do
|
197
|
+
subject(:schema) do
|
198
|
+
Dry::Validation.Form do
|
199
|
+
required(:foo).maybe(type?: Integer)
|
200
|
+
end
|
201
|
+
end
|
202
|
+
|
203
|
+
context 'with valid input' do
|
204
|
+
let(:input) { { 'foo' => '23' } }
|
205
|
+
|
206
|
+
it 'is successful' do
|
207
|
+
expect(result).to be_successful
|
208
|
+
end
|
209
|
+
end
|
210
|
+
|
211
|
+
context 'with missing input' do
|
212
|
+
let(:input) { {} }
|
213
|
+
|
214
|
+
it 'is not successful' do
|
215
|
+
expect(result).to be_failing ['is missing', 'must be Integer']
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
context 'with nil input' do
|
220
|
+
let(:input) { { 'foo' => nil } }
|
221
|
+
|
222
|
+
it 'is successful' do
|
223
|
+
expect(result).to be_successful
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
context 'with blank input' do
|
228
|
+
let(:input) { { 'foo' => '' } }
|
229
|
+
|
230
|
+
it 'is successful' do
|
231
|
+
expect(result).to be_successful
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
context 'with invalid type' do
|
236
|
+
let(:input) { { 'foo' => ['x'] } }
|
237
|
+
|
238
|
+
it 'is not successful' do
|
239
|
+
expect(result).to be_failing ['must be Integer']
|
240
|
+
end
|
241
|
+
end
|
242
|
+
end
|
243
|
+
end
|
244
|
+
|
245
|
+
context 'with optional' do
|
246
|
+
context 'with value' do
|
247
|
+
subject(:schema) do
|
248
|
+
Dry::Validation.Form do
|
249
|
+
optional(:foo).value(type?: Integer)
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
context 'with valid input' do
|
254
|
+
let(:input) { { 'foo' => '23' } }
|
255
|
+
|
256
|
+
it 'is successful' do
|
257
|
+
expect(result).to be_successful
|
258
|
+
end
|
259
|
+
end
|
260
|
+
|
261
|
+
context 'with missing input' do
|
262
|
+
let(:input) { {} }
|
263
|
+
|
264
|
+
it 'is successful' do
|
265
|
+
expect(result).to be_successful
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
context 'with nil input' do
|
270
|
+
let(:input) { { 'foo' => nil } }
|
271
|
+
|
272
|
+
it 'is not successful' do
|
273
|
+
expect(result).to be_failing ['must be Integer']
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
context 'with blank input' do
|
278
|
+
let(:input) { { 'foo' => '' } }
|
279
|
+
|
280
|
+
it 'is not successful' do
|
281
|
+
expect(result).to be_failing ['must be Integer']
|
282
|
+
end
|
283
|
+
end
|
284
|
+
|
285
|
+
context 'with invalid type' do
|
286
|
+
let(:input) { { 'foo' => ['x'] } }
|
287
|
+
|
288
|
+
it 'is not successful' do
|
289
|
+
expect(result).to be_failing ['must be Integer']
|
290
|
+
end
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
context 'with filled' do
|
295
|
+
subject(:schema) do
|
296
|
+
Dry::Validation.Form do
|
297
|
+
optional(:foo).filled(type?: Integer)
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
context 'with valid input' do
|
302
|
+
let(:input) { { 'foo' => '23' } }
|
303
|
+
|
304
|
+
it 'is successful' do
|
305
|
+
expect(result).to be_successful
|
306
|
+
end
|
307
|
+
end
|
308
|
+
|
309
|
+
context 'with missing input' do
|
310
|
+
let(:input) { {} }
|
311
|
+
|
312
|
+
it 'is successful' do
|
313
|
+
expect(result).to be_successful
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
context 'with nil input' do
|
318
|
+
let(:input) { { 'foo' => nil } }
|
319
|
+
|
320
|
+
it 'is not successful' do
|
321
|
+
expect(result).to be_failing ['must be filled', 'must be Integer']
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
context 'with blank input' do
|
326
|
+
let(:input) { { 'foo' => '' } }
|
327
|
+
|
328
|
+
it 'is not successful' do
|
329
|
+
expect(result).to be_failing ['must be filled', 'must be Integer']
|
330
|
+
end
|
331
|
+
end
|
332
|
+
|
333
|
+
context 'with invalid type' do
|
334
|
+
let(:input) { { 'foo' => ['x'] } }
|
335
|
+
|
336
|
+
it 'is not successful' do
|
337
|
+
expect(result).to be_failing ['must be Integer']
|
338
|
+
end
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
342
|
+
context 'with maybe' do
|
343
|
+
subject(:schema) do
|
344
|
+
Dry::Validation.Form do
|
345
|
+
optional(:foo).maybe(type?: Integer)
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
context 'with valid input' do
|
350
|
+
let(:input) { { 'foo' => '23' } }
|
351
|
+
|
352
|
+
it 'is successful' do
|
353
|
+
expect(result).to be_successful
|
354
|
+
end
|
355
|
+
end
|
356
|
+
|
357
|
+
context 'with missing input' do
|
358
|
+
let(:input) { {} }
|
359
|
+
|
360
|
+
it 'is successful' do
|
361
|
+
expect(result).to be_successful
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
context 'with nil input' do
|
366
|
+
let(:input) { { 'foo' => nil } }
|
367
|
+
|
368
|
+
it 'is successful' do
|
369
|
+
expect(result).to be_successful
|
370
|
+
end
|
371
|
+
end
|
372
|
+
|
373
|
+
context 'with blank input' do
|
374
|
+
let(:input) { { 'foo' => '' } }
|
375
|
+
|
376
|
+
it 'is successful' do
|
377
|
+
expect(result).to be_successful
|
378
|
+
end
|
379
|
+
end
|
380
|
+
|
381
|
+
context 'with invalid type' do
|
382
|
+
let(:input) { { 'foo' => ['x'] } }
|
383
|
+
|
384
|
+
it 'is not successful' do
|
385
|
+
expect(result).to be_failing ['must be Integer']
|
386
|
+
end
|
387
|
+
end
|
388
|
+
end
|
389
|
+
end
|
390
|
+
end
|
391
|
+
end
|
@@ -18,7 +18,7 @@ RSpec.describe 'Validation hints' do
|
|
18
18
|
context 'with yaml messages' do
|
19
19
|
subject(:schema) do
|
20
20
|
Dry::Validation.Schema do
|
21
|
-
|
21
|
+
required(:age) do |age|
|
22
22
|
age.none? | (age.int? & age.gt?(18))
|
23
23
|
end
|
24
24
|
end
|
@@ -32,7 +32,7 @@ RSpec.describe 'Validation hints' do
|
|
32
32
|
Dry::Validation.Schema do
|
33
33
|
configure { configure { |c| c.messages = :i18n } }
|
34
34
|
|
35
|
-
|
35
|
+
required(:age) do |age|
|
36
36
|
age.none? | (age.int? & age.gt?(18))
|
37
37
|
end
|
38
38
|
end
|
@@ -44,8 +44,8 @@ RSpec.describe 'Validation hints' do
|
|
44
44
|
context 'when type expectation is specified' do
|
45
45
|
subject(:schema) do
|
46
46
|
Dry::Validation.Schema do
|
47
|
-
|
48
|
-
|
47
|
+
required(:email).filled
|
48
|
+
required(:name).filled(:str?, size?: 5..25)
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
@@ -55,4 +55,90 @@ RSpec.describe 'Validation hints' do
|
|
55
55
|
)
|
56
56
|
end
|
57
57
|
end
|
58
|
+
|
59
|
+
context 'when predicate failed and there is a corresponding hint generated' do
|
60
|
+
subject(:schema) do
|
61
|
+
Dry::Validation.Schema do
|
62
|
+
required(:age).value(lt?: 23)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'provides only failure error message' do
|
67
|
+
result = schema.call(age: 23)
|
68
|
+
expect(result.messages).to eql(age: ['must be less than 23'])
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context 'with a nested schema with same rule names' do
|
73
|
+
subject(:schema) do
|
74
|
+
Dry::Validation.Schema do
|
75
|
+
required(:code).filled(:str?, eql?: 'foo')
|
76
|
+
|
77
|
+
required(:nested).schema do
|
78
|
+
required(:code).filled(:str?, eql?: 'bar')
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'provides error messages' do
|
84
|
+
result = schema.call(code: 'x', nested: { code: 'y' })
|
85
|
+
|
86
|
+
expect(result.messages).to eql(
|
87
|
+
code: ['must be equal to foo'],
|
88
|
+
nested: {
|
89
|
+
code: ['must be equal to bar']
|
90
|
+
}
|
91
|
+
)
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'provides hints' do
|
95
|
+
result = schema.call(code: '', nested: { code: '' })
|
96
|
+
|
97
|
+
expect(result.messages).to eql(
|
98
|
+
code: ['must be filled', 'must be equal to foo'],
|
99
|
+
nested: {
|
100
|
+
code: ['must be filled', 'must be equal to bar']
|
101
|
+
}
|
102
|
+
)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
context 'when the message uses input value' do
|
107
|
+
subject(:schema) do
|
108
|
+
Dry::Validation.Schema do
|
109
|
+
configure do
|
110
|
+
def self.messages
|
111
|
+
Messages.default.merge(
|
112
|
+
en: {
|
113
|
+
errors: {
|
114
|
+
blue?: {
|
115
|
+
failure: '%{value} is not equal to blue',
|
116
|
+
hint: 'must be equal to blue'
|
117
|
+
}
|
118
|
+
}
|
119
|
+
}
|
120
|
+
)
|
121
|
+
end
|
122
|
+
|
123
|
+
def blue?(value)
|
124
|
+
value == 'blue'
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
required(:pill).filled(:blue?)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
it 'provides a correct failure message' do
|
133
|
+
expect(schema.(pill: 'red').messages).to eql(
|
134
|
+
pill: ['red is not equal to blue']
|
135
|
+
)
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'provides a correct hint' do
|
139
|
+
expect(schema.(pill: nil).messages).to eql(
|
140
|
+
pill: ['must be filled', 'must be equal to blue']
|
141
|
+
)
|
142
|
+
end
|
143
|
+
end
|
58
144
|
end
|