dry-validation 0.12.0 → 1.6.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/CHANGELOG.md +696 -239
- data/LICENSE +1 -1
- data/README.md +15 -12
- data/config/errors.yml +3 -88
- data/dry-validation.gemspec +31 -17
- data/lib/dry-validation.rb +3 -1
- data/lib/dry/validation.rb +45 -28
- data/lib/dry/validation/config.rb +24 -0
- data/lib/dry/validation/constants.rb +43 -0
- data/lib/dry/validation/contract.rb +171 -0
- data/lib/dry/validation/contract/class_interface.rb +230 -0
- data/lib/dry/validation/evaluator.rb +224 -0
- data/lib/dry/validation/extensions/hints.rb +67 -0
- data/lib/dry/validation/extensions/monads.rb +24 -8
- data/lib/dry/validation/extensions/predicates_as_macros.rb +75 -0
- data/lib/dry/validation/failures.rb +70 -0
- data/lib/dry/validation/function.rb +44 -0
- data/lib/dry/validation/macro.rb +38 -0
- data/lib/dry/validation/macros.rb +104 -0
- data/lib/dry/validation/message.rb +80 -80
- data/lib/dry/validation/message_set.rb +80 -105
- data/lib/dry/validation/messages/resolver.rb +131 -0
- data/lib/dry/validation/result.rb +183 -41
- data/lib/dry/validation/rule.rb +135 -0
- data/lib/dry/validation/schema_ext.rb +19 -0
- data/lib/dry/validation/values.rb +104 -0
- data/lib/dry/validation/version.rb +3 -1
- metadata +47 -336
- data/.codeclimate.yml +0 -17
- data/.gitignore +0 -9
- data/.rspec +0 -3
- data/.travis.yml +0 -26
- data/CONTRIBUTING.md +0 -31
- data/Gemfile +0 -33
- 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/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 -135
- 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_compiler.rb +0 -192
- data/lib/dry/validation/message_compiler/visitor_opts.rb +0 -37
- data/lib/dry/validation/messages.rb +0 -14
- data/lib/dry/validation/messages/abstract.rb +0 -112
- data/lib/dry/validation/messages/i18n.rb +0 -35
- data/lib/dry/validation/messages/namespaced.rb +0 -32
- data/lib/dry/validation/messages/yaml.rb +0 -54
- data/lib/dry/validation/predicate_registry.rb +0 -115
- 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 -189
- 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/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 -6
- data/spec/fixtures/locales/pl.yml +0 -18
- data/spec/integration/custom_error_messages_spec.rb +0 -48
- 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 -94
- 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 -58
- 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,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
|