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