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.
Files changed (143) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +9 -6
  4. data/CHANGELOG.md +58 -0
  5. data/Gemfile +3 -3
  6. data/benchmarks/benchmark_form_invalid.rb +64 -0
  7. data/benchmarks/benchmark_form_valid.rb +64 -0
  8. data/benchmarks/profile_schema_call_invalid.rb +20 -0
  9. data/benchmarks/profile_schema_call_valid.rb +20 -0
  10. data/benchmarks/profile_schema_definition.rb +14 -0
  11. data/benchmarks/profile_schema_messages_invalid.rb +20 -0
  12. data/benchmarks/suite.rb +5 -0
  13. data/config/errors.yml +12 -5
  14. data/dry-validation.gemspec +2 -2
  15. data/examples/basic.rb +2 -2
  16. data/examples/form.rb +2 -2
  17. data/examples/json.rb +2 -2
  18. data/examples/nested.rb +6 -6
  19. data/lib/dry/validation.rb +22 -3
  20. data/lib/dry/validation/deprecations.rb +23 -0
  21. data/lib/dry/validation/error_compiler.rb +31 -11
  22. data/lib/dry/validation/error_compiler/input.rb +44 -57
  23. data/lib/dry/validation/hint_compiler.rb +15 -7
  24. data/lib/dry/validation/input_processor_compiler.rb +13 -6
  25. data/lib/dry/validation/input_processor_compiler/form.rb +2 -0
  26. data/lib/dry/validation/input_processor_compiler/sanitizer.rb +1 -1
  27. data/lib/dry/validation/messages/abstract.rb +9 -1
  28. data/lib/dry/validation/predicate_registry.rb +101 -0
  29. data/lib/dry/validation/result.rb +8 -1
  30. data/lib/dry/validation/schema.rb +110 -44
  31. data/lib/dry/validation/schema/check.rb +4 -2
  32. data/lib/dry/validation/schema/deprecated.rb +31 -0
  33. data/lib/dry/validation/schema/dsl.rb +18 -11
  34. data/lib/dry/validation/schema/form.rb +1 -0
  35. data/lib/dry/validation/schema/json.rb +1 -0
  36. data/lib/dry/validation/schema/key.rb +23 -10
  37. data/lib/dry/validation/schema/rule.rb +81 -20
  38. data/lib/dry/validation/schema/value.rb +110 -25
  39. data/lib/dry/validation/version.rb +1 -1
  40. data/spec/fixtures/locales/en.yml +1 -0
  41. data/spec/fixtures/locales/pl.yml +1 -1
  42. data/spec/integration/custom_error_messages_spec.rb +2 -2
  43. data/spec/integration/custom_predicates_spec.rb +98 -15
  44. data/spec/integration/error_compiler_spec.rb +111 -96
  45. data/spec/integration/form/predicates/array_spec.rb +243 -0
  46. data/spec/integration/form/predicates/empty_spec.rb +263 -0
  47. data/spec/integration/form/predicates/eql_spec.rb +327 -0
  48. data/spec/integration/form/predicates/even_spec.rb +455 -0
  49. data/spec/integration/form/predicates/excluded_from_spec.rb +455 -0
  50. data/spec/integration/form/predicates/excludes_spec.rb +391 -0
  51. data/spec/integration/form/predicates/false_spec.rb +455 -0
  52. data/spec/integration/form/predicates/filled_spec.rb +467 -0
  53. data/spec/integration/form/predicates/format_spec.rb +454 -0
  54. data/spec/integration/form/predicates/gt_spec.rb +519 -0
  55. data/spec/integration/form/predicates/gteq_spec.rb +519 -0
  56. data/spec/integration/form/predicates/included_in_spec.rb +455 -0
  57. data/spec/integration/form/predicates/includes_spec.rb +391 -0
  58. data/spec/integration/form/predicates/key_spec.rb +75 -0
  59. data/spec/integration/form/predicates/lt_spec.rb +519 -0
  60. data/spec/integration/form/predicates/lteq_spec.rb +519 -0
  61. data/spec/integration/form/predicates/max_size_spec.rb +391 -0
  62. data/spec/integration/form/predicates/min_size_spec.rb +391 -0
  63. data/spec/integration/form/predicates/none_spec.rb +265 -0
  64. data/spec/integration/form/predicates/not_eql_spec.rb +327 -0
  65. data/spec/integration/form/predicates/odd_spec.rb +455 -0
  66. data/spec/integration/form/predicates/size/fixed_spec.rb +399 -0
  67. data/spec/integration/form/predicates/size/range_spec.rb +398 -0
  68. data/spec/integration/form/predicates/true_spec.rb +455 -0
  69. data/spec/integration/form/predicates/type_spec.rb +391 -0
  70. data/spec/integration/hints_spec.rb +90 -4
  71. data/spec/integration/injecting_rules_spec.rb +2 -2
  72. data/spec/integration/localized_error_messages_spec.rb +2 -2
  73. data/spec/integration/messages/i18n_spec.rb +3 -3
  74. data/spec/integration/optional_keys_spec.rb +3 -3
  75. data/spec/integration/schema/array_schema_spec.rb +49 -13
  76. data/spec/integration/schema/check_rules_spec.rb +6 -6
  77. data/spec/integration/schema/check_with_nested_el_spec.rb +3 -3
  78. data/spec/integration/schema/check_with_nth_el_spec.rb +1 -1
  79. data/spec/integration/schema/each_with_set_spec.rb +3 -3
  80. data/spec/integration/schema/extending_dsl_spec.rb +27 -0
  81. data/spec/integration/schema/form/explicit_types_spec.rb +182 -0
  82. data/spec/integration/schema/form_spec.rb +90 -18
  83. data/spec/integration/schema/hash_schema_spec.rb +47 -0
  84. data/spec/integration/schema/inheriting_schema_spec.rb +4 -4
  85. data/spec/integration/schema/input_processor_spec.rb +8 -8
  86. data/spec/integration/schema/json/explicit_types_spec.rb +157 -0
  87. data/spec/integration/schema/json_spec.rb +18 -18
  88. data/spec/integration/schema/macros/confirmation_spec.rb +1 -1
  89. data/spec/integration/schema/macros/each_spec.rb +177 -43
  90. data/spec/integration/schema/macros/{required_spec.rb → filled_spec.rb} +34 -6
  91. data/spec/integration/schema/macros/input_spec.rb +21 -0
  92. data/spec/integration/schema/macros/maybe_spec.rb +39 -2
  93. data/spec/integration/schema/macros/value_spec.rb +105 -0
  94. data/spec/integration/schema/macros/when_spec.rb +28 -8
  95. data/spec/integration/schema/nested_values_spec.rb +11 -8
  96. data/spec/integration/schema/not_spec.rb +2 -2
  97. data/spec/integration/schema/numbers_spec.rb +1 -1
  98. data/spec/integration/schema/option_with_default_spec.rb +1 -1
  99. data/spec/integration/schema/predicate_verification_spec.rb +9 -0
  100. data/spec/integration/schema/predicates/array_spec.rb +295 -0
  101. data/spec/integration/schema/predicates/custom_spec.rb +103 -0
  102. data/spec/integration/schema/predicates/empty_spec.rb +263 -0
  103. data/spec/integration/schema/predicates/eql_spec.rb +327 -0
  104. data/spec/integration/schema/predicates/even_spec.rb +455 -0
  105. data/spec/integration/schema/predicates/excluded_from_spec.rb +455 -0
  106. data/spec/integration/schema/predicates/excludes_spec.rb +391 -0
  107. data/spec/integration/schema/predicates/filled_spec.rb +467 -0
  108. data/spec/integration/schema/predicates/format_spec.rb +455 -0
  109. data/spec/integration/schema/predicates/gt_spec.rb +519 -0
  110. data/spec/integration/schema/predicates/gteq_spec.rb +519 -0
  111. data/spec/integration/schema/predicates/hash_spec.rb +69 -0
  112. data/spec/integration/schema/predicates/included_in_spec.rb +455 -0
  113. data/spec/integration/schema/predicates/includes_spec.rb +391 -0
  114. data/spec/integration/schema/predicates/key_spec.rb +88 -0
  115. data/spec/integration/schema/predicates/lt_spec.rb +520 -0
  116. data/spec/integration/schema/predicates/lteq_spec.rb +519 -0
  117. data/spec/integration/schema/predicates/max_size_spec.rb +391 -0
  118. data/spec/integration/schema/predicates/min_size_spec.rb +391 -0
  119. data/spec/integration/schema/predicates/none_spec.rb +265 -0
  120. data/spec/integration/schema/predicates/not_eql_spec.rb +391 -0
  121. data/spec/integration/schema/predicates/odd_spec.rb +455 -0
  122. data/spec/integration/schema/predicates/size/fixed_spec.rb +401 -0
  123. data/spec/integration/schema/predicates/size/range_spec.rb +399 -0
  124. data/spec/integration/schema/predicates/type_spec.rb +391 -0
  125. data/spec/integration/schema/reusing_schema_spec.rb +4 -4
  126. data/spec/integration/schema/using_types_spec.rb +24 -6
  127. data/spec/integration/schema/xor_spec.rb +2 -2
  128. data/spec/integration/schema_builders_spec.rb +15 -0
  129. data/spec/integration/schema_spec.rb +37 -12
  130. data/spec/shared/predicate_helper.rb +13 -0
  131. data/spec/spec_helper.rb +10 -0
  132. data/spec/support/matchers.rb +38 -0
  133. data/spec/support/predicates_integration.rb +7 -0
  134. data/spec/unit/hint_compiler_spec.rb +10 -8
  135. data/spec/unit/input_processor_compiler/form_spec.rb +45 -43
  136. data/spec/unit/input_processor_compiler/json_spec.rb +37 -35
  137. data/spec/unit/predicate_registry_spec.rb +34 -0
  138. data/spec/unit/schema/key_spec.rb +12 -14
  139. data/spec/unit/schema/rule_spec.rb +4 -2
  140. data/spec/unit/schema/value_spec.rb +38 -121
  141. metadata +150 -16
  142. data/lib/dry/validation/schema/attr.rb +0 -15
  143. data/spec/integration/attr_spec.rb +0 -122
