detox 1.0.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 (65) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.gitignore +19 -0
  4. data/.travis.yml +7 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE +20 -0
  7. data/README.md +40 -0
  8. data/Rakefile +11 -0
  9. data/detox.gemspec +27 -0
  10. data/gemfiles/activemodel_3_2_x.gemfile +5 -0
  11. data/gemfiles/activemodel_4_0_x.gemfile +5 -0
  12. data/lib/active_model/validations/absence.rb +19 -0
  13. data/lib/detox.rb +11 -0
  14. data/lib/detox/array_validity.rb +23 -0
  15. data/lib/detox/locales/en.yml +21 -0
  16. data/lib/detox/locales/ja.yml +21 -0
  17. data/lib/detox/validations/all.rb +41 -0
  18. data/lib/detox/validations/any.rb +57 -0
  19. data/lib/detox/validations/ordering.rb +34 -0
  20. data/lib/detox/validations/possession.rb +30 -0
  21. data/lib/detox/validity_broker.rb +55 -0
  22. data/lib/detox/version.rb +4 -0
  23. data/spec/detox/array_validity_spec.rb +214 -0
  24. data/spec/detox/validations/all_absence_spec.rb +147 -0
  25. data/spec/detox/validations/all_acceptance_spec.rb +352 -0
  26. data/spec/detox/validations/all_exclusion_spec.rb +137 -0
  27. data/spec/detox/validations/all_format_spec.rb +351 -0
  28. data/spec/detox/validations/all_inclusion_spec.rb +352 -0
  29. data/spec/detox/validations/all_length_spec.rb +388 -0
  30. data/spec/detox/validations/all_numericality_spec.rb +369 -0
  31. data/spec/detox/validations/all_presence_spec.rb +159 -0
  32. data/spec/detox/validations/any_absence_spec.rb +597 -0
  33. data/spec/detox/validations/any_acceptance_spec.rb +597 -0
  34. data/spec/detox/validations/any_exclusion_spec.rb +597 -0
  35. data/spec/detox/validations/any_format_spec.rb +597 -0
  36. data/spec/detox/validations/any_inclusion_spec.rb +597 -0
  37. data/spec/detox/validations/any_length_spec.rb +597 -0
  38. data/spec/detox/validations/any_numericality_spec.rb +609 -0
  39. data/spec/detox/validations/any_presence_spec.rb +596 -0
  40. data/spec/detox/validations/any_validator_check_validity_spec.rb +126 -0
  41. data/spec/detox/validations/ordering_spec.rb +452 -0
  42. data/spec/detox/validations/possession_spec.rb +263 -0
  43. data/spec/detox/validity_broker_spec.rb +126 -0
  44. data/spec/spec_helper.rb +24 -0
  45. data/spec/test_class/all_absence_test.rb +14 -0
  46. data/spec/test_class/all_acceptance_test.rb +27 -0
  47. data/spec/test_class/all_exclusion_test.rb +15 -0
  48. data/spec/test_class/all_format_test.rb +26 -0
  49. data/spec/test_class/all_inclusion_test.rb +27 -0
  50. data/spec/test_class/all_length_test.rb +28 -0
  51. data/spec/test_class/all_numericality_test.rb +33 -0
  52. data/spec/test_class/all_presence_test.rb +14 -0
  53. data/spec/test_class/any_absence_test.rb +33 -0
  54. data/spec/test_class/any_acceptance_test.rb +34 -0
  55. data/spec/test_class/any_exclusion_test.rb +34 -0
  56. data/spec/test_class/any_format_test.rb +34 -0
  57. data/spec/test_class/any_inclusion_test.rb +33 -0
  58. data/spec/test_class/any_length_test.rb +33 -0
  59. data/spec/test_class/any_numericality_test.rb +35 -0
  60. data/spec/test_class/any_presence_test.rb +33 -0
  61. data/spec/test_class/array_validity_test.rb +6 -0
  62. data/spec/test_class/model_base.rb +11 -0
  63. data/spec/test_class/ordering_test.rb +33 -0
  64. data/spec/test_class/possession_test.rb +22 -0
  65. metadata +219 -0
