dry-validation 0.13.3 → 1.0.0.alpha1
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/CHANGELOG.md +15 -25
- data/LICENSE +1 -1
- data/README.md +9 -4
- data/lib/dry-validation.rb +2 -0
- data/lib/dry/validation.rb +8 -35
- data/lib/dry/validation/constants.rb +12 -0
- data/lib/dry/validation/contract.rb +132 -0
- data/lib/dry/validation/contract/class_interface.rb +114 -0
- data/lib/dry/validation/evaluator.rb +121 -0
- data/lib/dry/validation/extensions/monads.rb +23 -7
- data/lib/dry/validation/messages.rb +50 -6
- data/lib/dry/validation/result.rb +109 -45
- data/lib/dry/validation/rule.rb +37 -0
- data/lib/dry/validation/version.rb +3 -1
- metadata +36 -337
- data/.codeclimate.yml +0 -17
- data/.gitignore +0 -9
- data/.rspec +0 -3
- data/.travis.yml +0 -29
- data/CONTRIBUTING.md +0 -31
- data/Gemfile +0 -25
- data/Rakefile +0 -22
- data/benchmarks/benchmark_form_invalid.rb +0 -64
- data/benchmarks/benchmark_form_valid.rb +0 -64
- data/benchmarks/benchmark_schema_invalid_huge.rb +0 -52
- data/benchmarks/profile_schema_call_invalid.rb +0 -20
- data/benchmarks/profile_schema_call_valid.rb +0 -20
- data/benchmarks/profile_schema_definition.rb +0 -14
- data/benchmarks/profile_schema_huge_invalid.rb +0 -30
- data/benchmarks/profile_schema_messages_invalid.rb +0 -20
- data/benchmarks/suite.rb +0 -5
- data/config/errors.yml +0 -89
- data/dry-validation.gemspec +0 -28
- data/examples/basic.rb +0 -15
- data/examples/each.rb +0 -14
- data/examples/json.rb +0 -12
- data/examples/multiple.rb +0 -27
- data/examples/nested.rb +0 -22
- data/examples/params.rb +0 -11
- data/lib/dry/validation/compat/form.rb +0 -67
- data/lib/dry/validation/deprecations.rb +0 -24
- data/lib/dry/validation/executor.rb +0 -91
- data/lib/dry/validation/extensions.rb +0 -7
- data/lib/dry/validation/extensions/struct.rb +0 -32
- data/lib/dry/validation/input_processor_compiler.rb +0 -137
- data/lib/dry/validation/input_processor_compiler/json.rb +0 -45
- data/lib/dry/validation/input_processor_compiler/params.rb +0 -49
- data/lib/dry/validation/input_processor_compiler/sanitizer.rb +0 -47
- data/lib/dry/validation/message.rb +0 -98
- data/lib/dry/validation/message_compiler.rb +0 -188
- data/lib/dry/validation/message_compiler/visitor_opts.rb +0 -37
- data/lib/dry/validation/message_set.rb +0 -122
- data/lib/dry/validation/messages/abstract.rb +0 -119
- data/lib/dry/validation/messages/i18n.rb +0 -47
- data/lib/dry/validation/messages/namespaced.rb +0 -39
- data/lib/dry/validation/messages/yaml.rb +0 -61
- data/lib/dry/validation/predicate_registry.rb +0 -115
- data/lib/dry/validation/predicates.rb +0 -19
- data/lib/dry/validation/schema.rb +0 -126
- data/lib/dry/validation/schema/check.rb +0 -37
- data/lib/dry/validation/schema/class_interface.rb +0 -190
- data/lib/dry/validation/schema/deprecated.rb +0 -30
- data/lib/dry/validation/schema/dsl.rb +0 -118
- data/lib/dry/validation/schema/form.rb +0 -9
- data/lib/dry/validation/schema/json.rb +0 -21
- data/lib/dry/validation/schema/key.rb +0 -71
- data/lib/dry/validation/schema/params.rb +0 -22
- data/lib/dry/validation/schema/rule.rb +0 -202
- data/lib/dry/validation/schema/value.rb +0 -211
- data/lib/dry/validation/schema_compiler.rb +0 -81
- data/lib/dry/validation/template.rb +0 -66
- data/lib/dry/validation/type_specs.rb +0 -70
- data/spec/extensions/monads/result_spec.rb +0 -40
- data/spec/extensions/struct/schema_spec.rb +0 -32
- data/spec/fixtures/locales/en.yml +0 -8
- data/spec/fixtures/locales/pl.yml +0 -22
- data/spec/integration/custom_error_messages_spec.rb +0 -54
- data/spec/integration/custom_predicates_spec.rb +0 -228
- data/spec/integration/hints_spec.rb +0 -170
- data/spec/integration/injecting_rules_spec.rb +0 -30
- data/spec/integration/json/defining_base_schema_spec.rb +0 -41
- data/spec/integration/localized_error_messages_spec.rb +0 -72
- data/spec/integration/message_compiler_spec.rb +0 -405
- data/spec/integration/messages/i18n_spec.rb +0 -104
- data/spec/integration/optional_keys_spec.rb +0 -28
- data/spec/integration/params/predicates/array_spec.rb +0 -287
- data/spec/integration/params/predicates/empty_spec.rb +0 -263
- data/spec/integration/params/predicates/eql_spec.rb +0 -327
- data/spec/integration/params/predicates/even_spec.rb +0 -455
- data/spec/integration/params/predicates/excluded_from_spec.rb +0 -455
- data/spec/integration/params/predicates/excludes_spec.rb +0 -391
- data/spec/integration/params/predicates/false_spec.rb +0 -455
- data/spec/integration/params/predicates/filled_spec.rb +0 -467
- data/spec/integration/params/predicates/format_spec.rb +0 -454
- data/spec/integration/params/predicates/gt_spec.rb +0 -519
- data/spec/integration/params/predicates/gteq_spec.rb +0 -519
- data/spec/integration/params/predicates/included_in_spec.rb +0 -455
- data/spec/integration/params/predicates/includes_spec.rb +0 -391
- data/spec/integration/params/predicates/key_spec.rb +0 -67
- data/spec/integration/params/predicates/lt_spec.rb +0 -519
- data/spec/integration/params/predicates/lteq_spec.rb +0 -519
- data/spec/integration/params/predicates/max_size_spec.rb +0 -391
- data/spec/integration/params/predicates/min_size_spec.rb +0 -391
- data/spec/integration/params/predicates/none_spec.rb +0 -265
- data/spec/integration/params/predicates/not_eql_spec.rb +0 -327
- data/spec/integration/params/predicates/odd_spec.rb +0 -455
- data/spec/integration/params/predicates/size/fixed_spec.rb +0 -393
- data/spec/integration/params/predicates/size/range_spec.rb +0 -396
- data/spec/integration/params/predicates/true_spec.rb +0 -455
- data/spec/integration/params/predicates/type_spec.rb +0 -391
- data/spec/integration/result_spec.rb +0 -81
- data/spec/integration/schema/array_schema_spec.rb +0 -59
- data/spec/integration/schema/check_rules_spec.rb +0 -119
- data/spec/integration/schema/check_with_nested_el_spec.rb +0 -37
- data/spec/integration/schema/check_with_nth_el_spec.rb +0 -25
- data/spec/integration/schema/default_settings_spec.rb +0 -11
- data/spec/integration/schema/defining_base_schema_spec.rb +0 -41
- data/spec/integration/schema/dynamic_predicate_args_spec.rb +0 -43
- data/spec/integration/schema/each_with_set_spec.rb +0 -70
- data/spec/integration/schema/extending_dsl_spec.rb +0 -27
- data/spec/integration/schema/form_spec.rb +0 -236
- data/spec/integration/schema/hash_schema_spec.rb +0 -47
- data/spec/integration/schema/inheriting_schema_spec.rb +0 -31
- data/spec/integration/schema/input_processor_spec.rb +0 -46
- data/spec/integration/schema/json/explicit_types_spec.rb +0 -157
- data/spec/integration/schema/json_spec.rb +0 -163
- data/spec/integration/schema/macros/confirmation_spec.rb +0 -35
- data/spec/integration/schema/macros/each_spec.rb +0 -268
- data/spec/integration/schema/macros/filled_spec.rb +0 -87
- data/spec/integration/schema/macros/input_spec.rb +0 -139
- data/spec/integration/schema/macros/maybe_spec.rb +0 -99
- data/spec/integration/schema/macros/rule_spec.rb +0 -75
- data/spec/integration/schema/macros/value_spec.rb +0 -119
- data/spec/integration/schema/macros/when_spec.rb +0 -62
- data/spec/integration/schema/nested_schemas_spec.rb +0 -236
- data/spec/integration/schema/nested_values_spec.rb +0 -46
- data/spec/integration/schema/not_spec.rb +0 -34
- data/spec/integration/schema/numbers_spec.rb +0 -19
- data/spec/integration/schema/option_with_default_spec.rb +0 -64
- data/spec/integration/schema/or_spec.rb +0 -87
- data/spec/integration/schema/params/defining_base_schema_spec.rb +0 -41
- data/spec/integration/schema/params/explicit_types_spec.rb +0 -195
- data/spec/integration/schema/params_spec.rb +0 -234
- data/spec/integration/schema/predicate_verification_spec.rb +0 -9
- data/spec/integration/schema/predicates/array_spec.rb +0 -295
- data/spec/integration/schema/predicates/custom_spec.rb +0 -103
- data/spec/integration/schema/predicates/empty_spec.rb +0 -263
- data/spec/integration/schema/predicates/eql_spec.rb +0 -327
- data/spec/integration/schema/predicates/even_spec.rb +0 -455
- data/spec/integration/schema/predicates/excluded_from/array_spec.rb +0 -459
- data/spec/integration/schema/predicates/excluded_from/range_spec.rb +0 -459
- data/spec/integration/schema/predicates/excludes_spec.rb +0 -391
- data/spec/integration/schema/predicates/filled_spec.rb +0 -467
- data/spec/integration/schema/predicates/format_spec.rb +0 -455
- data/spec/integration/schema/predicates/gt_spec.rb +0 -519
- data/spec/integration/schema/predicates/gteq_spec.rb +0 -519
- data/spec/integration/schema/predicates/hash_spec.rb +0 -69
- data/spec/integration/schema/predicates/included_in/array_spec.rb +0 -459
- data/spec/integration/schema/predicates/included_in/range_spec.rb +0 -459
- data/spec/integration/schema/predicates/includes_spec.rb +0 -391
- data/spec/integration/schema/predicates/key_spec.rb +0 -88
- data/spec/integration/schema/predicates/lt_spec.rb +0 -520
- data/spec/integration/schema/predicates/lteq_spec.rb +0 -519
- data/spec/integration/schema/predicates/max_size_spec.rb +0 -391
- data/spec/integration/schema/predicates/min_size_spec.rb +0 -391
- data/spec/integration/schema/predicates/none_spec.rb +0 -265
- data/spec/integration/schema/predicates/not_eql_spec.rb +0 -391
- data/spec/integration/schema/predicates/odd_spec.rb +0 -455
- data/spec/integration/schema/predicates/size/fixed_spec.rb +0 -398
- data/spec/integration/schema/predicates/size/range_spec.rb +0 -395
- data/spec/integration/schema/predicates/type_spec.rb +0 -413
- data/spec/integration/schema/reusing_schema_spec.rb +0 -33
- data/spec/integration/schema/using_types_spec.rb +0 -135
- data/spec/integration/schema/validate_spec.rb +0 -120
- data/spec/integration/schema/xor_spec.rb +0 -35
- data/spec/integration/schema_builders_spec.rb +0 -17
- data/spec/integration/schema_spec.rb +0 -173
- data/spec/shared/message_compiler.rb +0 -11
- data/spec/shared/predicate_helper.rb +0 -15
- data/spec/shared/rule_compiler.rb +0 -8
- data/spec/spec_helper.rb +0 -62
- data/spec/support/define_struct.rb +0 -25
- data/spec/support/matchers.rb +0 -38
- data/spec/support/mutant.rb +0 -9
- data/spec/support/predicates_integration.rb +0 -7
- data/spec/unit/input_processor_compiler/json_spec.rb +0 -283
- data/spec/unit/input_processor_compiler/params_spec.rb +0 -328
- data/spec/unit/message_compiler/visit_failure_spec.rb +0 -38
- data/spec/unit/message_compiler/visit_spec.rb +0 -16
- data/spec/unit/message_compiler_spec.rb +0 -7
- data/spec/unit/predicate_registry_spec.rb +0 -34
- data/spec/unit/schema/key_spec.rb +0 -38
- data/spec/unit/schema/rule_spec.rb +0 -42
- data/spec/unit/schema/value_spec.rb +0 -131
- data/spec/unit/schema_spec.rb +0 -35
@@ -1,413 +0,0 @@
|
|
1
|
-
RSpec.describe 'Predicates: Type' do
|
2
|
-
context 'with required' do
|
3
|
-
subject(:schema) do
|
4
|
-
Dry::Validation.Schema 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.Schema 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.Schema 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.Schema 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.Schema 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 not successful' do
|
231
|
-
expect(result).to be_failing ['must be Integer']
|
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.Schema 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.Schema 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.Schema 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 not successful' do
|
377
|
-
expect(result).to be_failing ['must be Integer']
|
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
|
-
|
392
|
-
context 'with a custom class' do
|
393
|
-
subject(:schema) do
|
394
|
-
Dry::Validation.Schema do
|
395
|
-
required(:foo).value(type?: CustomClass)
|
396
|
-
end
|
397
|
-
end
|
398
|
-
|
399
|
-
around do |example|
|
400
|
-
CustomClass = Class.new
|
401
|
-
example.run
|
402
|
-
Object.send(:remove_const, :CustomClass)
|
403
|
-
end
|
404
|
-
|
405
|
-
it 'succeeds with valid input' do
|
406
|
-
expect(schema.(foo: CustomClass.new)).to be_success
|
407
|
-
end
|
408
|
-
|
409
|
-
it 'fails with invalid input' do
|
410
|
-
expect(schema.(foo: 'oops')).to be_failing ["must be #{CustomClass}"]
|
411
|
-
end
|
412
|
-
end
|
413
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
RSpec.describe 'Reusing schemas' do
|
2
|
-
subject(:schema) do
|
3
|
-
Dry::Validation.Schema do
|
4
|
-
required(:city).filled
|
5
|
-
|
6
|
-
required(:location).schema(LocationSchema)
|
7
|
-
end
|
8
|
-
end
|
9
|
-
|
10
|
-
before do
|
11
|
-
LocationSchema = Dry::Validation.Schema do
|
12
|
-
configure { config.input_processor = :params }
|
13
|
-
|
14
|
-
required(:lat).filled(:float?)
|
15
|
-
required(:lng).filled(:float?)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
after do
|
20
|
-
Object.send(:remove_const, :LocationSchema)
|
21
|
-
end
|
22
|
-
|
23
|
-
it 're-uses existing schema' do
|
24
|
-
expect(schema.(city: 'NYC', location: { lat: 1.23, lng: 45.6 })).to be_success
|
25
|
-
|
26
|
-
expect(schema.(city: 'NYC', location: { lat: nil, lng: '45.6' }).messages).to eql(
|
27
|
-
location: {
|
28
|
-
lat: ['must be filled'],
|
29
|
-
lng: ['must be a float']
|
30
|
-
}
|
31
|
-
)
|
32
|
-
end
|
33
|
-
end
|
@@ -1,135 +0,0 @@
|
|
1
|
-
RSpec.describe Dry::Validation::Schema, 'defining schema using dry types' do
|
2
|
-
subject(:schema) do
|
3
|
-
Dry::Validation.Schema do
|
4
|
-
required(:email).filled(Email)
|
5
|
-
required(:age).maybe(Age)
|
6
|
-
required(:country).filled(Country)
|
7
|
-
optional(:admin).maybe(AdminBit)
|
8
|
-
end
|
9
|
-
end
|
10
|
-
|
11
|
-
before do
|
12
|
-
Email = Dry::Types['strict.string']
|
13
|
-
Age = Dry::Types['strict.integer'].constrained(gt: 18)
|
14
|
-
Country = Dry::Types['strict.string'].enum('Australia', 'Poland')
|
15
|
-
AdminBit = Dry::Types['strict.bool']
|
16
|
-
end
|
17
|
-
|
18
|
-
after do
|
19
|
-
Object.send(:remove_const, :Email)
|
20
|
-
Object.send(:remove_const, :Age)
|
21
|
-
Object.send(:remove_const, :Country)
|
22
|
-
Object.send(:remove_const, :AdminBit)
|
23
|
-
end
|
24
|
-
|
25
|
-
it 'passes when input is valid' do
|
26
|
-
expect(schema.call(email: 'jane@doe', age: 19, country: 'Australia')).to be_success
|
27
|
-
expect(schema.call(email: 'jane@doe', age: nil, country: 'Poland')).to be_success
|
28
|
-
end
|
29
|
-
|
30
|
-
it 'fails when input is not valid' do
|
31
|
-
expect(schema.call(email: '', age: 19, country: 'New Zealand')).to_not be_success
|
32
|
-
expect(schema.call(email: 'jane@doe', age: 17)).to_not be_success
|
33
|
-
expect(schema.call(email: 'jane@doe', age: '19')).to_not be_success
|
34
|
-
end
|
35
|
-
|
36
|
-
it 'correctly responds to messages' do
|
37
|
-
expect(schema.call({}).messages).to eq(
|
38
|
-
age: ['is missing', 'must be Integer', 'must be greater than 18'],
|
39
|
-
country: ['is missing', 'must be String', 'must be one of: Australia, Poland'],
|
40
|
-
email: ['is missing', 'must be String']
|
41
|
-
)
|
42
|
-
end
|
43
|
-
|
44
|
-
it 'fails when sum-type rule did not pass' do
|
45
|
-
result = schema.call(email: 'jane@doe', age: 19, country: 'Australia', admin: 'foo')
|
46
|
-
expect(result.messages).to eql(
|
47
|
-
admin: ['must be TrueClass or must be FalseClass']
|
48
|
-
)
|
49
|
-
end
|
50
|
-
|
51
|
-
context 'custom coercions' do
|
52
|
-
subject(:schema) do
|
53
|
-
Dry::Validation.Schema do
|
54
|
-
configure { config.input_processor = :sanitizer }
|
55
|
-
|
56
|
-
required(:email).filled(Dry::Types['strict.string'].constructor(&:strip))
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
it 'applies custom types to input prior validation' do
|
61
|
-
result = schema.call(email: ' jane@doe.org ')
|
62
|
-
|
63
|
-
expect(result).to be_success
|
64
|
-
expect(result.to_h).to eql(email: 'jane@doe.org')
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
context 'custom types' do
|
69
|
-
subject(:schema) do
|
70
|
-
Dry::Validation.Params do
|
71
|
-
required(:quantity).filled(Dry::Types['strict.integer'].constrained(gt: 1))
|
72
|
-
required(:percentage).filled(Dry::Types['strict.decimal'].constrained(gt: 0, lt: 1))
|
73
|
-
required(:switch).filled(Dry::Types['strict.bool'])
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
it 'applies custom types to input prior validation' do
|
78
|
-
result = schema.call(quantity: '2', percentage: '0.5', switch: '0')
|
79
|
-
|
80
|
-
expect(result).to be_success
|
81
|
-
expect(result.to_h).to eql(quantity: 2, percentage: BigDecimal('0.5'), switch: false)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
context 'with a nested schema' do
|
86
|
-
subject(:schema) do
|
87
|
-
Dry::Validation.Schema do
|
88
|
-
required(:address).schema do
|
89
|
-
zip = Dry::Types['strict.string'].constrained(format: /\A[0-9]{5}(-[0-9]{4})?\z/)
|
90
|
-
|
91
|
-
required(:zip).filled(zip)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|
95
|
-
|
96
|
-
it 'returns success for valid input' do
|
97
|
-
expect(schema.(address: { zip: '12321' })).to be_success
|
98
|
-
end
|
99
|
-
|
100
|
-
it 'returns failure for invalid input' do
|
101
|
-
expect(schema.(address: { zip: '12-321' })).to be_failure
|
102
|
-
end
|
103
|
-
|
104
|
-
it 'returns messages for invalid input' do
|
105
|
-
expect(schema.(address: nil).messages).to eql(
|
106
|
-
address: ['must be a hash']
|
107
|
-
)
|
108
|
-
end
|
109
|
-
|
110
|
-
it 'returns error messages for invalid input' do
|
111
|
-
expect(schema.(address: {}).errors).to eql(
|
112
|
-
address: { zip: ['is missing'] }
|
113
|
-
)
|
114
|
-
|
115
|
-
expect(schema.(address: { zip: '12-321' }).errors).to eql(
|
116
|
-
address: { zip: ['is in invalid format'] }
|
117
|
-
)
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
context 'with each' do
|
122
|
-
subject(:schema) do
|
123
|
-
Dry::Validation.Schema do
|
124
|
-
required(:countries).each(Country)
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
it 'applies type constraint checks to each element' do
|
129
|
-
result = schema.call(countries: %w(Poland Australia))
|
130
|
-
|
131
|
-
expect(result).to be_success
|
132
|
-
expect(result.to_h).to eql(countries: %w(Poland Australia))
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|