detox 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
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,263 @@
1
+ # coding: utf-8
2
+ require "spec_helper"
3
+ require "active_support/i18n"
4
+ require "test_class/possession_test"
5
+
6
+ describe Detox::Validations::PossessionValidator do
7
+ describe "validation result" do
8
+ context "when given no option" do
9
+ it "raise ArgumentError" do
10
+ expect do
11
+ class PossessionTestWithoutOption < ModelBase
12
+ attr_accessor :values
13
+
14
+ validates :values, :possession => true
15
+ end
16
+ end.to raise_error(ArgumentError, ":target must be supplied")
17
+ end
18
+ end
19
+
20
+ context "when given :target option" do
21
+ context "when target is single value (target is '3')" do# {{{
22
+ let(:test) { PossessionTestWithSingleTarget.new }
23
+
24
+ context "when apply to nil" do
25
+ it "is valid" do
26
+ test.values = nil
27
+ expect(test.valid?).to eq true
28
+ end
29
+ end
30
+
31
+ context "when apply to Array" do# {{{
32
+ context "when apply to [] (empty)" do
33
+ it "is valid" do
34
+ test.values = []
35
+ expect(test.valid?).to eq true
36
+ end
37
+ end
38
+ context "when apply to ['1', '2', '3'] (contains target)" do
39
+ it "is valid" do
40
+ test.values = ["1", "2", "3"]
41
+ expect(test.valid?).to eq true
42
+ end
43
+ end
44
+ context "when apply to ['1', '2', '4'] (doesn't contain target)" do
45
+ it "is invalid" do
46
+ test.values = ['1', '2', '4']
47
+ expect(test.valid?).to eq false
48
+ end
49
+ end
50
+ end# }}}
51
+
52
+ context "when apply to Hash" do# {{{
53
+ context "when apply to {} (empty)" do
54
+ it "is valid" do
55
+ test.values = []
56
+ expect(test.valid?).to eq true
57
+ end
58
+ end
59
+ context "when apply to { :a => '1', :b => '2', :c => '3' } (contains target)" do
60
+ it "is valid" do
61
+ test.values = { :a => '1', :b => '2', :c => '3' }
62
+ expect(test.valid?).to eq true
63
+ end
64
+ end
65
+ context "when apply to { :a => '1', :b => '2', :c => '4' } (doesn't contain target)" do
66
+ it "is invalid" do
67
+ test.values = { :a => '1', :b => '2', :c => '4' }
68
+ expect(test.valid?).to eq false
69
+ end
70
+ end
71
+ end# }}}
72
+ end# }}}
73
+
74
+ context "when target is multi values (target are '2' and '3')" do# {{{
75
+ let(:test) { PossessionTestWithArrayTarget.new }
76
+
77
+ context "when apply to nil" do
78
+ it "is valid" do
79
+ test.values = nil
80
+ expect(test.valid?).to eq true
81
+ end
82
+ end
83
+
84
+ context "when apply to Array" do# {{{
85
+ context "when apply to [] (empty)" do
86
+ it "is valid" do
87
+ test.values = []
88
+ expect(test.valid?).to eq true
89
+ end
90
+ end
91
+ context "when apply to ['1', '2', '3'] (contains both target)" do
92
+ it "is valid" do
93
+ test.values = ["1", "2", "3"]
94
+ expect(test.valid?).to eq true
95
+ end
96
+ end
97
+ context "when apply to ['1', '2', '4'] (contains target partialy)" do
98
+ it "is invalid" do
99
+ test.values = ['1', '2', '4']
100
+ expect(test.valid?).to eq false
101
+ end
102
+ end
103
+ context "when apply to ['1', '0', '4'] (doesn't contain each target)" do
104
+ it "is invalid" do
105
+ test.values = ['1', '0', '4']
106
+ expect(test.valid?).to eq false
107
+ end
108
+ end
109
+ end# }}}
110
+
111
+ context "when apply to Hash" do# {{{
112
+ context "when apply to {} (empty)" do
113
+ it "is valid" do
114
+ test.values = []
115
+ expect(test.valid?).to eq true
116
+ end
117
+ end
118
+ context "when apply to { :a => '1', :b => '2', :c => '3' } (contains both target)" do
119
+ it "is valid" do
120
+ test.values = { :a => '1', :b => '2', :c => '3' }
121
+ expect(test.valid?).to eq true
122
+ end
123
+ end
124
+ context "when apply to { :a => '1', :b => '2', :c => '4' } (contains target partialy)" do
125
+ it "is invalid" do
126
+ test.values = { :a => '1', :b => '2', :c => '4' }
127
+ expect(test.valid?).to eq false
128
+ end
129
+ end
130
+ context "when apply to { :a => '1', :b => '0', :c => '4' } (doesn't contain each target)" do
131
+ it "is invalid" do
132
+ test.values = { :a => '1', :b => '0', :c => '4' }
133
+ expect(test.valid?).to eq false
134
+ end
135
+ end
136
+ end# }}}
137
+ end# }}}
138
+ end
139
+ end
140
+
141
+ describe "error message" do
142
+ context "when target is single value (target is '3')" do# {{{
143
+ let(:test) { PossessionTestWithSingleTarget.new }
144
+
145
+ context "when valid" do
146
+ before do
147
+ test.values = ['1', '2', '3']
148
+ test.valid?
149
+ end
150
+
151
+ it "has no message" do
152
+ expect(test.errors.present?).to eq false
153
+ end
154
+ end
155
+ context "when invalid" do
156
+ before do
157
+ test.values = ['1', '2', '4']
158
+ test.valid?
159
+ end
160
+
161
+ it "has 1 error message" do
162
+ expect(test.errors.empty?).to eq false
163
+ expect(test.errors.size).to eq 1
164
+ end
165
+ it "error message is associated with values attribute" do
166
+ expect(test.errors.include?(:values)).to eq true
167
+ end
168
+ it "error messsage is 'Values must possess target (target: 3)'" do
169
+ expect(test.errors.full_messages.first).to eq "Values must possess target (target: 3)"
170
+ end
171
+ end
172
+ context "when using i18n" do
173
+ before do
174
+ @base_locale = I18n.locale
175
+ I18n.locale = :ja
176
+ test.values = ['1', '2', '4']
177
+ test.valid?
178
+ end
179
+ after do
180
+ I18n.locale = @base_locale
181
+ end
182
+ it "error messsage is translated" do
183
+ expect(test.errors.full_messages.first).to eq "Values には対象(3)が含まれている必要があります"
184
+ end
185
+ end
186
+ end# }}}
187
+
188
+ context "when target is multi values (target are '2' and '3')" do# {{{
189
+ let(:test) { PossessionTestWithArrayTarget.new }
190
+
191
+ context "when valid" do
192
+ before do
193
+ test.values = ['1', '2', '3']
194
+ test.valid?
195
+ end
196
+
197
+ it "has no message" do
198
+ expect(test.errors.present?).to eq false
199
+ end
200
+ end
201
+ context "when invalid" do
202
+ before do
203
+ test.values = ['1', '2', '4']
204
+ test.valid?
205
+ end
206
+
207
+ it "has 1 error message" do
208
+ expect(test.errors.empty?).to eq false
209
+ expect(test.errors.size).to eq 1
210
+ end
211
+ it "error message is associated with values attribute" do
212
+ expect(test.errors.include?(:values)).to eq true
213
+ end
214
+ it "error messsage is 'Values must possess target (target: 2, 3)'" do
215
+ expect(test.errors.full_messages.first).to eq "Values must possess target (target: 2, 3)"
216
+ end
217
+ end
218
+ context "when using i18n" do
219
+ before do
220
+ @base_locale = I18n.locale
221
+ I18n.locale = :ja
222
+ test.values = ['1', '2', '4']
223
+ test.valid?
224
+ end
225
+ after do
226
+ I18n.locale = @base_locale
227
+ end
228
+ it "error messsage is translated" do
229
+ expect(test.errors.full_messages.first).to eq "Values には対象(2, 3)が含まれている必要があります"
230
+ end
231
+ end
232
+ end# }}}
233
+
234
+ context "when given message option" do# {{{
235
+ let(:test) { PossessionTestWithMessageOption.new }
236
+
237
+ context "when invalid" do
238
+ before do
239
+ test.values = ['1', '2', '4']
240
+ test.valid?
241
+ end
242
+ it "error messsage uses given message" do
243
+ expect(test.errors.full_messages.first).to eq "Values is invalid"
244
+ end
245
+ end
246
+ context "when using i18n" do
247
+ before do
248
+ @base_locale = I18n.locale
249
+ I18n.locale = :ja
250
+ test.values = ['1', '2', '4']
251
+ test.valid?
252
+ end
253
+ after do
254
+ I18n.locale = @base_locale
255
+ end
256
+ it "error messsage is not translated" do
257
+ expect(test.errors.full_messages.first).to eq "Values is invalid"
258
+ end
259
+ end
260
+ end# }}}
261
+ end
262
+ end
263
+
@@ -0,0 +1,126 @@
1
+ # coding: utf-8
2
+ require "spec_helper"
3
+ require "detox/validity_broker"
4
+
5
+ describe Detox::ValidityBroker do
6
+ let(:broker) { Detox::ValidityBroker.new }
7
+
8
+ describe "#errors" do
9
+ context "when initialized" do
10
+ it "not nil" do
11
+ expect(broker.errors).not_to be_nil
12
+ end
13
+ it "responds to :add" do
14
+ expect(broker.errors.respond_to?(:add)).to eq true
15
+ end
16
+ it "respond to :clear" do
17
+ expect(broker.errors.respond_to?(:clear)).to eq true
18
+ end
19
+ end
20
+ end
21
+
22
+ describe "#valid?" do
23
+ context "when initialized" do
24
+ it "returns true" do
25
+ expect(broker.valid?).to eq true
26
+ end
27
+ end
28
+ context "when errors.add called" do
29
+ before { broker.errors.add("attr", "message") }
30
+
31
+ it "returns false" do
32
+ expect(broker.valid?).to eq false
33
+ end
34
+ it "restore to valid" do
35
+ expect(broker.valid?).to eq false
36
+ expect(broker.valid?).to eq true
37
+ end
38
+ end
39
+ context "when errors.add_on_blank called" do
40
+ before { broker.errors.add_on_blank("attr", "message") }
41
+
42
+ it "returns false" do
43
+ expect(broker.valid?).to eq false
44
+ end
45
+ it "restore to valid" do
46
+ expect(broker.valid?).to eq false
47
+ expect(broker.valid?).to eq true
48
+ end
49
+ end
50
+ context "when errors.clear called on holding invalidity" do
51
+ before do
52
+ broker.errors.add("attr", "message")
53
+ broker.errors.clear
54
+ end
55
+ it "returns true" do
56
+ expect(broker.valid?).to eq true
57
+ end
58
+ end
59
+ end
60
+
61
+ describe "#invalid?" do
62
+ context "when initialized" do
63
+ it "returns false" do
64
+ expect(broker.invalid?).to eq false
65
+ end
66
+ end
67
+ context "when errors.add called" do
68
+ before { broker.errors.add("attr", "message") }
69
+
70
+ it "returns false" do
71
+ expect(broker.invalid?).to eq true
72
+ end
73
+ it "restore to valid" do
74
+ expect(broker.invalid?).to eq true
75
+ expect(broker.invalid?).to eq false
76
+ end
77
+ end
78
+ context "when errors.clear called on holding invalidity" do
79
+ before do
80
+ broker.errors.add("attr", "message")
81
+ broker.errors.clear
82
+ end
83
+ it "returns false" do
84
+ expect(broker.invalid?).to eq false
85
+ end
86
+ end
87
+ end
88
+
89
+ describe "#validitize" do
90
+ context "when holding validity" do
91
+ before { broker.validitize }
92
+
93
+ it "validity is not same" do
94
+ expect(broker.valid?).to eq true
95
+ end
96
+ end
97
+ context "when holding invalidity" do
98
+ before do
99
+ broker.errors.add("attr", "message")
100
+ broker.validitize
101
+ end
102
+ it "change to valid" do
103
+ expect(broker.valid?).to eq true
104
+ end
105
+ end
106
+ end
107
+
108
+ describe "#invaliditize" do
109
+ context "when holding validity" do
110
+ before { broker.invaliditize }
111
+
112
+ it "change to invalid" do
113
+ expect(broker.invalid?).to eq true
114
+ end
115
+ end
116
+ context "when holding invalidity" do
117
+ before do
118
+ broker.errors.add("attr", "message")
119
+ broker.invaliditize
120
+ end
121
+ it "validity is not same" do
122
+ expect(broker.valid?).to eq false
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,24 @@
1
+ # coding: utf-8
2
+ # This file was generated by the `rspec --init` command. Conventionally, all
3
+ # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
4
+ # Require this file using `require "spec_helper"` to ensure that it is only
5
+ # loaded once.
6
+ #
7
+ # See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
8
+
9
+ require "coveralls"
10
+ Coveralls.wear!
11
+
12
+ RSpec.configure do |config|
13
+ config.treat_symbols_as_metadata_keys_with_true_values = true
14
+ config.run_all_when_everything_filtered = true
15
+ config.filter_run :focus
16
+
17
+ # Run specs in random order to surface order dependencies. If you find an
18
+ # order dependency and want to debug it, you can fix the order by providing
19
+ # the seed, which is printed after each run.
20
+ # --seed 1234
21
+ config.order = 'random'
22
+ end
23
+
24
+ require "detox"
@@ -0,0 +1,14 @@
1
+ # coding: utf-8
2
+ require "test_class/model_base"
3
+
4
+ class AllAbsenceTest < ModelBase
5
+ attr_accessor :values
6
+
7
+ validates :values, :all_absence => true
8
+ end
9
+
10
+ class AllAbsenceTestWithMessageOption < ModelBase
11
+ attr_accessor :values
12
+
13
+ validates :values, :all_absence => { :message => "is invalid" }
14
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ require "test_class/model_base"
3
+
4
+ class AllAcceptanceTest < ModelBase
5
+ attr_accessor :flags
6
+
7
+ validates :flags, :all_acceptance => true
8
+ end
9
+
10
+ class AllAcceptanceTestWithIgnoreNilValueOption < ModelBase
11
+ attr_accessor :flags
12
+
13
+ validates :flags, :all_acceptance => { :ignore_nil_value => true }
14
+ end
15
+
16
+ class AllAcceptanceTestWithIgnoreBlankValueOption < ModelBase
17
+ attr_accessor :flags
18
+
19
+ validates :flags, :all_acceptance => { :ignore_blank_value => true }
20
+ end
21
+
22
+ class AllAcceptanceTestWithMessageOption < ModelBase
23
+ attr_accessor :flags
24
+
25
+ validates :flags, :all_acceptance => { :message => "is invalid" }
26
+ end
27
+