@@ -0,0 +1,265 @@
1
+ RSpec.describe 'Predicates: None' do
2
+ context 'with required' do
3
+ subject(:schema) do
4
+ Dry::Validation.Form do
5
+ required(:foo) { none? }
6
+ end
7
+ end
8
+
9
+ context 'with missing input' do
10
+ let(:input) { {} }
11
+
12
+ it 'is not successful' do
13
+ expect(result).to be_failing ['is missing']
14
+ end
15
+ end
16
+
17
+ context 'with nil input' do
18
+ let(:input) { { 'foo' => nil } }
19
+
20
+ it 'is successful' do
21
+ expect(result).to be_successful
22
+ end
23
+ end
24
+
25
+ context 'with blank input' do
26
+ let(:input) { { 'foo' => '' } }
27
+
28
+ it 'is successful' do
29
+ expect(result).to be_successful
30
+ end
31
+ end
32
+
33
+ context 'with other input' do
34
+ let(:input) { { 'foo' => '23' } }
35
+
36
+ it 'is not successful' do
37
+ expect(result).to be_failing ['cannot be defined']
38
+ end
39
+ end
40
+ end
41
+
42
+ context 'with optional' do
43
+ subject(:schema) do
44
+ Dry::Validation.Form do
45
+ optional(:foo) { none? }
46
+ end
47
+ end
48
+
49
+ context 'with missing input' do
50
+ let(:input) { {} }
51
+
52
+ it 'is successful' do
53
+ expect(result).to be_successful
54
+ end
55
+ end
56
+
57
+ context 'with nil input' do
58
+ let(:input) { { 'foo' => nil } }
59
+
60
+ it 'is successful' do
61
+ expect(result).to be_successful
62
+ end
63
+ end
64
+
65
+ context 'with blank input' do
66
+ let(:input) { { 'foo' => '' } }
67
+
68
+ it 'is successful' do
69
+ expect(result).to be_successful
70
+ end
71
+ end
72
+
73
+ context 'with other input' do
74
+ let(:input) { { 'foo' => '23' } }
75
+
76
+ it 'is not successful' do
77
+ expect(result).to be_failing ['cannot be defined']
78
+ end
79
+ end
80
+ end
81
+
82
+ context 'as macro' do
83
+ context 'with required' do
84
+ context 'with value' do
85
+ subject(:schema) do
86
+ Dry::Validation.Form do
87
+ required(:foo).value(:none?)
88
+ end
89
+ end
90
+
91
+ context 'with missing input' do
92
+ let(:input) { {} }
93
+
94
+ it 'is not successful' do
95
+ expect(result).to be_failing ['is missing']
96
+ end
97
+ end
98
+
99
+ context 'with nil input' do
100
+ let(:input) { { 'foo' => nil } }
101
+
102
+ it 'is successful' do
103
+ expect(result).to be_successful
104
+ end
105
+ end
106
+
107
+ context 'with blank input' do
108
+ let(:input) { { 'foo' => '' } }
109
+
110
+ it 'is successful' do
111
+ expect(result).to be_successful
112
+ end
113
+ end
114
+
115
+ context 'with other input' do
116
+ let(:input) { { 'foo' => '23' } }
117
+
118
+ it 'is not successful' do
119
+ expect(result).to be_failing ['cannot be defined']
120
+ end
121
+ end
122
+ end
123
+
124
+ context 'with filled' do
125
+ subject(:schema) do
126
+ Dry::Validation.Form do
127
+ required(:foo).filled(:none?)
128
+ end
129
+ end
130
+
131
+ context 'with missing input' do
132
+ let(:input) { {} }
133
+
134
+ it 'is not successful' do
135
+ expect(result).to be_failing ['is missing']
136
+ end
137
+ end
138
+
139
+ context 'with nil input' do
140
+ let(:input) { { 'foo' => nil } }
141
+
142
+ it 'is not successful' do
143
+ expect(result).to be_failing ['must be filled']
144
+ end
145
+ end
146
+
147
+ context 'with blank input' do
148
+ let(:input) { { 'foo' => '' } }
149
+
150
+ it 'is not successful' do
151
+ expect(result).to be_failing ['must be filled']
152
+ end
153
+ end
154
+
155
+ context 'with other input' do
156
+ let(:input) { { 'foo' => '23' } }
157
+
158
+ it 'is not successful' do
159
+ expect(result).to be_failing ['cannot be defined']
160
+ end
161
+ end
162
+ end
163
+
164
+ #makes no sense see: #134
165
+ context 'with maybe' do
166
+ it "should raise error" do
167
+ expect { Dry::Validation.Form do
168
+ required(:foo).maybe(:none?)
169
+ end }.to raise_error InvalidSchemaError
170
+ end
171
+ end
172
+ end
173
+
174
+ context 'with optional' do
175
+ context 'with value' do
176
+ subject(:schema) do
177
+ Dry::Validation.Form do
178
+ optional(:foo).value(:none?)
179
+ end
180
+ end
181
+
182
+ context 'with missing input' do
183
+ let(:input) { {} }
184
+
185
+ it 'is successful' do
186
+ expect(result).to be_successful
187
+ end
188
+ end
189
+
190
+ context 'with nil input' do
191
+ let(:input) { { 'foo' => nil } }
192
+
193
+ it 'is successful' do
194
+ expect(result).to be_successful
195
+ end
196
+ end
197
+
198
+ context 'with blank input' do
199
+ let(:input) { { 'foo' => '' } }
200
+
201
+ it 'is successful' do
202
+ expect(result).to be_successful
203
+ end
204
+ end
205
+
206
+ context 'with other input' do
207
+ let(:input) { { 'foo' => '23' } }
208
+
209
+ it 'is not successful' do
210
+ expect(result).to be_failing ['cannot be defined']
211
+ end
212
+ end
213
+ end
214
+
215
+ context 'with filled' do
216
+ subject(:schema) do
217
+ Dry::Validation.Form do
218
+ optional(:foo).filled(:none?)
219
+ end
220
+ end
221
+
222
+ context 'with missing input' do
223
+ let(:input) { {} }
224
+
225
+ it 'is successful' do
226
+ expect(result).to be_successful
227
+ end
228
+ end
229
+
230
+ context 'with nil input' do
231
+ let(:input) { { 'foo' => nil } }
232
+
233
+ it 'is not successful' do
234
+ expect(result).to be_failing ['must be filled']
235
+ end
236
+ end
237
+
238
+ context 'with blank input' do
239
+ let(:input) { { 'foo' => '' } }
240
+
241
+ it 'is not successful' do
242
+ expect(result).to be_failing ['must be filled']
243
+ end
244
+ end
245
+
246
+ context 'with other input' do
247
+ let(:input) { { 'foo' => '23' } }
248
+
249
+ it 'is not successful' do
250
+ expect(result).to be_failing ['cannot be defined']
251
+ end
252
+ end
253
+ end
254
+
255
+ #makes no sense see: #134
256
+ context 'with maybe' do
257
+ it "should raise error" do
258
+ expect { Dry::Validation.Form do
259
+ optional(:foo).maybe(:none?)
260
+ end }.to raise_error InvalidSchemaError
261
+ end
262
+ end
263
+ end
264
+ end
265
+ end
@@ -0,0 +1,327 @@
1
+ RSpec.describe 'Predicates: Not Eql' do
2
+ context 'with required' do
3
+ subject(:schema) do
4
+ Dry::Validation.Form do
5
+ required(:foo) { not_eql?('23') }
6
+ end
7
+ end
8
+
9
+ context 'with valid input' do
10
+ let(:input) { { 'foo' => '13' } }
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 not be equal to 23']
22
+ end
23
+ end
24
+
25
+ context 'with nil input' do
26
+ let(:input) { { 'foo' => nil } }
27
+
28
+ it 'is successful' do
29
+ expect(result).to be_successful
30
+ end
31
+ end
32
+
33
+ context 'with blank input' do
34
+ let(:input) { { 'foo' => '' } }
35
+
36
+ it 'is successful' do
37
+ expect(result).to be_successful
38
+ end
39
+ end
40
+ end
41
+
42
+ context 'with optional' do
43
+ subject(:schema) do
44
+ Dry::Validation.Form do
45
+ optional(:foo) { not_eql?('23') }
46
+ end
47
+ end
48
+
49
+ context 'with valid input' do
50
+ let(:input) { { 'foo' => '13' } }
51
+
52
+ it 'is successful' do
53
+ expect(result).to be_successful
54
+ end
55
+ end
56
+
57
+ context 'with missing input' do
58
+ let(:input) { {} }
59
+
60
+ it 'is successful' do
61
+ expect(result).to be_successful
62
+ end
63
+ end
64
+
65
+ context 'with nil input' do
66
+ let(:input) { { 'foo' => nil } }
67
+
68
+ it 'is successful' do
69
+ expect(result).to be_successful
70
+ end
71
+ end
72
+
73
+ context 'with blank input' do
74
+ let(:input) { { 'foo' => '' } }
75
+
76
+ it 'is successful' do
77
+ expect(result).to be_successful
78
+ end
79
+ end
80
+ end
81
+
82
+ context 'as macro' do
83
+ context 'with required' do
84
+ context 'with value' do
85
+ subject(:schema) do
86
+ Dry::Validation.Form do
87
+ required(:foo).value(not_eql?: '23')
88
+ end
89
+ end
90
+
91
+ context 'with valid input' do
92
+ let(:input) { { 'foo' => '13' } }
93
+
94
+ it 'is successful' do
95
+ expect(result).to be_successful
96
+ end
97
+ end
98
+
99
+ context 'with missing input' do
100
+ let(:input) { {} }
101
+
102
+ it 'is not successful' do
103
+ expect(result).to be_failing ['is missing', 'must not be equal to 23']
104
+ end
105
+ end
106
+
107
+ context 'with nil input' do
108
+ let(:input) { { 'foo' => nil } }
109
+
110
+ it 'is successful' do
111
+ expect(result).to be_successful
112
+ end
113
+ end
114
+
115
+ context 'with blank input' do
116
+ let(:input) { { 'foo' => '' } }
117
+
118
+ it 'is successful' do
119
+ expect(result).to be_successful
120
+ end
121
+ end
122
+ end
123
+
124
+ context 'with filled' do
125
+ subject(:schema) do
126
+ Dry::Validation.Form do
127
+ required(:foo).filled(not_eql?: '23')
128
+ end
129
+ end
130
+
131
+ context 'with valid input' do
132
+ let(:input) { { 'foo' => '13' } }
133
+
134
+ it 'is successful' do
135
+ expect(result).to be_successful
136
+ end
137
+ end
138
+
139
+ context 'with missing input' do
140
+ let(:input) { {} }
141
+
142
+ it 'is not successful' do
143
+ expect(result).to be_failing ['is missing', 'must not be equal to 23']
144
+ end
145
+ end
146
+
147
+ context 'with nil input' do
148
+ let(:input) { { 'foo' => nil } }
149
+
150
+ it 'is not successful' do
151
+ expect(result).to be_failing ['must be filled', 'must not be equal to 23']
152
+ end
153
+ end
154
+
155
+ context 'with blank input' do
156
+ let(:input) { { 'foo' => '' } }
157
+
158
+ it 'is not successful' do
159
+ expect(result).to be_failing ['must be filled', 'must not be equal to 23']
160
+ end
161
+ end
162
+ end
163
+
164
+ context 'with maybe' do
165
+ subject(:schema) do
166
+ Dry::Validation.Form do
167
+ required(:foo).maybe(not_eql?: '23')
168
+ end
169
+ end
170
+
171
+ context 'with valid input' do
172
+ let(:input) { { 'foo' => '13' } }
173
+
174
+ it 'is successful' do
175
+ expect(result).to be_successful
176
+ end
177
+ end
178
+
179
+ context 'with missing input' do
180
+ let(:input) { {} }
181
+
182
+ it 'is not successful' do
183
+ expect(result).to be_failing ['is missing', 'must not be equal to 23']
184
+ end
185
+ end
186
+
187
+ context 'with nil input' do
188
+ let(:input) { { 'foo' => nil } }
189
+
190
+ it 'is successful' do
191
+ expect(result).to be_successful
192
+ end
193
+ end
194
+
195
+ context 'with blank input' do
196
+ let(:input) { { 'foo' => '' } }
197
+
198
+ it 'is successful' do
199
+ expect(result).to be_successful
200
+ end
201
+ end
202
+ end
203
+ end
204
+
205
+ context 'with optional' do
206
+ context 'with value' do
207
+ subject(:schema) do
208
+ Dry::Validation.Form do
209
+ optional(:foo).value(not_eql?: '23')
210
+ end
211
+ end
212
+
213
+ context 'with valid input' do
214
+ let(:input) { { 'foo' => '13' } }
215
+
216
+ it 'is successful' do
217
+ expect(result).to be_successful
218
+ end
219
+ end
220
+
221
+ context 'with missing input' do
222
+ let(:input) { {} }
223
+
224
+ it 'is successful' do
225
+ expect(result).to be_successful
226
+ end
227
+ end
228
+
229
+ context 'with nil input' do
230
+ let(:input) { { 'foo' => nil } }
231
+
232
+ it 'is successful' do
233
+ expect(result).to be_successful
234
+ end
235
+ end
236
+
237
+ context 'with blank input' do
238
+ let(:input) { { 'foo' => '' } }
239
+
240
+ it 'is successful' do
241
+ expect(result).to be_successful
242
+ end
243
+ end
244
+ end
245
+
246
+ context 'with filled' do
247
+ subject(:schema) do
248
+ Dry::Validation.Form do
249
+ optional(:foo).filled(not_eql?: '23')
250
+ end
251
+ end
252
+
253
+ context 'with valid input' do
254
+ let(:input) { { 'foo' => '13' } }
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 filled', 'must not be equal to 23']
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 filled', 'must not be equal to 23']
282
+ end
283
+ end
284
+ end
285
+
286
+ context 'with maybe' do
287
+ subject(:schema) do
288
+ Dry::Validation.Form do
289
+ optional(:foo).maybe(not_eql?: '23')
290
+ end
291
+ end
292
+
293
+ context 'with valid input' do
294
+ let(:input) { { 'foo' => '13' } }
295
+
296
+ it 'is successful' do
297
+ expect(result).to be_successful
298
+ end
299
+ end
300
+
301
+ context 'with missing input' do
302
+ let(:input) { {} }
303
+
304
+ it 'is successful' do
305
+ expect(result).to be_successful
306
+ end
307
+ end
308
+
309
+ context 'with nil input' do
310
+ let(:input) { { 'foo' => nil } }
311
+
312
+ it 'is successful' do
313
+ expect(result).to be_successful
314
+ end
315
+ end
316
+
317
+ context 'with blank input' do
318
+ let(:input) { { 'foo' => '' } }
319
+
320
+ it 'is successful' do
321
+ expect(result).to be_successful
322
+ end
323
+ end
324
+ end
325
+ end
326
+ end
327
+ end