enumerize 2.2.1 → 2.5.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 +4 -4
- data/.github/workflows/ruby.yml +73 -0
- data/CHANGELOG.md +35 -1
- data/Gemfile +2 -3
- data/Gemfile.global +2 -10
- data/Gemfile.mongo_mapper +2 -3
- data/Gemfile.rails60 +6 -0
- data/Gemfile.rails61 +6 -0
- data/Gemfile.rails70 +9 -0
- data/Gemfile.railsmaster +5 -0
- data/README.md +205 -94
- data/Rakefile +2 -0
- data/lib/enumerize/activemodel.rb +2 -0
- data/lib/enumerize/activerecord.rb +36 -2
- data/lib/enumerize/attribute.rb +19 -11
- data/lib/enumerize/attribute_map.rb +2 -0
- data/lib/enumerize/base.rb +6 -6
- data/lib/enumerize/hooks/formtastic.rb +4 -1
- data/lib/enumerize/hooks/sequel_dataset.rb +2 -0
- data/lib/enumerize/hooks/simple_form.rb +4 -1
- data/lib/enumerize/hooks/uniqueness.rb +2 -0
- data/lib/enumerize/integrations/rails_admin.rb +2 -0
- data/lib/enumerize/integrations/rspec/matcher.rb +7 -2
- data/lib/enumerize/integrations/rspec.rb +2 -0
- data/lib/enumerize/module.rb +2 -0
- data/lib/enumerize/module_attributes.rb +2 -0
- data/lib/enumerize/mongoid.rb +16 -0
- data/lib/enumerize/predicatable.rb +3 -1
- data/lib/enumerize/predicates.rb +2 -0
- data/lib/enumerize/scope/activerecord.rb +16 -0
- data/lib/enumerize/scope/mongoid.rb +15 -0
- data/lib/enumerize/scope/sequel.rb +16 -0
- data/lib/enumerize/sequel.rb +9 -4
- data/lib/enumerize/set.rb +2 -0
- data/lib/enumerize/utils.rb +12 -0
- data/lib/enumerize/value.rb +14 -15
- data/lib/enumerize/version.rb +1 -1
- data/lib/enumerize.rb +4 -0
- data/lib/sequel/plugins/enumerize.rb +2 -0
- data/spec/enumerize/integrations/rspec/matcher_spec.rb +13 -10
- data/spec/spec_helper.rb +2 -0
- data/test/activemodel_test.rb +24 -22
- data/test/activerecord_test.rb +229 -92
- data/test/attribute_map_test.rb +9 -7
- data/test/attribute_test.rb +37 -30
- data/test/base_test.rb +38 -36
- data/test/formtastic_test.rb +17 -0
- data/test/module_attributes_test.rb +10 -8
- data/test/mongo_mapper_test.rb +19 -10
- data/test/mongoid_test.rb +51 -22
- data/test/multiple_test.rb +15 -7
- data/test/predicates_test.rb +20 -18
- data/test/rails_admin_test.rb +4 -2
- data/test/sequel_test.rb +100 -47
- data/test/set_test.rb +25 -23
- data/test/simple_form_test.rb +17 -0
- data/test/support/mock_controller.rb +2 -0
- data/test/support/shared_enums.rb +43 -0
- data/test/support/view_test_helper.rb +14 -1
- data/test/test_helper.rb +2 -0
- data/test/value_test.rb +51 -30
- metadata +11 -30
- data/.travis.yml +0 -35
- data/Gemfile.rails42 +0 -7
- data/Gemfile.rails50 +0 -7
- data/Gemfile.rails52 +0 -7
data/test/mongoid_test.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'test_helper'
|
|
2
4
|
|
|
3
5
|
begin
|
|
@@ -18,10 +20,16 @@ describe Enumerize do
|
|
|
18
20
|
|
|
19
21
|
field :sex
|
|
20
22
|
field :role
|
|
23
|
+
field :foo
|
|
24
|
+
field :skill
|
|
25
|
+
|
|
21
26
|
enumerize :sex, :in => %w[male female], scope: true
|
|
22
27
|
enumerize :status, :in => %w[notice warning error], scope: true
|
|
23
28
|
enumerize :role, :in => %w[admin user], :default => 'user', scope: :having_role
|
|
24
29
|
enumerize :mult, :in => %w[one two three four], :multiple => true
|
|
30
|
+
enumerize :foo, :in => %w[bar baz], :skip_validations => true
|
|
31
|
+
enumerize :skill, :in => { noob: 0, casual: 1, pro: 2 }, scope: :shallow
|
|
32
|
+
enumerize :account_type, :in => %w[basic premium], scope: :shallow
|
|
25
33
|
end
|
|
26
34
|
|
|
27
35
|
before { $VERBOSE = nil }
|
|
@@ -32,7 +40,7 @@ describe Enumerize do
|
|
|
32
40
|
it 'sets nil if invalid value is passed' do
|
|
33
41
|
user = model.new
|
|
34
42
|
user.sex = :invalid
|
|
35
|
-
user.sex.must_be_nil
|
|
43
|
+
expect(user.sex).must_be_nil
|
|
36
44
|
end
|
|
37
45
|
|
|
38
46
|
it 'saves value' do
|
|
@@ -40,7 +48,7 @@ describe Enumerize do
|
|
|
40
48
|
user = model.new
|
|
41
49
|
user.sex = :female
|
|
42
50
|
user.save!
|
|
43
|
-
user.sex.must_equal 'female'
|
|
51
|
+
expect(user.sex).must_equal 'female'
|
|
44
52
|
end
|
|
45
53
|
|
|
46
54
|
it 'loads value' do
|
|
@@ -48,13 +56,13 @@ describe Enumerize do
|
|
|
48
56
|
model.create!(:sex => :male)
|
|
49
57
|
store_translations(:en, :enumerize => {:sex => {:male => 'Male'}}) do
|
|
50
58
|
user = model.first
|
|
51
|
-
user.sex.must_equal 'male'
|
|
52
|
-
user.sex_text.must_equal 'Male'
|
|
59
|
+
expect(user.sex).must_equal 'male'
|
|
60
|
+
expect(user.sex_text).must_equal 'Male'
|
|
53
61
|
end
|
|
54
62
|
end
|
|
55
63
|
|
|
56
64
|
it 'has default value' do
|
|
57
|
-
model.new.role.must_equal 'user'
|
|
65
|
+
expect(model.new.role).must_equal 'user'
|
|
58
66
|
end
|
|
59
67
|
|
|
60
68
|
it 'uses after_initialize callback to set default value' do
|
|
@@ -62,7 +70,7 @@ describe Enumerize do
|
|
|
62
70
|
model.create!(sex: 'male', role: nil)
|
|
63
71
|
|
|
64
72
|
user = model.where(sex: 'male').first
|
|
65
|
-
user.role.must_equal 'user'
|
|
73
|
+
expect(user.role).must_equal 'user'
|
|
66
74
|
end
|
|
67
75
|
|
|
68
76
|
it 'does not set default value for not selected attributes' do
|
|
@@ -75,7 +83,21 @@ describe Enumerize do
|
|
|
75
83
|
it 'validates inclusion' do
|
|
76
84
|
user = model.new
|
|
77
85
|
user.role = 'wrong'
|
|
78
|
-
user.wont_be :valid?
|
|
86
|
+
expect(user).wont_be :valid?
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
it 'does not validate inclusion when :skip_validations option passed' do
|
|
90
|
+
user = model.new
|
|
91
|
+
user.foo = 'wrong'
|
|
92
|
+
expect(user).must_be :valid?
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
it 'sets value to enumerized field from db when record is reloaded' do
|
|
96
|
+
user = model.create!(mult: [:one])
|
|
97
|
+
model.find(user.id).update(mult: %i[two three])
|
|
98
|
+
expect(user.mult).must_equal %w[one]
|
|
99
|
+
user.reload
|
|
100
|
+
expect(user.mult).must_equal %w[two three]
|
|
79
101
|
end
|
|
80
102
|
|
|
81
103
|
it 'assigns value on loaded record' do
|
|
@@ -83,7 +105,7 @@ describe Enumerize do
|
|
|
83
105
|
model.create!(:sex => :male)
|
|
84
106
|
user = model.first
|
|
85
107
|
user.sex = :female
|
|
86
|
-
user.sex.must_equal 'female'
|
|
108
|
+
expect(user.sex).must_equal 'female'
|
|
87
109
|
end
|
|
88
110
|
|
|
89
111
|
it 'loads multiple properly' do
|
|
@@ -91,25 +113,32 @@ describe Enumerize do
|
|
|
91
113
|
|
|
92
114
|
model.create!(:mult => ['one', 'two'])
|
|
93
115
|
user = model.first
|
|
94
|
-
user.mult.to_a.must_equal ['one', 'two']
|
|
116
|
+
expect(user.mult.to_a).must_equal ['one', 'two']
|
|
95
117
|
end
|
|
96
118
|
|
|
97
119
|
it 'adds scope' do
|
|
98
120
|
model.delete_all
|
|
99
121
|
|
|
100
|
-
user_1 = model.create!(sex: :male, role: :admin)
|
|
101
|
-
user_2 = model.create!(sex: :female, role: :user)
|
|
122
|
+
user_1 = model.create!(sex: :male, skill: :noob, role: :admin, account_type: :basic)
|
|
123
|
+
user_2 = model.create!(sex: :female, skill: :noob, role: :user, account_type: :basic)
|
|
124
|
+
user_3 = model.create!(skill: :pro, account_type: :premium)
|
|
125
|
+
|
|
126
|
+
expect(model.with_sex(:male).to_a).must_equal [user_1]
|
|
127
|
+
expect(model.with_sex(:female).to_a).must_equal [user_2]
|
|
128
|
+
expect(model.with_sex(:male, :female).to_set).must_equal [user_1, user_2].to_set
|
|
129
|
+
|
|
130
|
+
expect(model.without_sex(:male).to_set).must_equal [user_2, user_3].to_set
|
|
131
|
+
expect(model.without_sex(:female).to_set).must_equal [user_1, user_3].to_set
|
|
132
|
+
expect(model.without_sex(:male, :female).to_a).must_equal [user_3]
|
|
102
133
|
|
|
103
|
-
model.
|
|
104
|
-
model.
|
|
105
|
-
model.with_sex(:male, :female).to_set.must_equal [user_1, user_2].to_set
|
|
134
|
+
expect(model.having_role(:admin).to_a).must_equal [user_1]
|
|
135
|
+
expect(model.having_role(:user).to_a).must_equal [user_2, user_3]
|
|
106
136
|
|
|
107
|
-
model.
|
|
108
|
-
model.
|
|
109
|
-
model.without_sex(:male, :female).to_a.must_equal []
|
|
137
|
+
expect(model.pro.to_a).must_equal [user_3]
|
|
138
|
+
expect(model.premium.to_a).must_equal [user_3]
|
|
110
139
|
|
|
111
|
-
model.
|
|
112
|
-
model.
|
|
140
|
+
expect(model.not_pro.to_set).must_equal [user_1, user_2].to_set
|
|
141
|
+
expect(model.not_premium.to_set).must_equal [user_1, user_2].to_set
|
|
113
142
|
end
|
|
114
143
|
|
|
115
144
|
it 'chains scopes' do
|
|
@@ -119,14 +148,14 @@ describe Enumerize do
|
|
|
119
148
|
user_2 = model.create!(status: :warning)
|
|
120
149
|
user_3 = model.create!(status: :error)
|
|
121
150
|
|
|
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]
|
|
151
|
+
expect(model.with_status(:notice, :warning).with_status(:notice, :error).to_a).must_equal [user_1]
|
|
152
|
+
expect(model.with_status(:notice, :warning).union.with_status(:notice, :error).to_a).must_equal [user_1, user_2, user_3]
|
|
124
153
|
end
|
|
125
154
|
|
|
126
155
|
it 'ignores not enumerized values that passed to the scope method' do
|
|
127
156
|
model.delete_all
|
|
128
157
|
|
|
129
|
-
model.with_sex(:foo).must_equal []
|
|
158
|
+
expect(model.with_sex(:foo)).must_equal []
|
|
130
159
|
end
|
|
131
160
|
end
|
|
132
161
|
|
data/test/multiple_test.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'test_helper'
|
|
2
4
|
|
|
3
5
|
describe Enumerize::Base do
|
|
@@ -15,38 +17,38 @@ describe Enumerize::Base do
|
|
|
15
17
|
|
|
16
18
|
it 'returns [] when not set' do
|
|
17
19
|
kklass.enumerize :foos, in: %w(a b), multiple: true
|
|
18
|
-
object.foos.must_equal []
|
|
20
|
+
expect(object.foos).must_equal []
|
|
19
21
|
end
|
|
20
22
|
|
|
21
23
|
it 'returns setted array' do
|
|
22
24
|
kklass.enumerize :foos, in: %w(a b c), multiple: true
|
|
23
25
|
object.foos = %w(a c)
|
|
24
|
-
object.foos.must_equal %w(a c)
|
|
26
|
+
expect(object.foos).must_equal %w(a c)
|
|
25
27
|
end
|
|
26
28
|
|
|
27
29
|
it 'sets default value as single value' do
|
|
28
30
|
kklass.enumerize :foos, in: %w(a b c), default: 'b', multiple: true
|
|
29
|
-
object.foos.must_equal %w(b)
|
|
31
|
+
expect(object.foos).must_equal %w(b)
|
|
30
32
|
end
|
|
31
33
|
|
|
32
34
|
it 'sets default value as array of one element' do
|
|
33
35
|
kklass.enumerize :foos, in: %w(a b c), default: %w(b), multiple: true
|
|
34
|
-
object.foos.must_equal %w(b)
|
|
36
|
+
expect(object.foos).must_equal %w(b)
|
|
35
37
|
end
|
|
36
38
|
|
|
37
39
|
it 'sets default value as array of several elements' do
|
|
38
40
|
kklass.enumerize :foos, in: %w(a b c), default: %w(b c), multiple: true
|
|
39
|
-
object.foos.must_equal %w(b c)
|
|
41
|
+
expect(object.foos).must_equal %w(b c)
|
|
40
42
|
end
|
|
41
43
|
|
|
42
44
|
it "doesn't define _text method" do
|
|
43
45
|
kklass.enumerize :foos, in: %w(a b c), multiple: true
|
|
44
|
-
object.wont_respond_to :foos_text
|
|
46
|
+
expect(object).wont_respond_to :foos_text
|
|
45
47
|
end
|
|
46
48
|
|
|
47
49
|
it "doesn't define _value method" do
|
|
48
50
|
kklass.enumerize :foos, in: %w(a b c), multiple: true
|
|
49
|
-
object.wont_respond_to :foos_value
|
|
51
|
+
expect(object).wont_respond_to :foos_value
|
|
50
52
|
end
|
|
51
53
|
|
|
52
54
|
it "cannot define multiple with scope" do
|
|
@@ -54,4 +56,10 @@ describe Enumerize::Base do
|
|
|
54
56
|
kklass.enumerize :foos, in: %w(a b c), multiple: true, scope: true
|
|
55
57
|
end
|
|
56
58
|
end
|
|
59
|
+
|
|
60
|
+
it 'assign a name with the first letter capitalized' do
|
|
61
|
+
kklass.enumerize :Foos, in: %w(a b c), multiple: true
|
|
62
|
+
object.Foos = %w(a c)
|
|
63
|
+
expect(object.Foos).must_equal %w(a c)
|
|
64
|
+
end
|
|
57
65
|
end
|
data/test/predicates_test.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'test_helper'
|
|
2
4
|
|
|
3
5
|
describe Enumerize::Predicates do
|
|
@@ -11,53 +13,53 @@ describe Enumerize::Predicates do
|
|
|
11
13
|
|
|
12
14
|
it 'creates predicate methods' do
|
|
13
15
|
kklass.enumerize(:foo, in: %w(a b), predicates: true)
|
|
14
|
-
object.must_respond_to :a?
|
|
15
|
-
object.must_respond_to :b?
|
|
16
|
+
expect(object).must_respond_to :a?
|
|
17
|
+
expect(object).must_respond_to :b?
|
|
16
18
|
end
|
|
17
19
|
|
|
18
20
|
it 'creates predicate methods when enumerized values have dash in it' do
|
|
19
21
|
kklass.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
|
+
expect(object).must_respond_to :foo_bar?
|
|
23
|
+
expect(object).must_respond_to :bar_foo?
|
|
22
24
|
end
|
|
23
25
|
|
|
24
26
|
it 'creates predicate methods on multiple attribute' do
|
|
25
27
|
kklass.enumerize(:foo, in: %w(a b), predicates: true, multiple: true)
|
|
26
|
-
object.must_respond_to :a?
|
|
27
|
-
object.must_respond_to :b?
|
|
28
|
+
expect(object).must_respond_to :a?
|
|
29
|
+
expect(object).must_respond_to :b?
|
|
28
30
|
end
|
|
29
31
|
|
|
30
32
|
it 'checks values' do
|
|
31
33
|
kklass.enumerize(:foo, in: %w(a b), predicates: true)
|
|
32
34
|
object.foo = 'a'
|
|
33
|
-
object.a
|
|
34
|
-
object.b
|
|
35
|
+
expect(object.a?).must_equal true
|
|
36
|
+
expect(object.b?).must_equal false
|
|
35
37
|
end
|
|
36
38
|
|
|
37
39
|
it 'checks values on multiple attribute' do
|
|
38
40
|
kklass.enumerize(:foo, in: %w(a b), predicates: true, multiple: true)
|
|
39
41
|
object.foo << :a
|
|
40
|
-
object.a
|
|
41
|
-
object.b
|
|
42
|
+
expect(object.a?).must_equal true
|
|
43
|
+
expect(object.b?).must_equal false
|
|
42
44
|
end
|
|
43
45
|
|
|
44
46
|
it 'prefixes methods' do
|
|
45
47
|
kklass.enumerize(:foo, in: %w(a b), predicates: { prefix: 'bar' })
|
|
46
|
-
object.wont_respond_to :a?
|
|
47
|
-
object.wont_respond_to :b?
|
|
48
|
-
object.must_respond_to :bar_a?
|
|
49
|
-
object.must_respond_to :bar_b?
|
|
48
|
+
expect(object).wont_respond_to :a?
|
|
49
|
+
expect(object).wont_respond_to :b?
|
|
50
|
+
expect(object).must_respond_to :bar_a?
|
|
51
|
+
expect(object).must_respond_to :bar_b?
|
|
50
52
|
end
|
|
51
53
|
|
|
52
54
|
it 'accepts only option' do
|
|
53
55
|
kklass.enumerize(:foo, in: %w(a b), predicates: { only: :a })
|
|
54
|
-
object.must_respond_to :a?
|
|
55
|
-
object.wont_respond_to :b?
|
|
56
|
+
expect(object).must_respond_to :a?
|
|
57
|
+
expect(object).wont_respond_to :b?
|
|
56
58
|
end
|
|
57
59
|
|
|
58
60
|
it 'accepts except option' do
|
|
59
61
|
kklass.enumerize(:foo, in: %w(a b), predicates: { except: :a })
|
|
60
|
-
object.wont_respond_to :a?
|
|
61
|
-
object.must_respond_to :b?
|
|
62
|
+
expect(object).wont_respond_to :a?
|
|
63
|
+
expect(object).must_respond_to :b?
|
|
62
64
|
end
|
|
63
65
|
end
|
data/test/rails_admin_test.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'test_helper'
|
|
2
4
|
|
|
3
5
|
class RailsAdminSpec < MiniTest::Spec
|
|
@@ -12,14 +14,14 @@ class RailsAdminSpec < MiniTest::Spec
|
|
|
12
14
|
it 'defines enum method' do
|
|
13
15
|
store_translations(:en, :enumerize => {:foo => {:a => 'a text', :b => 'b text'}}) do
|
|
14
16
|
kklass.enumerize(:foo, in: [:a, :b])
|
|
15
|
-
object.foo_enum.must_equal [['a text', 'a'], ['b text', 'b']]
|
|
17
|
+
expect(object.foo_enum).must_equal [['a text', 'a'], ['b text', 'b']]
|
|
16
18
|
end
|
|
17
19
|
end
|
|
18
20
|
|
|
19
21
|
it 'defines enum properly for custom values enumerations' do
|
|
20
22
|
store_translations(:en, :enumerize => {:foo => {:a => 'a text', :b => 'b text'}}) do
|
|
21
23
|
kklass.enumerize(:foo, in: {:a => 1, :b => 2})
|
|
22
|
-
object.foo_enum.must_equal [['a text', 'a'], ['b text', 'b']]
|
|
24
|
+
expect(object.foo_enum).must_equal [['a text', 'a'], ['b text', 'b']]
|
|
23
25
|
end
|
|
24
26
|
end
|
|
25
27
|
end
|
data/test/sequel_test.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'test_helper'
|
|
2
4
|
require 'sequel'
|
|
3
5
|
require 'logger'
|
|
@@ -21,7 +23,9 @@ module SequelTest
|
|
|
21
23
|
String :name
|
|
22
24
|
String :interests
|
|
23
25
|
String :status
|
|
26
|
+
Integer :skill
|
|
24
27
|
String :account_type, default: "basic"
|
|
28
|
+
String :foo
|
|
25
29
|
end
|
|
26
30
|
|
|
27
31
|
DB.create_table :documents do
|
|
@@ -50,12 +54,14 @@ module SequelTest
|
|
|
50
54
|
plugin :enumerize
|
|
51
55
|
include RoleEnum
|
|
52
56
|
|
|
53
|
-
enumerize :sex, :in => [:male, :female]
|
|
57
|
+
enumerize :sex, :in => [:male, :female], scope: :shallow
|
|
54
58
|
|
|
55
59
|
enumerize :interests, :in => [:music, :sports, :dancing, :programming], :multiple => true
|
|
56
60
|
|
|
57
61
|
enumerize :status, :in => { active: 1, blocked: 2 }, scope: true
|
|
58
62
|
|
|
63
|
+
enumerize :skill, :in => { noob: 0, casual: 1, pro: 2 }, scope: :shallow
|
|
64
|
+
|
|
59
65
|
enumerize :account_type, :in => [:basic, :premium]
|
|
60
66
|
end
|
|
61
67
|
|
|
@@ -67,11 +73,27 @@ module SequelTest
|
|
|
67
73
|
end
|
|
68
74
|
end
|
|
69
75
|
|
|
76
|
+
class SkipValidationsUser < Sequel::Model(:users)
|
|
77
|
+
include SkipValidationsEnum
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
class DoNotSkipValidationsUser < Sequel::Model(:users)
|
|
81
|
+
include DoNotSkipValidationsEnum
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
class SkipValidationsLambdaUser < Sequel::Model(:users)
|
|
85
|
+
include SkipValidationsLambdaEnum
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
class SkipValidationsLambdaWithParamUser < Sequel::Model(:users)
|
|
89
|
+
include SkipValidationsLambdaWithParamEnum
|
|
90
|
+
end
|
|
91
|
+
|
|
70
92
|
describe Enumerize::SequelSupport do
|
|
71
93
|
it 'sets nil if invalid value is passed' do
|
|
72
94
|
user = User.new
|
|
73
95
|
user.sex = :invalid
|
|
74
|
-
user.sex.must_be_nil
|
|
96
|
+
expect(user.sex).must_be_nil
|
|
75
97
|
end
|
|
76
98
|
|
|
77
99
|
it 'saves value' do
|
|
@@ -79,7 +101,7 @@ module SequelTest
|
|
|
79
101
|
user = User.new
|
|
80
102
|
user.sex = :female
|
|
81
103
|
user.save
|
|
82
|
-
user.sex.must_equal 'female'
|
|
104
|
+
expect(user.sex).must_equal 'female'
|
|
83
105
|
end
|
|
84
106
|
|
|
85
107
|
it 'loads value' do
|
|
@@ -87,14 +109,14 @@ module SequelTest
|
|
|
87
109
|
User.create(:sex => :male)
|
|
88
110
|
store_translations(:en, :enumerize => {:sex => {:male => 'Male'}}) do
|
|
89
111
|
user = User.first
|
|
90
|
-
user.sex.must_equal 'male'
|
|
91
|
-
user.sex_text.must_equal 'Male'
|
|
112
|
+
expect(user.sex).must_equal 'male'
|
|
113
|
+
expect(user.sex_text).must_equal 'Male'
|
|
92
114
|
end
|
|
93
115
|
end
|
|
94
116
|
|
|
95
117
|
it 'has default value' do
|
|
96
|
-
User.new.role.must_equal 'user'
|
|
97
|
-
User.new.values[:role].must_equal 'user'
|
|
118
|
+
expect(User.new.role).must_equal 'user'
|
|
119
|
+
expect(User.new.values[:role]).must_equal 'user'
|
|
98
120
|
end
|
|
99
121
|
|
|
100
122
|
it 'does not set default value for not selected attributes' do
|
|
@@ -105,26 +127,26 @@ module SequelTest
|
|
|
105
127
|
end
|
|
106
128
|
|
|
107
129
|
it 'has default value with lambda' do
|
|
108
|
-
User.new.lambda_role.must_equal 'admin'
|
|
109
|
-
User.new.values[:lambda_role].must_equal 'admin'
|
|
130
|
+
expect(User.new.lambda_role).must_equal 'admin'
|
|
131
|
+
expect(User.new.values[:lambda_role]).must_equal 'admin'
|
|
110
132
|
end
|
|
111
133
|
it 'uses after_initialize callback to set default value' do
|
|
112
134
|
User.filter{ true }.delete
|
|
113
135
|
User.create(sex: 'male', lambda_role: nil)
|
|
114
136
|
|
|
115
137
|
user = User.where(:sex => 'male').first
|
|
116
|
-
user.lambda_role.must_equal 'admin'
|
|
138
|
+
expect(user.lambda_role).must_equal 'admin'
|
|
117
139
|
end
|
|
118
140
|
|
|
119
141
|
it 'uses default value from db column' do
|
|
120
|
-
User.new.account_type.must_equal 'basic'
|
|
142
|
+
expect(User.new.account_type).must_equal 'basic'
|
|
121
143
|
end
|
|
122
144
|
|
|
123
145
|
it 'validates inclusion' do
|
|
124
146
|
user = User.new
|
|
125
147
|
user.role = 'wrong'
|
|
126
|
-
user.wont_be :valid?
|
|
127
|
-
user.errors[:role].must_include 'is not included in the list'
|
|
148
|
+
expect(user).wont_be :valid?
|
|
149
|
+
expect(user.errors[:role]).must_include 'is not included in the list'
|
|
128
150
|
end
|
|
129
151
|
|
|
130
152
|
it 'validates inclusion on mass assignment' do
|
|
@@ -135,41 +157,66 @@ module SequelTest
|
|
|
135
157
|
|
|
136
158
|
it "uses persisted value for validation if it hasn't been set" do
|
|
137
159
|
user = User.create :sex => :male
|
|
138
|
-
User[user.id].read_attribute_for_validation(:sex).must_equal 'male'
|
|
160
|
+
expect(User[user.id].read_attribute_for_validation(:sex)).must_equal 'male'
|
|
139
161
|
end
|
|
140
162
|
|
|
141
163
|
it 'is valid with empty string assigned' do
|
|
142
164
|
user = User.new
|
|
143
165
|
user.role = ''
|
|
144
|
-
user.must_be :valid?
|
|
166
|
+
expect(user).must_be :valid?
|
|
145
167
|
end
|
|
146
168
|
|
|
147
169
|
it 'stores nil when empty string assigned' do
|
|
148
170
|
user = User.new
|
|
149
171
|
user.role = ''
|
|
150
|
-
user.values[:role].must_be_nil
|
|
172
|
+
expect(user.values[:role]).must_be_nil
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
it 'validates inclusion when :skip_validations = false' do
|
|
176
|
+
user = DoNotSkipValidationsUser.new
|
|
177
|
+
user.foo = 'wrong'
|
|
178
|
+
expect(user).wont_be :valid?
|
|
179
|
+
expect(user.errors[:foo]).must_include 'is not included in the list'
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
it 'does not validate inclusion when :skip_validations = true' do
|
|
183
|
+
user = SkipValidationsUser.new
|
|
184
|
+
user.foo = 'wrong'
|
|
185
|
+
expect(user).must_be :valid?
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
it 'supports :skip_validations option as lambda' do
|
|
189
|
+
user = SkipValidationsLambdaUser.new
|
|
190
|
+
user.foo = 'wrong'
|
|
191
|
+
expect(user).must_be :valid?
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
it 'supports :skip_validations option as lambda with a parameter' do
|
|
195
|
+
user = SkipValidationsLambdaWithParamUser.new
|
|
196
|
+
user.foo = 'wrong'
|
|
197
|
+
expect(user).must_be :valid?
|
|
151
198
|
end
|
|
152
199
|
|
|
153
200
|
it 'supports multiple attributes' do
|
|
154
201
|
user = User.new
|
|
155
202
|
user.interests ||= []
|
|
156
|
-
user.interests.must_be_empty
|
|
203
|
+
expect(user.interests).must_be_empty
|
|
157
204
|
user.interests << "music"
|
|
158
|
-
user.interests.must_equal %w(music)
|
|
205
|
+
expect(user.interests).must_equal %w(music)
|
|
159
206
|
user.save
|
|
160
207
|
|
|
161
208
|
user = User[user.id]
|
|
162
|
-
user.interests.must_be_instance_of Enumerize::Set
|
|
163
|
-
user.interests.must_equal %w(music)
|
|
209
|
+
expect(user.interests).must_be_instance_of Enumerize::Set
|
|
210
|
+
expect(user.interests).must_equal %w(music)
|
|
164
211
|
user.interests << "sports"
|
|
165
|
-
user.interests.must_equal %w(music sports)
|
|
212
|
+
expect(user.interests).must_equal %w(music sports)
|
|
166
213
|
|
|
167
214
|
user.interests = []
|
|
168
215
|
interests = user.interests
|
|
169
216
|
interests << "music"
|
|
170
|
-
interests.must_equal %w(music)
|
|
217
|
+
expect(interests).must_equal %w(music)
|
|
171
218
|
interests << "dancing"
|
|
172
|
-
interests.must_equal %w(music dancing)
|
|
219
|
+
expect(interests).must_equal %w(music dancing)
|
|
173
220
|
end
|
|
174
221
|
|
|
175
222
|
it 'returns invalid multiple value for validation' do
|
|
@@ -177,19 +224,19 @@ module SequelTest
|
|
|
177
224
|
user.interests << :music
|
|
178
225
|
user.interests << :invalid
|
|
179
226
|
values = user.read_attribute_for_validation(:interests)
|
|
180
|
-
values.must_equal %w(music invalid)
|
|
227
|
+
expect(values).must_equal %w(music invalid)
|
|
181
228
|
end
|
|
182
229
|
|
|
183
230
|
it 'validates multiple attributes' do
|
|
184
231
|
user = User.new
|
|
185
232
|
user.interests << :invalid
|
|
186
|
-
user.wont_be :valid?
|
|
233
|
+
expect(user).wont_be :valid?
|
|
187
234
|
|
|
188
235
|
user.interests = Object.new
|
|
189
|
-
user.wont_be :valid?
|
|
236
|
+
expect(user).wont_be :valid?
|
|
190
237
|
|
|
191
238
|
user.interests = ['music', '']
|
|
192
|
-
user.must_be :valid?
|
|
239
|
+
expect(user).must_be :valid?
|
|
193
240
|
end
|
|
194
241
|
|
|
195
242
|
it 'stores custom values for multiple attributes' do
|
|
@@ -200,27 +247,33 @@ module SequelTest
|
|
|
200
247
|
|
|
201
248
|
user = klass.new
|
|
202
249
|
user.interests << :music
|
|
203
|
-
user.interests.must_equal %w(music)
|
|
250
|
+
expect(user.interests).must_equal %w(music)
|
|
204
251
|
user.save
|
|
205
252
|
|
|
206
253
|
user = klass[user.id]
|
|
207
|
-
user.interests.must_equal %w(music)
|
|
254
|
+
expect(user.interests).must_equal %w(music)
|
|
208
255
|
end
|
|
209
256
|
|
|
210
257
|
it 'adds scope' do
|
|
211
258
|
User.filter{ true }.delete
|
|
212
259
|
|
|
213
|
-
user_1 = User.create(status: :active, role: :admin)
|
|
214
|
-
user_2 = User.create(status: :blocked)
|
|
260
|
+
user_1 = User.create(sex: :female, skill: :noob, status: :active, role: :admin)
|
|
261
|
+
user_2 = User.create(sex: :female, skill: :casual, status: :blocked)
|
|
262
|
+
user_3 = User.create(sex: :male, skill: :pro)
|
|
263
|
+
|
|
264
|
+
expect(User.with_status(:active).to_a).must_equal [user_1]
|
|
265
|
+
expect(User.with_status(:blocked).to_a).must_equal [user_2]
|
|
266
|
+
expect(User.with_status(:active, :blocked).to_set).must_equal [user_1, user_2].to_set
|
|
215
267
|
|
|
216
|
-
User.
|
|
217
|
-
User.
|
|
218
|
-
User.with_status(:active, :blocked).to_set.must_equal [user_1, user_2].to_set
|
|
268
|
+
expect(User.without_status(:active).to_a).must_equal [user_2]
|
|
269
|
+
expect(User.without_status(:active, :blocked).to_a).must_equal []
|
|
219
270
|
|
|
220
|
-
User.
|
|
221
|
-
User.
|
|
271
|
+
expect(User.having_role(:admin).to_a).must_equal [user_1]
|
|
272
|
+
expect(User.male.to_a).must_equal [user_3]
|
|
273
|
+
expect(User.pro.to_a).must_equal [user_3]
|
|
222
274
|
|
|
223
|
-
User.
|
|
275
|
+
expect(User.not_male.to_set).must_equal [user_1, user_2].to_set
|
|
276
|
+
expect(User.not_pro.to_set).must_equal [user_1, user_2].to_set
|
|
224
277
|
end
|
|
225
278
|
|
|
226
279
|
it 'allows either key or value as valid' do
|
|
@@ -228,13 +281,13 @@ module SequelTest
|
|
|
228
281
|
user_2 = User.new(status: 1)
|
|
229
282
|
user_3 = User.new(status: '1')
|
|
230
283
|
|
|
231
|
-
user_1.status.must_equal 'active'
|
|
232
|
-
user_2.status.must_equal 'active'
|
|
233
|
-
user_3.status.must_equal 'active'
|
|
284
|
+
expect(user_1.status).must_equal 'active'
|
|
285
|
+
expect(user_2.status).must_equal 'active'
|
|
286
|
+
expect(user_3.status).must_equal 'active'
|
|
234
287
|
|
|
235
|
-
user_1.must_be :valid?
|
|
236
|
-
user_2.must_be :valid?
|
|
237
|
-
user_3.must_be :valid?
|
|
288
|
+
expect(user_1).must_be :valid?
|
|
289
|
+
expect(user_2).must_be :valid?
|
|
290
|
+
expect(user_3).must_be :valid?
|
|
238
291
|
end
|
|
239
292
|
|
|
240
293
|
it 'supports defining enumerized attributes on abstract class' do
|
|
@@ -242,7 +295,7 @@ module SequelTest
|
|
|
242
295
|
|
|
243
296
|
document = Document.new
|
|
244
297
|
document.visibility = :protected
|
|
245
|
-
document.visibility.must_equal 'protected'
|
|
298
|
+
expect(document.visibility).must_equal 'protected'
|
|
246
299
|
end
|
|
247
300
|
|
|
248
301
|
it 'supports defining enumerized scopes on abstract class' do
|
|
@@ -251,7 +304,7 @@ module SequelTest
|
|
|
251
304
|
document_1 = Document.create(visibility: :public)
|
|
252
305
|
document_2 = Document.create(visibility: :private)
|
|
253
306
|
|
|
254
|
-
Document.with_visibility(:public).to_a.must_equal [document_1]
|
|
307
|
+
expect(Document.with_visibility(:public).to_a).must_equal [document_1]
|
|
255
308
|
end
|
|
256
309
|
|
|
257
310
|
it 'validates uniqueness' do
|
|
@@ -260,9 +313,9 @@ module SequelTest
|
|
|
260
313
|
user = UniqStatusUser.new
|
|
261
314
|
user.sex = "male"
|
|
262
315
|
user.status = :active
|
|
263
|
-
user.valid
|
|
316
|
+
expect(user.valid?).must_equal false
|
|
264
317
|
|
|
265
|
-
user.errors[:status].wont_be :empty?
|
|
318
|
+
expect(user.errors[:status]).wont_be :empty?
|
|
266
319
|
end
|
|
267
320
|
|
|
268
321
|
it "doesn't update record" do
|