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,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
+