enumerize 0.8.0 → 2.1.2
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 +4 -4
- data/.gitignore +2 -0
- data/.rspec +2 -0
- data/.travis.yml +27 -12
- data/CHANGELOG.md +141 -0
- data/Gemfile +5 -21
- data/Gemfile.global +20 -0
- data/Gemfile.mongo_mapper +7 -0
- data/Gemfile.rails42 +7 -0
- data/Gemfile.rails51 +7 -0
- data/README.md +185 -9
- data/Rakefile +2 -4
- data/enumerize.gemspec +1 -0
- data/lib/enumerize/activerecord.rb +68 -27
- data/lib/enumerize/attribute.rb +42 -10
- data/lib/enumerize/base.rb +28 -17
- data/lib/enumerize/hooks/formtastic.rb +3 -8
- data/lib/enumerize/hooks/sequel_dataset.rb +15 -0
- data/lib/enumerize/hooks/simple_form.rb +5 -11
- data/lib/enumerize/hooks/uniqueness.rb +3 -8
- data/lib/enumerize/integrations/rspec/matcher.rb +107 -26
- data/lib/enumerize/mongoid.rb +13 -0
- data/lib/enumerize/predicatable.rb +7 -16
- data/lib/enumerize/predicates.rb +3 -1
- data/lib/enumerize/scope/activerecord.rb +37 -0
- data/lib/enumerize/scope/mongoid.rb +35 -0
- data/lib/enumerize/scope/sequel.rb +40 -0
- data/lib/enumerize/sequel.rb +57 -0
- data/lib/enumerize/set.rb +18 -8
- data/lib/enumerize/value.rb +10 -9
- data/lib/enumerize/version.rb +3 -1
- data/lib/enumerize.rb +23 -1
- data/spec/enumerize/integrations/rspec/matcher_spec.rb +258 -0
- data/spec/spec_helper.rb +28 -0
- data/test/activerecord_test.rb +238 -10
- data/test/attribute_test.rb +22 -0
- data/test/base_test.rb +7 -7
- data/test/formtastic_test.rb +3 -12
- data/test/mongo_mapper_test.rb +7 -1
- data/test/mongoid_test.rb +63 -7
- data/test/multiple_test.rb +21 -0
- data/test/predicates_test.rb +6 -0
- data/test/sequel_test.rb +291 -0
- data/test/set_test.rb +14 -0
- data/test/simple_form_test.rb +0 -1
- data/test/support/mock_controller.rb +4 -0
- data/test/support/view_test_helper.rb +4 -0
- data/test/test_helper.rb +23 -2
- data/test/value_test.rb +51 -21
- metadata +40 -9
- data/Gemfile.rails4 +0 -23
- data/lib/enumerize/form_helper.rb +0 -23
- data/test/rspec_matcher_test.rb +0 -76
- data/test/rspec_spec.rb +0 -13
data/test/activerecord_test.rb
CHANGED
@@ -1,11 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'test_helper'
|
2
4
|
require 'active_record'
|
3
5
|
require 'logger'
|
4
6
|
|
7
|
+
db = (ENV['DB'] || 'sqlite3').to_sym
|
8
|
+
|
5
9
|
silence_warnings do
|
6
10
|
ActiveRecord::Migration.verbose = false
|
7
11
|
ActiveRecord::Base.logger = Logger.new(nil)
|
8
|
-
ActiveRecord::Base.
|
12
|
+
ActiveRecord::Base.configurations = {
|
13
|
+
'sqlite3' => {
|
14
|
+
'adapter' => 'sqlite3',
|
15
|
+
'database' => ':memory:'
|
16
|
+
},
|
17
|
+
'postgresql' => {
|
18
|
+
'adapter' => 'postgresql',
|
19
|
+
'username' => ENV['DB_USER'],
|
20
|
+
'password' => ENV['DB_PASSD'],
|
21
|
+
'database' => 'enumerize_test'
|
22
|
+
},
|
23
|
+
'postgresql_master' => {
|
24
|
+
'adapter' => 'postgresql',
|
25
|
+
'username' => ENV['DB_USER'],
|
26
|
+
'password' => ENV['DB_PASS'],
|
27
|
+
'database' => 'template1',
|
28
|
+
'schema_search_path' => 'public'
|
29
|
+
}
|
30
|
+
}
|
31
|
+
if db == :postgresql
|
32
|
+
ActiveRecord::Base.establish_connection(:postgresql_master)
|
33
|
+
ActiveRecord::Base.connection.recreate_database('enumerize_test')
|
34
|
+
end
|
35
|
+
|
36
|
+
ActiveRecord::Base.establish_connection(db)
|
9
37
|
end
|
10
38
|
|
11
39
|
ActiveRecord::Base.connection.instance_eval do
|
@@ -15,13 +43,15 @@ ActiveRecord::Base.connection.instance_eval do
|
|
15
43
|
t.string :lambda_role
|
16
44
|
t.string :name
|
17
45
|
t.string :interests
|
18
|
-
t.
|
46
|
+
t.integer :status
|
19
47
|
t.string :account_type, :default => :basic
|
20
48
|
end
|
21
49
|
|
22
50
|
create_table :documents do |t|
|
51
|
+
t.integer :user_id
|
23
52
|
t.string :visibility
|
24
|
-
t.
|
53
|
+
t.integer :status
|
54
|
+
t.timestamps null: true
|
25
55
|
end
|
26
56
|
end
|
27
57
|
|
@@ -33,6 +63,9 @@ class BaseEntity < ActiveRecord::Base
|
|
33
63
|
end
|
34
64
|
|
35
65
|
class Document < BaseEntity
|
66
|
+
belongs_to :user
|
67
|
+
|
68
|
+
enumerize :status, in: {draft: 1, release: 2}
|
36
69
|
end
|
37
70
|
|
38
71
|
module RoleEnum
|
@@ -53,17 +86,28 @@ class User < ActiveRecord::Base
|
|
53
86
|
enumerize :status, :in => { active: 1, blocked: 2 }, scope: true
|
54
87
|
|
55
88
|
enumerize :account_type, :in => [:basic, :premium]
|
89
|
+
|
90
|
+
# There is no column for relationship enumeration for testing purposes: model
|
91
|
+
# should not be broken even if the associated column does not exist yet.
|
92
|
+
enumerize :relationship, :in => [:single, :married]
|
93
|
+
|
94
|
+
has_many :documents
|
56
95
|
end
|
57
96
|
|
58
97
|
class UniqStatusUser < User
|
59
98
|
validates :status, uniqueness: true
|
99
|
+
validates :sex, presence: true
|
100
|
+
end
|
101
|
+
|
102
|
+
class InterestsRequiredUser < User
|
103
|
+
validates :interests, presence: true
|
60
104
|
end
|
61
105
|
|
62
106
|
describe Enumerize::ActiveRecordSupport do
|
63
107
|
it 'sets nil if invalid value is passed' do
|
64
108
|
user = User.new
|
65
109
|
user.sex = :invalid
|
66
|
-
user.sex.
|
110
|
+
user.sex.must_be_nil
|
67
111
|
end
|
68
112
|
|
69
113
|
it 'saves value' do
|
@@ -92,7 +136,8 @@ describe Enumerize::ActiveRecordSupport do
|
|
92
136
|
it 'does not set default value for not selected attributes' do
|
93
137
|
User.delete_all
|
94
138
|
User.create!(:sex => :male)
|
95
|
-
|
139
|
+
|
140
|
+
assert_equal ['id'], User.select(:id).first.attributes.keys
|
96
141
|
end
|
97
142
|
|
98
143
|
it 'has default value with lambda' do
|
@@ -128,9 +173,18 @@ describe Enumerize::ActiveRecordSupport do
|
|
128
173
|
user.errors[:role].must_include 'is not included in the list'
|
129
174
|
end
|
130
175
|
|
131
|
-
it 'validates inclusion when using write_attribute' do
|
176
|
+
it 'validates inclusion when using write_attribute with string attribute' do
|
177
|
+
user = User.new
|
178
|
+
user.send(:write_attribute, 'role', 'wrong')
|
179
|
+
user.read_attribute_for_validation(:role).must_equal 'wrong'
|
180
|
+
user.wont_be :valid?
|
181
|
+
user.errors[:role].must_include 'is not included in the list'
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'validates inclusion when using write_attribute with symbol attribute' do
|
132
185
|
user = User.new
|
133
186
|
user.send(:write_attribute, :role, 'wrong')
|
187
|
+
user.read_attribute_for_validation(:role).must_equal 'wrong'
|
134
188
|
user.wont_be :valid?
|
135
189
|
user.errors[:role].must_include 'is not included in the list'
|
136
190
|
end
|
@@ -143,7 +197,7 @@ describe Enumerize::ActiveRecordSupport do
|
|
143
197
|
|
144
198
|
it "uses persisted value for validation if it hasn't been set" do
|
145
199
|
user = User.create! :sex => :male
|
146
|
-
User.find(user).read_attribute_for_validation(:sex).must_equal 'male'
|
200
|
+
User.find(user.id).read_attribute_for_validation(:sex).must_equal 'male'
|
147
201
|
end
|
148
202
|
|
149
203
|
it 'is valid with empty string assigned' do
|
@@ -155,7 +209,7 @@ describe Enumerize::ActiveRecordSupport do
|
|
155
209
|
it 'stores nil when empty string assigned' do
|
156
210
|
user = User.new
|
157
211
|
user.role = ''
|
158
|
-
user.read_attribute(:role).
|
212
|
+
user.read_attribute(:role).must_be_nil
|
159
213
|
end
|
160
214
|
|
161
215
|
it 'supports multiple attributes' do
|
@@ -179,6 +233,13 @@ describe Enumerize::ActiveRecordSupport do
|
|
179
233
|
interests.must_equal %w(music dancing)
|
180
234
|
end
|
181
235
|
|
236
|
+
it 'stores multiple value passed passed to new' do
|
237
|
+
user = User.new(interests: [:music, :dancing])
|
238
|
+
user.save!
|
239
|
+
user.interests.must_equal %w(music dancing)
|
240
|
+
User.find(user.id).interests.must_equal %w(music dancing)
|
241
|
+
end
|
242
|
+
|
182
243
|
it 'returns invalid multiple value for validation' do
|
183
244
|
user = User.new
|
184
245
|
user.interests << :music
|
@@ -199,6 +260,22 @@ describe Enumerize::ActiveRecordSupport do
|
|
199
260
|
user.must_be :valid?
|
200
261
|
end
|
201
262
|
|
263
|
+
it 'stores custom values for multiple attributes' do
|
264
|
+
User.delete_all
|
265
|
+
|
266
|
+
klass = Class.new(User)
|
267
|
+
klass.enumerize :interests, in: { music: 0, sports: 1, dancing: 2, programming: 3}, multiple: true
|
268
|
+
|
269
|
+
user = klass.new
|
270
|
+
user.interests << :music
|
271
|
+
user.read_attribute(:interests).must_equal [0]
|
272
|
+
user.interests.must_equal %w(music)
|
273
|
+
user.save
|
274
|
+
|
275
|
+
user = klass.find(user.id)
|
276
|
+
user.interests.must_equal %w(music)
|
277
|
+
end
|
278
|
+
|
202
279
|
it 'adds scope' do
|
203
280
|
User.delete_all
|
204
281
|
|
@@ -215,6 +292,12 @@ describe Enumerize::ActiveRecordSupport do
|
|
215
292
|
User.having_role(:admin).must_equal [user_1]
|
216
293
|
end
|
217
294
|
|
295
|
+
it 'ignores not enumerized values that passed to the scope method' do
|
296
|
+
User.delete_all
|
297
|
+
|
298
|
+
User.with_status(:foo).must_equal []
|
299
|
+
end
|
300
|
+
|
218
301
|
it 'allows either key or value as valid' do
|
219
302
|
user_1 = User.new(status: :active)
|
220
303
|
user_2 = User.new(status: 1)
|
@@ -258,6 +341,36 @@ describe Enumerize::ActiveRecordSupport do
|
|
258
341
|
user.errors[:status].wont_be :empty?
|
259
342
|
end
|
260
343
|
|
344
|
+
it 'validates presence with multiple attributes' do
|
345
|
+
user = InterestsRequiredUser.new
|
346
|
+
user.interests = []
|
347
|
+
user.valid?
|
348
|
+
|
349
|
+
user.errors[:interests].wont_be :empty?
|
350
|
+
|
351
|
+
user.interests = ['']
|
352
|
+
user.valid?
|
353
|
+
|
354
|
+
user.errors[:interests].wont_be :empty?
|
355
|
+
|
356
|
+
user.interests = [:dancing, :programming]
|
357
|
+
user.valid?
|
358
|
+
|
359
|
+
user.errors[:interests].must_be_empty
|
360
|
+
end
|
361
|
+
|
362
|
+
it 'is valid after #becomes' do
|
363
|
+
User.delete_all
|
364
|
+
user = User.new
|
365
|
+
user.sex = :male
|
366
|
+
user.save!
|
367
|
+
|
368
|
+
uniq_user = User.find(user.id).becomes(UniqStatusUser)
|
369
|
+
uniq_user.valid?
|
370
|
+
|
371
|
+
uniq_user.errors.must_be_empty
|
372
|
+
end
|
373
|
+
|
261
374
|
it 'supports multiple attributes in #becomes' do
|
262
375
|
User.delete_all
|
263
376
|
|
@@ -291,7 +404,122 @@ describe Enumerize::ActiveRecordSupport do
|
|
291
404
|
user = User.create(:status => :active)
|
292
405
|
user.status = :blocked
|
293
406
|
|
294
|
-
|
295
|
-
|
407
|
+
assert_equal [1, 2], YAML.load(user.changes.to_yaml)[:status]
|
408
|
+
end
|
409
|
+
|
410
|
+
it 'does not change by the practical same value' do
|
411
|
+
user = User.create!(status: 'active')
|
412
|
+
user.reload
|
413
|
+
user.status = 'active'
|
414
|
+
|
415
|
+
user.changes.must_be_empty
|
416
|
+
end
|
417
|
+
|
418
|
+
it 'allows using update_all' do
|
419
|
+
User.delete_all
|
420
|
+
|
421
|
+
user = User.create(status: :active, account_type: :premium)
|
422
|
+
|
423
|
+
User.update_all(status: :blocked)
|
424
|
+
user.reload
|
425
|
+
user.status.must_equal 'blocked'
|
426
|
+
|
427
|
+
User.update_all(status: :active, account_type: :basic)
|
428
|
+
user.reload
|
429
|
+
user.status.must_equal 'active'
|
430
|
+
user.account_type.must_equal 'basic'
|
431
|
+
end
|
432
|
+
|
433
|
+
it 'allows using update_all for multiple enumerize' do
|
434
|
+
User.delete_all
|
435
|
+
|
436
|
+
klass = Class.new(User)
|
437
|
+
klass.enumerize :interests, in: { music: 0, sports: 1, dancing: 2, programming: 3}, multiple: true
|
438
|
+
|
439
|
+
user = klass.create(status: :active)
|
440
|
+
klass.update_all(status: :blocked, interests: [:music, :dancing])
|
441
|
+
|
442
|
+
user = klass.find(user.id)
|
443
|
+
user.status.must_equal 'blocked'
|
444
|
+
user.interests.must_equal %w(music dancing)
|
445
|
+
end
|
446
|
+
|
447
|
+
it 'allows using update_all with values' do
|
448
|
+
User.delete_all
|
449
|
+
|
450
|
+
user = User.create(status: :active)
|
451
|
+
|
452
|
+
User.update_all(status: 2)
|
453
|
+
user.reload
|
454
|
+
user.status.must_equal 'blocked'
|
455
|
+
end
|
456
|
+
|
457
|
+
it 'allows using update_all on relation objects' do
|
458
|
+
User.delete_all
|
459
|
+
|
460
|
+
user = User.create(status: :active, account_type: :premium)
|
461
|
+
|
462
|
+
User.all.update_all(status: :blocked)
|
463
|
+
user.reload
|
464
|
+
user.status.must_equal 'blocked'
|
465
|
+
end
|
466
|
+
|
467
|
+
it 'allows using update_all on association relation objects' do
|
468
|
+
User.delete_all
|
469
|
+
Document.delete_all
|
470
|
+
|
471
|
+
user = User.create
|
472
|
+
document = Document.create(user: user, status: :draft)
|
473
|
+
|
474
|
+
user.documents.update_all(status: :release)
|
475
|
+
document.reload
|
476
|
+
document.status.must_equal 'release'
|
477
|
+
end
|
478
|
+
|
479
|
+
it 'preserves string usage of update_all' do
|
480
|
+
User.delete_all
|
481
|
+
|
482
|
+
user = User.create(name: "Fred")
|
483
|
+
|
484
|
+
User.update_all("name = 'Frederick'")
|
485
|
+
user.reload
|
486
|
+
user.name.must_equal 'Frederick'
|
487
|
+
end
|
488
|
+
|
489
|
+
it 'preserves interpolated array usage of update_all' do
|
490
|
+
User.delete_all
|
491
|
+
|
492
|
+
user = User.create(name: "Fred")
|
493
|
+
|
494
|
+
User.update_all(["name = :name", {name: 'Frederick'}])
|
495
|
+
user.reload
|
496
|
+
user.name.must_equal 'Frederick'
|
497
|
+
end
|
498
|
+
|
499
|
+
it 'sets attribute to nil if given one is not valid' do
|
500
|
+
User.delete_all
|
501
|
+
|
502
|
+
user = User.create(status: :active)
|
503
|
+
|
504
|
+
User.update_all(status: :foo)
|
505
|
+
user.reload
|
506
|
+
user.status.must_be_nil
|
507
|
+
end
|
508
|
+
|
509
|
+
it 'supports AR types serialization' do
|
510
|
+
type = User.type_for_attribute('status')
|
511
|
+
type.must_be_instance_of Enumerize::ActiveRecordSupport::Type
|
512
|
+
serialized = type.serialize('blocked')
|
513
|
+
serialized.must_equal 2
|
514
|
+
end
|
515
|
+
|
516
|
+
it 'has AR type itself JSON serializable' do
|
517
|
+
type = User.type_for_attribute('status')
|
518
|
+
type.as_json['attr'].must_equal 'status'
|
519
|
+
end
|
520
|
+
|
521
|
+
it "doesn't break YAML serialization" do
|
522
|
+
user = YAML.load(User.create(status: :blocked).to_yaml)
|
523
|
+
user.status.must_equal 'blocked'
|
296
524
|
end
|
297
525
|
end
|
data/test/attribute_test.rb
CHANGED
@@ -19,6 +19,12 @@ describe Enumerize::Attribute do
|
|
19
19
|
attr.name.must_equal :foo
|
20
20
|
end
|
21
21
|
|
22
|
+
it 'uses custom value class' do
|
23
|
+
value_class = Class.new(Enumerize::Value)
|
24
|
+
build_attr nil, 'foo', :in => %w[a b], :value_class => value_class
|
25
|
+
attr.values.first.must_be_instance_of value_class
|
26
|
+
end
|
27
|
+
|
22
28
|
describe 'i18n scopes' do
|
23
29
|
it 'returns scopes from options' do
|
24
30
|
build_attr nil, 'foo', :in => %w[a b], :i18n_scope => %w[bar buzz]
|
@@ -79,6 +85,18 @@ describe Enumerize::Attribute do
|
|
79
85
|
end
|
80
86
|
end
|
81
87
|
|
88
|
+
it 'sets up shortcut methods for each value' do
|
89
|
+
build_attr nil, :foo, :in => {:a => 1, :b => 2}
|
90
|
+
|
91
|
+
attr.must_respond_to :a
|
92
|
+
attr.must_respond_to :b
|
93
|
+
|
94
|
+
attr.a.value.must_equal 1
|
95
|
+
attr.b.value.must_equal 2
|
96
|
+
attr.a.text.must_equal 'A'
|
97
|
+
attr.b.text.must_equal 'B'
|
98
|
+
end
|
99
|
+
|
82
100
|
describe 'values hash with zero' do
|
83
101
|
before do
|
84
102
|
build_attr nil, :foo, :in => {:a => 1, :b => 2, :c => 0}
|
@@ -93,6 +111,10 @@ describe Enumerize::Attribute do
|
|
93
111
|
attr.find_value(2).must_equal 'b'
|
94
112
|
attr.find_value(0).must_equal 'c'
|
95
113
|
end
|
114
|
+
|
115
|
+
it 'finds all values by hash values' do
|
116
|
+
attr.find_values(1, 2, 0).must_equal ['a', 'b', 'c']
|
117
|
+
end
|
96
118
|
end
|
97
119
|
|
98
120
|
describe 'boolean values hash' do
|
data/test/base_test.rb
CHANGED
@@ -15,7 +15,7 @@ describe Enumerize::Base do
|
|
15
15
|
|
16
16
|
it 'returns nil when not set' do
|
17
17
|
klass.enumerize(:foo, :in => [:a, :b])
|
18
|
-
object.foo.
|
18
|
+
object.foo.must_be_nil
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'returns value that was set' do
|
@@ -37,11 +37,11 @@ describe Enumerize::Base do
|
|
37
37
|
it 'returns nil as translation when value is nil' do
|
38
38
|
store_translations(:en, :enumerize => {:foo => {:a => 'a text'}}) do
|
39
39
|
klass.enumerize(:foo, :in => [:a, :b])
|
40
|
-
object.foo_text.
|
40
|
+
object.foo_text.must_be_nil
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
-
it 'scopes translation by
|
44
|
+
it 'scopes translation by i18n key' do
|
45
45
|
def klass.model_name
|
46
46
|
name = "ExampleClass"
|
47
47
|
def name.i18n_key
|
@@ -120,7 +120,7 @@ describe Enumerize::Base do
|
|
120
120
|
klass.enumerize(:foo, :in => %w[a b])
|
121
121
|
subklass.enumerize(:bar, :in => %w[c d])
|
122
122
|
|
123
|
-
klass.enumerized_attributes[:bar].
|
123
|
+
klass.enumerized_attributes[:bar].must_be_nil
|
124
124
|
end
|
125
125
|
|
126
126
|
it 'adds new parent class attributes to subclass' do
|
@@ -132,7 +132,7 @@ describe Enumerize::Base do
|
|
132
132
|
it 'stores nil value' do
|
133
133
|
klass.enumerize(:foo, :in => [:a, :b])
|
134
134
|
object.foo = nil
|
135
|
-
object.instance_variable_get(:@foo).
|
135
|
+
object.instance_variable_get(:@foo).must_be_nil
|
136
136
|
end
|
137
137
|
|
138
138
|
it 'casts value to string for validation' do
|
@@ -144,7 +144,7 @@ describe Enumerize::Base do
|
|
144
144
|
it "doesn't cast nil to string for validation" do
|
145
145
|
klass.enumerize(:foo, :in => [:a, :b])
|
146
146
|
object.foo = nil
|
147
|
-
object.read_attribute_for_validation(:foo).
|
147
|
+
object.read_attribute_for_validation(:foo).must_be_nil
|
148
148
|
end
|
149
149
|
|
150
150
|
it 'calls super in the accessor method' do
|
@@ -171,7 +171,7 @@ describe Enumerize::Base do
|
|
171
171
|
|
172
172
|
object = klass.new
|
173
173
|
object.foo.must_be_nil
|
174
|
-
object.attributes.must_equal({
|
174
|
+
object.attributes.must_equal({})
|
175
175
|
|
176
176
|
object.foo = 'test'
|
177
177
|
object.foo.must_equal 'test'
|
data/test/formtastic_test.rb
CHANGED
@@ -1,16 +1,7 @@
|
|
1
1
|
require 'test_helper'
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
module Helpers
|
6
|
-
module InputHelper
|
7
|
-
remove_method :input_class
|
8
|
-
def input_class(as)
|
9
|
-
input_class_with_const_defined(as)
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
2
|
+
|
3
|
+
Formtastic::FormBuilder.action_class_finder = Formtastic::ActionClassFinder
|
4
|
+
Formtastic::FormBuilder.input_class_finder = Formtastic::InputClassFinder
|
14
5
|
|
15
6
|
class FormtasticSpec < MiniTest::Spec
|
16
7
|
include ViewTestHelper
|
data/test/mongo_mapper_test.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
+
begin
|
4
|
+
|
3
5
|
silence_warnings do
|
4
6
|
require 'mongo_mapper'
|
5
7
|
end
|
@@ -27,7 +29,7 @@ describe Enumerize do
|
|
27
29
|
it 'sets nil if invalid value is passed' do
|
28
30
|
user = model.new
|
29
31
|
user.sex = :invalid
|
30
|
-
user.sex.
|
32
|
+
user.sex.must_be_nil
|
31
33
|
end
|
32
34
|
|
33
35
|
it 'saves value' do
|
@@ -66,3 +68,7 @@ describe Enumerize do
|
|
66
68
|
user.sex.must_equal 'female'
|
67
69
|
end
|
68
70
|
end
|
71
|
+
|
72
|
+
rescue LoadError
|
73
|
+
# Skip
|
74
|
+
end
|
data/test/mongoid_test.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
+
begin
|
4
|
+
|
3
5
|
silence_warnings do
|
4
6
|
require 'mongoid'
|
5
7
|
end
|
6
8
|
|
7
9
|
Mongoid.configure do |config|
|
8
|
-
config.
|
9
|
-
config.
|
10
|
-
config.include_root_in_json = true
|
10
|
+
config.connect_to('enumerize-test-suite')
|
11
|
+
config.options = { use_utc: true, include_root_in_json: true }
|
11
12
|
end
|
12
13
|
|
13
14
|
describe Enumerize do
|
@@ -17,9 +18,10 @@ describe Enumerize do
|
|
17
18
|
|
18
19
|
field :sex
|
19
20
|
field :role
|
20
|
-
enumerize :sex,
|
21
|
-
enumerize :
|
22
|
-
enumerize :
|
21
|
+
enumerize :sex, :in => %w[male female], scope: true
|
22
|
+
enumerize :status, :in => %w[notice warning error], scope: true
|
23
|
+
enumerize :role, :in => %w[admin user], :default => 'user', scope: :having_role
|
24
|
+
enumerize :mult, :in => %w[one two three four], :multiple => true
|
23
25
|
end
|
24
26
|
|
25
27
|
before { $VERBOSE = nil }
|
@@ -30,7 +32,7 @@ describe Enumerize do
|
|
30
32
|
it 'sets nil if invalid value is passed' do
|
31
33
|
user = model.new
|
32
34
|
user.sex = :invalid
|
33
|
-
user.sex.
|
35
|
+
user.sex.must_be_nil
|
34
36
|
end
|
35
37
|
|
36
38
|
it 'saves value' do
|
@@ -55,6 +57,21 @@ describe Enumerize do
|
|
55
57
|
model.new.role.must_equal 'user'
|
56
58
|
end
|
57
59
|
|
60
|
+
it 'uses after_initialize callback to set default value' do
|
61
|
+
model.delete_all
|
62
|
+
model.create!(sex: 'male', role: nil)
|
63
|
+
|
64
|
+
user = model.where(sex: 'male').first
|
65
|
+
user.role.must_equal 'user'
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'does not set default value for not selected attributes' do
|
69
|
+
model.delete_all
|
70
|
+
model.create!(sex: :male)
|
71
|
+
|
72
|
+
assert_equal ['_id'], model.only(:id).first.attributes.keys
|
73
|
+
end
|
74
|
+
|
58
75
|
it 'validates inclusion' do
|
59
76
|
user = model.new
|
60
77
|
user.role = 'wrong'
|
@@ -76,4 +93,43 @@ describe Enumerize do
|
|
76
93
|
user = model.first
|
77
94
|
user.mult.to_a.must_equal ['one', 'two']
|
78
95
|
end
|
96
|
+
|
97
|
+
it 'adds scope' do
|
98
|
+
model.delete_all
|
99
|
+
|
100
|
+
user_1 = model.create!(sex: :male, role: :admin)
|
101
|
+
user_2 = model.create!(sex: :female, role: :user)
|
102
|
+
|
103
|
+
model.with_sex(:male).to_a.must_equal [user_1]
|
104
|
+
model.with_sex(:female).to_a.must_equal [user_2]
|
105
|
+
model.with_sex(:male, :female).to_set.must_equal [user_1, user_2].to_set
|
106
|
+
|
107
|
+
model.without_sex(:male).to_a.must_equal [user_2]
|
108
|
+
model.without_sex(:female).to_a.must_equal [user_1]
|
109
|
+
model.without_sex(:male, :female).to_a.must_equal []
|
110
|
+
|
111
|
+
model.having_role(:admin).to_a.must_equal [user_1]
|
112
|
+
model.having_role(:user).to_a.must_equal [user_2]
|
113
|
+
end
|
114
|
+
|
115
|
+
it 'chains scopes' do
|
116
|
+
model.delete_all
|
117
|
+
|
118
|
+
user_1 = model.create!(status: :notice)
|
119
|
+
user_2 = model.create!(status: :warning)
|
120
|
+
user_3 = model.create!(status: :error)
|
121
|
+
|
122
|
+
model.with_status(:notice, :warning).with_status(:notice, :error).to_a.must_equal [user_1]
|
123
|
+
model.with_status(:notice, :warning).union.with_status(:notice, :error).to_a.must_equal [user_1, user_2, user_3]
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'ignores not enumerized values that passed to the scope method' do
|
127
|
+
model.delete_all
|
128
|
+
|
129
|
+
model.with_sex(:foo).must_equal []
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
rescue LoadError
|
134
|
+
# Skip
|
79
135
|
end
|
data/test/multiple_test.rb
CHANGED
@@ -24,6 +24,21 @@ describe Enumerize::Base do
|
|
24
24
|
object.foos.must_equal %w(a c)
|
25
25
|
end
|
26
26
|
|
27
|
+
it 'sets default value as single value' do
|
28
|
+
klass.enumerize :foos, in: %w(a b c), default: 'b', multiple: true
|
29
|
+
object.foos.must_equal %w(b)
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'sets default value as array of one element' do
|
33
|
+
klass.enumerize :foos, in: %w(a b c), default: %w(b), multiple: true
|
34
|
+
object.foos.must_equal %w(b)
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'sets default value as array of several elements' do
|
38
|
+
klass.enumerize :foos, in: %w(a b c), default: %w(b c), multiple: true
|
39
|
+
object.foos.must_equal %w(b c)
|
40
|
+
end
|
41
|
+
|
27
42
|
it "doesn't define _text method" do
|
28
43
|
klass.enumerize :foos, in: %w(a b c), multiple: true
|
29
44
|
object.wont_respond_to :foos_text
|
@@ -33,4 +48,10 @@ describe Enumerize::Base do
|
|
33
48
|
klass.enumerize :foos, in: %w(a b c), multiple: true
|
34
49
|
object.wont_respond_to :foos_value
|
35
50
|
end
|
51
|
+
|
52
|
+
it "cannot define multiple with scope" do
|
53
|
+
assert_raises ArgumentError do
|
54
|
+
klass.enumerize :foos, in: %w(a b c), multiple: true, scope: true
|
55
|
+
end
|
56
|
+
end
|
36
57
|
end
|
data/test/predicates_test.rb
CHANGED
@@ -15,6 +15,12 @@ describe Enumerize::Predicates do
|
|
15
15
|
object.must_respond_to :b?
|
16
16
|
end
|
17
17
|
|
18
|
+
it 'creates predicate methods when enumerized values have dash in it' do
|
19
|
+
klass.enumerize(:foo, in: %w(foo-bar bar-foo), predicates: true)
|
20
|
+
object.must_respond_to :foo_bar?
|
21
|
+
object.must_respond_to :bar_foo?
|
22
|
+
end
|
23
|
+
|
18
24
|
it 'creates predicate methods on multiple attribute' do
|
19
25
|
klass.enumerize(:foo, in: %w(a b), predicates: true, multiple: true)
|
20
26
|
object.must_respond_to :a?
|