@@ -0,0 +1,369 @@
1
+ # coding: utf-8
2
+ require "spec_helper"
3
+ require "active_support/i18n"
4
+ require "test_class/all_numericality_test"
5
+
6
+ describe Detox::Validations::AllNumericalityValidator do
7
+ describe "validation result " do
8
+ context "when given no additional option" do# {{{
9
+ let(:test) { AllNumericalityTest.new }
10
+
11
+ context "when apply to nil" do
12
+ it "is valid" do
13
+ test.prices = nil
14
+ expect(test.valid?).to eq true
15
+ end
16
+ end
17
+
18
+ context "when apply to Array" do# {{{
19
+ context "when apply to [] (empty)" do
20
+ it "is valid" do
21
+ test.prices = []
22
+ expect(test.valid?).to eq true
23
+ end
24
+ end
25
+ context "when apply to ['0', '1.5', '-1'] (valid values)" do
26
+ it "is valid" do
27
+ test.prices = ["0", "1.5", "-1"]
28
+ expect(test.valid?).to eq true
29
+ end
30
+ end
31
+ context "when apply to ['0', '1.5', '-1', 'a'] (contains invalid value)" do
32
+ it "is invalid" do
33
+ test.prices = ["0", "1.5", "-1", "a"]
34
+ expect(test.valid?).to eq false
35
+ end
36
+ end
37
+ context "when apply to ['0', '1.5', '-1', nil] (contains nil)" do
38
+ it "is invalid" do
39
+ test.prices = ["0", "1.5", "-1", nil]
40
+ expect(test.valid?).to eq false
41
+ end
42
+ end
43
+ context "when apply to ['0', '1.5', '-1', ''] (contains empty)" do
44
+ it "is invalid" do
45
+ test.prices = ["0", "1.5", "-1", ""]
46
+ expect(test.valid?).to eq false
47
+ end
48
+ end
49
+ context "when apply to ['0', '1.5', '-1', ' '] (contains blank)" do
50
+ it "is invalid" do
51
+ test.prices = ["0", "1.5", "-1", " "]
52
+ expect(test.valid?).to eq false
53
+ end
54
+ end
55
+ end# }}}
56
+
57
+ context "when apply to Hash" do# {{{
58
+ context "when apply to {} (empty)" do
59
+ it "is valid" do
60
+ test.prices = {}
61
+ expect(test.valid?).to eq true
62
+ end
63
+ end
64
+ context "when apply to { :a => '0', :b => '1.5', :c => '-1' } (valid values)" do
65
+ it "is valid" do
66
+ test.prices = { :a => '0', :b => '1.5', :c => '-1' }
67
+ expect(test.valid?).to eq true
68
+ end
69
+ end
70
+ context "when apply to { :a => '0', :b => '1.5', :c => '-1', :d => 'a' } (contains invalid word)" do
71
+ it "is invalid" do
72
+ test.prices = { :a => '0', :b => '1.5', :c => '-1', :d => 'a' }
73
+ expect(test.valid?).to eq false
74
+ end
75
+ end
76
+ context "when apply to { :a => '0', :b => '1.5', :c => '-1', :d => nil } (contains nil)" do
77
+ it "is invalid" do
78
+ test.prices = { :a => '0', :b => '1.5', :c => '-1', :d => nil }
79
+ expect(test.valid?).to eq false
80
+ end
81
+ end
82
+ context "when apply to { :a => '0', :b => '1.5', :c => '-1', :d => '' } (contains empty)" do
83
+ it "is invalid" do
84
+ test.prices = { :a => '0', :b => '1.5', :c => '-1', :d => '' }
85
+ expect(test.valid?).to eq false
86
+ end
87
+ end
88
+ context "when apply to { :a => '0', :b => '1.5', :c => '-1', :d => ' ' } (contains blank)" do
89
+ it "is invalid" do
90
+ test.prices = { :a => '0', :b => '1.5', :c => '-1', :d => ' ' }
91
+ expect(test.valid?).to eq false
92
+ end
93
+ end
94
+ end# }}}
95
+ end# }}}
96
+
97
+ context "when given ignore_nil_value option" do# {{{
98
+ let(:test) { AllNumericalityTestWithIgnoreNilValueOption.new }
99
+
100
+ context "when apply to nil" do
101
+ it "is valid" do
102
+ test.prices = nil
103
+ expect(test.valid?).to eq true
104
+ end
105
+ end
106
+
107
+ context "when apply to Array" do# {{{
108
+ context "when apply to [] (empty)" do
109
+ it "is valid" do
110
+ test.prices = []
111
+ expect(test.valid?).to eq true
112
+ end
113
+ end
114
+ context "when apply to ['0', '1.5', '-1'] (valid values)" do
115
+ it "is valid" do
116
+ test.prices = ["0", "1.5", "-1"]
117
+ expect(test.valid?).to eq true
118
+ end
119
+ end
120
+ context "when apply to ['0', '1.5', '-1', 'a'] (contains invalid value)" do
121
+ it "is invalid" do
122
+ test.prices = ["0", "1.5", "-1", "a"]
123
+ expect(test.valid?).to eq false
124
+ end
125
+ end
126
+ context "when apply to ['0', '1.5', '-1', nil] (contains nil)" do
127
+ it "is valid" do
128
+ test.prices = ["0", "1.5", "-1", nil]
129
+ expect(test.valid?).to eq true
130
+ end
131
+ end
132
+ context "when apply to ['0', '1.5', '-1', ''] (contains empty)" do
133
+ it "is invalid" do
134
+ test.prices = ["0", "1.5", "-1", ""]
135
+ expect(test.valid?).to eq false
136
+ end
137
+ end
138
+ context "when apply to ['0', '1.5', '-1', ' '] (contains blank)" do
139
+ it "is invalid" do
140
+ test.prices = ["0", "1.5", "-1", " "]
141
+ expect(test.valid?).to eq false
142
+ end
143
+ end
144
+ end# }}}
145
+
146
+ context "when apply to Hash" do# {{{
147
+ context "when apply to {} (empty)" do
148
+ it "is valid" do
149
+ test.prices = {}
150
+ expect(test.valid?).to eq true
151
+ end
152
+ end
153
+ context "when apply to { :a => '0', :b => '1.5', :c => '-1' } (valid values)" do
154
+ it "is valid" do
155
+ test.prices = { :a => '0', :b => '1.5', :c => '-1' }
156
+ expect(test.valid?).to eq true
157
+ end
158
+ end
159
+ context "when apply to { :a => '0', :b => '1.5', :c => '-1', :d => 'a' } (contains invalid word)" do
160
+ it "is invalid" do
161
+ test.prices = { :a => '0', :b => '1.5', :c => '-1', :d => 'a' }
162
+ expect(test.valid?).to eq false
163
+ end
164
+ end
165
+ context "when apply to { :a => '0', :b => '1.5', :c => '-1', :d => nil } (contains nil)" do
166
+ it "is valid" do
167
+ test.prices = { :a => '0', :b => '1.5', :c => '-1', :d => nil }
168
+ expect(test.valid?).to eq true
169
+ end
170
+ end
171
+ context "when apply to { :a => '0', :b => '1.5', :c => '-1', :d => '' } (contains empty)" do
172
+ it "is invalid" do
173
+ test.prices = { :a => '0', :b => '1.5', :c => '-1', :d => '' }
174
+ expect(test.valid?).to eq false
175
+ end
176
+ end
177
+ context "when apply to { :a => '0', :b => '1.5', :c => '-1', :d => ' ' } (contains blank)" do
178
+ it "is invalid" do
179
+ test.prices = { :a => '0', :b => '1.5', :c => '-1', :d => ' ' }
180
+ expect(test.valid?).to eq false
181
+ end
182
+ end
183
+ end# }}}
184
+ end# }}}
185
+
186
+ context "when given ignore_blank_value option" do# {{{
187
+ let(:test) { AllNumericalityTestWithIgnoreBlankValueOption.new }
188
+
189
+ context "when apply to nil" do
190
+ it "is valid" do
191
+ test.prices = nil
192
+ expect(test.valid?).to eq true
193
+ end
194
+ end
195
+
196
+ context "when apply to Array" do# {{{
197
+ context "when apply to [] (empty)" do
198
+ it "is valid" do
199
+ test.prices = []
200
+ expect(test.valid?).to eq true
201
+ end
202
+ end
203
+ context "when apply to ['0', '1.5', '-1'] (valid values)" do
204
+ it "is valid" do
205
+ test.prices = ["0", "1.5", "-1"]
206
+ expect(test.valid?).to eq true
207
+ end
208
+ end
209
+ context "when apply to ['0', '1.5', '-1', 'a'] (contains invalid value)" do
210
+ it "is invalid" do
211
+ test.prices = ["0", "1.5", "-1", "a"]
212
+ expect(test.valid?).to eq false
213
+ end
214
+ end
215
+ context "when apply to ['0', '1.5', '-1', nil] (contains nil)" do
216
+ it "is valid" do
217
+ test.prices = ["0", "1.5", "-1", nil]
218
+ expect(test.valid?).to eq true
219
+ end
220
+ end
221
+ context "when apply to ['0', '1.5', '-1', ''] (contains empty)" do
222
+ it "is valid" do
223
+ test.prices = ["0", "1.5", "-1", ""]
224
+ expect(test.valid?).to eq true
225
+ end
226
+ end
227
+ context "when apply to ['0', '1.5', '-1', ' '] (contains blank)" do
228
+ it "is valid" do
229
+ test.prices = ["0", "1.5", "-1", " "]
230
+ expect(test.valid?).to eq true
231
+ end
232
+ end
233
+ end# }}}
234
+
235
+ context "when apply to Hash" do# {{{
236
+ context "when apply to {} (empty)" do
237
+ it "is valid" do
238
+ test.prices = {}
239
+ expect(test.valid?).to eq true
240
+ end
241
+ end
242
+ context "when apply to { :a => '0', :b => '1.5', :c => '-1' } (valid values)" do
243
+ it "is valid" do
244
+ test.prices = { :a => '0', :b => '1.5', :c => '-1' }
245
+ expect(test.valid?).to eq true
246
+ end
247
+ end
248
+ context "when apply to { :a => '0', :b => '1.5', :c => '-1', :d => 'a' } (contains invalid word)" do
249
+ it "is invalid" do
250
+ test.prices = { :a => '0', :b => '1.5', :c => '-1', :d => 'a' }
251
+ expect(test.valid?).to eq false
252
+ end
253
+ end
254
+ context "when apply to { :a => '0', :b => '1.5', :c => '-1', :d => nil } (contains nil)" do
255
+ it "is valid" do
256
+ test.prices = { :a => '0', :b => '1.5', :c => '-1', :d => nil }
257
+ expect(test.valid?).to eq true
258
+ end
259
+ end
260
+ context "when apply to { :a => '0', :b => '1.5', :c => '-1', :d => '' } (contains empty)" do
261
+ it "is valid" do
262
+ test.prices = { :a => '0', :b => '1.5', :c => '-1', :d => '' }
263
+ expect(test.valid?).to eq true
264
+ end
265
+ end
266
+ context "when apply to { :a => '0', :b => '1.5', :c => '-1', :d => ' ' } (contains blank)" do
267
+ it "is valid" do
268
+ test.prices = { :a => '0', :b => '1.5', :c => '-1', :d => ' ' }
269
+ expect(test.valid?).to eq true
270
+ end
271
+ end
272
+ end# }}}
273
+ end# }}}
274
+
275
+ context "when given original option (only_integer)" do# {{{
276
+ let(:test) { AllNumericalityTestWithOriginalOption.new }
277
+
278
+ context "when apply to ['0', '1', '-1'] (integer values)" do
279
+ it "is valid" do
280
+ test.prices = ["0", "1", "-1"]
281
+ expect(test.valid?).to eq true
282
+ end
283
+ end
284
+ context "when apply to ['0', '1.5', '-1'] (contain decimal values)" do
285
+ it "is invalid" do
286
+ test.prices = ["0", "1.5", "-1"]
287
+ expect(test.valid?).to eq false
288
+ end
289
+ end
290
+ end# }}}
291
+ end
292
+
293
+ describe "error message" do
294
+ context "when witout message option" do# {{{
295
+ let(:test) { AllNumericalityTest.new }
296
+
297
+ context "when valid" do
298
+ before do
299
+ test.prices = ['0', '1.5', '-1']
300
+ test.valid?
301
+ end
302
+
303
+ it "has no message" do
304
+ expect(test.errors.present?).to eq false
305
+ end
306
+ end
307
+ context "when invalid" do
308
+ before do
309
+ test.prices = ['0', '1.5', '-1', 'a']
310
+ test.valid?
311
+ end
312
+
313
+ it "has 1 error message" do
314
+ expect(test.errors.empty?).to eq false
315
+ expect(test.errors.size).to eq 1
316
+ end
317
+ it "error message is associated with prices attribute" do
318
+ expect(test.errors.include?(:prices)).to eq true
319
+ end
320
+ it "error messsage is 'Prices contains not numeric value'" do
321
+ expect(test.errors.full_messages.first).to eq "Prices contains not numeric value"
322
+ end
323
+ end
324
+ context "when using i18n" do
325
+ before do
326
+ @base_locale = I18n.locale
327
+ I18n.locale = :ja
328
+ test.prices = ['0', '1.5', '-1', 'a']
329
+ test.valid?
330
+ end
331
+ after do
332
+ I18n.locale = @base_locale
333
+ end
334
+ it "error messsage is translated" do
335
+ expect(test.errors.full_messages.first).to eq "Prices は数値でない値を含んでいます"
336
+ end
337
+ end
338
+ end# }}}
339
+
340
+ context "when given message option" do# {{{
341
+ let(:test) { AllNumericalityTestWithMessageOption.new }
342
+
343
+ context "when invalid" do
344
+ before do
345
+ test.prices = ['0', '1.5', '-1', 'a']
346
+ test.valid?
347
+ end
348
+ it "error messsage uses given message" do
349
+ expect(test.errors.full_messages.first).to eq 'Prices is invalid'
350
+ end
351
+ end
352
+ context "when using i18n" do
353
+ before do
354
+ @base_locale = I18n.locale
355
+ I18n.locale = :ja
356
+ test.prices = ['0', '1.5', '-1', 'a']
357
+ test.valid?
358
+ end
359
+ after do
360
+ I18n.locale = @base_locale
361
+ end
362
+ it "error messsage is not translated" do
363
+ expect(test.errors.full_messages.first).to eq 'Prices is invalid'
364
+ end
365
+ end
366
+ end# }}}
367
+ end
368
+ end
369
+
@@ -0,0 +1,159 @@
1
+ # coding: utf-8
2
+ require "spec_helper"
3
+ require "active_support/i18n"
4
+ require "test_class/all_presence_test"
5
+
6
+ describe Detox::Validations::AllPresenceValidator do
7
+ describe "validation result" do
8
+ let(:test) { AllPresenceTest.new }
9
+
10
+ context "when apply to nil" do
11
+ it "is valid" do
12
+ test.values = nil
13
+ expect(test.valid?).to eq true
14
+ end
15
+ end
16
+
17
+ context "when apply to Array" do# {{{
18
+ context "when apply to [] (empty)" do
19
+ it "is valid" do
20
+ test.values = []
21
+ expect(test.valid?).to eq true
22
+ end
23
+ end
24
+ context "when apply to ['1', '2', '3'] (no blank value)" do
25
+ it "is valid" do
26
+ test.values = ["1", "2", "3"]
27
+ expect(test.valid?).to eq true
28
+ end
29
+ end
30
+ context "when apply to ['1', '2', nil] (contains nil)" do
31
+ it "is invalid" do
32
+ test.values = ['1', '2', nil]
33
+ expect(test.valid?).to eq false
34
+ end
35
+ end
36
+ context "when apply to ['1', '2', ''] (contains empty)" do
37
+ it "is invalid" do
38
+ test.values = ['1', '2', '']
39
+ expect(test.valid?).to eq false
40
+ end
41
+ end
42
+ context "when apply to ['1', '2', ' '] (contains blank)" do
43
+ it "is invalid" do
44
+ test.values = ['1', '2', ' ']
45
+ expect(test.valid?).to eq false
46
+ end
47
+ end
48
+ end# }}}
49
+
50
+ context "when apply to Hash" do# {{{
51
+ context "when apply to {} (empty)" do
52
+ it "is valid" do
53
+ test.values = {}
54
+ expect(test.valid?).to eq true
55
+ end
56
+ end
57
+ context "when apply to { :a => '1', :b => '2', :c => '3' } (no blank value)" do
58
+ it "is valid" do
59
+ test.values = { :a => '1', :b => '2', :c => '3' }
60
+ expect(test.valid?).to eq true
61
+ end
62
+ end
63
+ context "when apply to { :a => '1', :b => '2', :c => nil } (contains nil)" do
64
+ it "is invalid" do
65
+ test.values = { :a => '1', :b => '2', :c => nil }
66
+ expect(test.valid?).to eq false
67
+ end
68
+ end
69
+ context "when apply to { :a => '1', :b => '2', :c => '' } (contains empty)" do
70
+ it "is invalid" do
71
+ test.values = { :a => '1', :b => '2', :c => '' }
72
+ expect(test.valid?).to eq false
73
+ end
74
+ end
75
+ context "when apply to { :a => '1', :b => '2', :c => ' ' } (contains blank)" do
76
+ it "is invalid" do
77
+ test.values = { :a => '1', :b => '2', :c => ' ' }
78
+ expect(test.valid?).to eq false
79
+ end
80
+ end
81
+ end# }}}
82
+ end
83
+
84
+ describe "error message" do
85
+ context "when without message option" do# {{{
86
+ let(:test) { AllPresenceTest.new }
87
+
88
+ context "when valid" do
89
+ before do
90
+ test.values = ['1', '2', '3']
91
+ test.valid?
92
+ end
93
+
94
+ it "has no message" do
95
+ expect(test.errors.present?).to eq false
96
+ end
97
+ end
98
+ context "when invalid" do
99
+ before do
100
+ test.values = ['1', '2', '']
101
+ test.valid?
102
+ end
103
+
104
+ it "has 1 error message" do
105
+ expect(test.errors.empty?).to eq false
106
+ expect(test.errors.size).to eq 1
107
+ end
108
+ it "error message is associated with values attribute" do
109
+ expect(test.errors.include?(:values)).to eq true
110
+ end
111
+ it %q{error messsage is "Values can't contain blank value"} do
112
+ expect(test.errors.full_messages.first).to eq "Values can't contain blank value"
113
+ end
114
+ end
115
+ context "when using i18n" do
116
+ before do
117
+ @base_locale = I18n.locale
118
+ I18n.locale = :ja
119
+ test.values = ['1', '2', '']
120
+ test.valid?
121
+ end
122
+ after do
123
+ I18n.locale = @base_locale
124
+ end
125
+ it "error messsage is translated" do
126
+ expect(test.errors.full_messages.first).to eq "Values には空の値を含められません"
127
+ end
128
+ end
129
+ end# }}}
130
+
131
+ context "when given message option" do# {{{
132
+ let(:test) { AllPresenceTestWithMessageOption.new }
133
+
134
+ context "when invalid" do
135
+ before do
136
+ test.values = ['1', '2', '']
137
+ test.valid?
138
+ end
139
+ it "error messsage uses given message" do
140
+ expect(test.errors.full_messages.first).to eq 'Values is invalid'
141
+ end
142
+ end
143
+ context "when using i18n" do
144
+ before do
145
+ @base_locale = I18n.locale
146
+ I18n.locale = :ja
147
+ test.values = ['1', '2', '']
148
+ test.valid?
149
+ end
150
+ after do
151
+ I18n.locale = @base_locale
152
+ end
153
+ it "error messsage is not translated" do
154
+ expect(test.errors.full_messages.first).to eq 'Values is invalid'
155
+ end
156
+ end
157
+ end# }}}
158
+ end
159
+ end