detox 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.gitignore +19 -0
- data/.travis.yml +7 -0
- data/Gemfile +4 -0
- data/LICENSE +20 -0
- data/README.md +40 -0
- data/Rakefile +11 -0
- data/detox.gemspec +27 -0
- data/gemfiles/activemodel_3_2_x.gemfile +5 -0
- data/gemfiles/activemodel_4_0_x.gemfile +5 -0
- data/lib/active_model/validations/absence.rb +19 -0
- data/lib/detox.rb +11 -0
- data/lib/detox/array_validity.rb +23 -0
- data/lib/detox/locales/en.yml +21 -0
- data/lib/detox/locales/ja.yml +21 -0
- data/lib/detox/validations/all.rb +41 -0
- data/lib/detox/validations/any.rb +57 -0
- data/lib/detox/validations/ordering.rb +34 -0
- data/lib/detox/validations/possession.rb +30 -0
- data/lib/detox/validity_broker.rb +55 -0
- data/lib/detox/version.rb +4 -0
- data/spec/detox/array_validity_spec.rb +214 -0
- data/spec/detox/validations/all_absence_spec.rb +147 -0
- data/spec/detox/validations/all_acceptance_spec.rb +352 -0
- data/spec/detox/validations/all_exclusion_spec.rb +137 -0
- data/spec/detox/validations/all_format_spec.rb +351 -0
- data/spec/detox/validations/all_inclusion_spec.rb +352 -0
- data/spec/detox/validations/all_length_spec.rb +388 -0
- data/spec/detox/validations/all_numericality_spec.rb +369 -0
- data/spec/detox/validations/all_presence_spec.rb +159 -0
- data/spec/detox/validations/any_absence_spec.rb +597 -0
- data/spec/detox/validations/any_acceptance_spec.rb +597 -0
- data/spec/detox/validations/any_exclusion_spec.rb +597 -0
- data/spec/detox/validations/any_format_spec.rb +597 -0
- data/spec/detox/validations/any_inclusion_spec.rb +597 -0
- data/spec/detox/validations/any_length_spec.rb +597 -0
- data/spec/detox/validations/any_numericality_spec.rb +609 -0
- data/spec/detox/validations/any_presence_spec.rb +596 -0
- data/spec/detox/validations/any_validator_check_validity_spec.rb +126 -0
- data/spec/detox/validations/ordering_spec.rb +452 -0
- data/spec/detox/validations/possession_spec.rb +263 -0
- data/spec/detox/validity_broker_spec.rb +126 -0
- data/spec/spec_helper.rb +24 -0
- data/spec/test_class/all_absence_test.rb +14 -0
- data/spec/test_class/all_acceptance_test.rb +27 -0
- data/spec/test_class/all_exclusion_test.rb +15 -0
- data/spec/test_class/all_format_test.rb +26 -0
- data/spec/test_class/all_inclusion_test.rb +27 -0
- data/spec/test_class/all_length_test.rb +28 -0
- data/spec/test_class/all_numericality_test.rb +33 -0
- data/spec/test_class/all_presence_test.rb +14 -0
- data/spec/test_class/any_absence_test.rb +33 -0
- data/spec/test_class/any_acceptance_test.rb +34 -0
- data/spec/test_class/any_exclusion_test.rb +34 -0
- data/spec/test_class/any_format_test.rb +34 -0
- data/spec/test_class/any_inclusion_test.rb +33 -0
- data/spec/test_class/any_length_test.rb +33 -0
- data/spec/test_class/any_numericality_test.rb +35 -0
- data/spec/test_class/any_presence_test.rb +33 -0
- data/spec/test_class/array_validity_test.rb +6 -0
- data/spec/test_class/model_base.rb +11 -0
- data/spec/test_class/ordering_test.rb +33 -0
- data/spec/test_class/possession_test.rb +22 -0
- 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
|
data/spec/spec_helper.rb
ADDED
@@ -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
|
+
|