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/activerecord_test.rb
CHANGED
|
@@ -14,26 +14,46 @@ silence_warnings do
|
|
|
14
14
|
'adapter' => 'sqlite3',
|
|
15
15
|
'database' => ':memory:'
|
|
16
16
|
},
|
|
17
|
+
'mysql2' => {
|
|
18
|
+
'adapter' => 'mysql2',
|
|
19
|
+
'host' => '127.0.0.1',
|
|
20
|
+
'username' => 'root',
|
|
21
|
+
'password' => ENV['MYSQL_ROOT_PASSWORD'],
|
|
22
|
+
'database' => 'enumerize_test',
|
|
23
|
+
'encoding' => 'utf8mb4',
|
|
24
|
+
'charset' => 'utf8mb4'
|
|
25
|
+
},
|
|
17
26
|
'postgresql' => {
|
|
18
27
|
'adapter' => 'postgresql',
|
|
19
|
-
'
|
|
20
|
-
'
|
|
21
|
-
'
|
|
28
|
+
'host' => 'localhost',
|
|
29
|
+
'username' => ENV['POSTGRES_USER'],
|
|
30
|
+
'password' => ENV['POSTGRES_PASSWORD']
|
|
22
31
|
},
|
|
23
32
|
'postgresql_master' => {
|
|
24
33
|
'adapter' => 'postgresql',
|
|
25
|
-
'
|
|
26
|
-
'
|
|
34
|
+
'host' => 'localhost',
|
|
35
|
+
'username' => ENV['POSTGRES_USER'],
|
|
36
|
+
'password' => ENV['POSTGRES_PASSWORD'],
|
|
27
37
|
'database' => 'template1',
|
|
28
38
|
'schema_search_path' => 'public'
|
|
29
39
|
}
|
|
30
40
|
}
|
|
31
|
-
|
|
41
|
+
|
|
42
|
+
case db
|
|
43
|
+
when :postgresql
|
|
32
44
|
ActiveRecord::Base.establish_connection(:postgresql_master)
|
|
33
45
|
ActiveRecord::Base.connection.recreate_database('enumerize_test')
|
|
34
|
-
|
|
46
|
+
when :mysql2
|
|
47
|
+
if ActiveRecord::Base.configurations.respond_to?(:[])
|
|
48
|
+
ActiveRecord::Tasks::DatabaseTasks.create ActiveRecord::Base.configurations[db.to_s]
|
|
49
|
+
else
|
|
50
|
+
ActiveRecord::Tasks::DatabaseTasks.create ActiveRecord::Base.configurations.find_db_config(db.to_s)
|
|
51
|
+
end
|
|
35
52
|
|
|
36
|
-
|
|
53
|
+
ActiveRecord::Base.establish_connection(db)
|
|
54
|
+
else
|
|
55
|
+
ActiveRecord::Base.establish_connection(db)
|
|
56
|
+
end
|
|
37
57
|
end
|
|
38
58
|
|
|
39
59
|
ActiveRecord::Base.connection.instance_eval do
|
|
@@ -44,7 +64,10 @@ ActiveRecord::Base.connection.instance_eval do
|
|
|
44
64
|
t.string :name
|
|
45
65
|
t.string :interests
|
|
46
66
|
t.integer :status
|
|
67
|
+
t.text :settings
|
|
68
|
+
t.integer :skill
|
|
47
69
|
t.string :account_type, :default => :basic
|
|
70
|
+
t.string :foo
|
|
48
71
|
end
|
|
49
72
|
|
|
50
73
|
create_table :documents do |t|
|
|
@@ -78,13 +101,18 @@ class User < ActiveRecord::Base
|
|
|
78
101
|
extend Enumerize
|
|
79
102
|
include RoleEnum
|
|
80
103
|
|
|
81
|
-
|
|
104
|
+
store :settings, accessors: [:language]
|
|
105
|
+
|
|
106
|
+
enumerize :sex, :in => [:male, :female], scope: :shallow
|
|
107
|
+
enumerize :language, :in => [:en, :jp]
|
|
82
108
|
|
|
83
109
|
serialize :interests, Array
|
|
84
110
|
enumerize :interests, :in => [:music, :sports, :dancing, :programming], :multiple => true
|
|
85
111
|
|
|
86
112
|
enumerize :status, :in => { active: 1, blocked: 2 }, scope: true
|
|
87
113
|
|
|
114
|
+
enumerize :skill, :in => { noob: 0, casual: 1, pro: 2 }, scope: :shallow
|
|
115
|
+
|
|
88
116
|
enumerize :account_type, :in => [:basic, :premium]
|
|
89
117
|
|
|
90
118
|
# There is no column for relationship enumeration for testing purposes: model
|
|
@@ -103,11 +131,31 @@ class InterestsRequiredUser < User
|
|
|
103
131
|
validates :interests, presence: true
|
|
104
132
|
end
|
|
105
133
|
|
|
134
|
+
class SkipValidationsUser < ActiveRecord::Base
|
|
135
|
+
self.table_name = "users"
|
|
136
|
+
include SkipValidationsEnum
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
class DoNotSkipValidationsUser < ActiveRecord::Base
|
|
140
|
+
self.table_name = "users"
|
|
141
|
+
include DoNotSkipValidationsEnum
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
class SkipValidationsLambdaUser < ActiveRecord::Base
|
|
145
|
+
self.table_name = "users"
|
|
146
|
+
include SkipValidationsLambdaEnum
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
class SkipValidationsLambdaWithParamUser < ActiveRecord::Base
|
|
150
|
+
self.table_name = "users"
|
|
151
|
+
include SkipValidationsLambdaWithParamEnum
|
|
152
|
+
end
|
|
153
|
+
|
|
106
154
|
describe Enumerize::ActiveRecordSupport do
|
|
107
155
|
it 'sets nil if invalid value is passed' do
|
|
108
156
|
user = User.new
|
|
109
157
|
user.sex = :invalid
|
|
110
|
-
user.sex.must_be_nil
|
|
158
|
+
expect(user.sex).must_be_nil
|
|
111
159
|
end
|
|
112
160
|
|
|
113
161
|
it 'saves value' do
|
|
@@ -115,7 +163,7 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
115
163
|
user = User.new
|
|
116
164
|
user.sex = :female
|
|
117
165
|
user.save!
|
|
118
|
-
user.sex.must_equal 'female'
|
|
166
|
+
expect(user.sex).must_equal 'female'
|
|
119
167
|
end
|
|
120
168
|
|
|
121
169
|
it 'loads value' do
|
|
@@ -123,26 +171,43 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
123
171
|
User.create!(:sex => :male)
|
|
124
172
|
store_translations(:en, :enumerize => {:sex => {:male => 'Male'}}) do
|
|
125
173
|
user = User.first
|
|
126
|
-
user.sex.must_equal 'male'
|
|
127
|
-
user.sex_text.must_equal 'Male'
|
|
174
|
+
expect(user.sex).must_equal 'male'
|
|
175
|
+
expect(user.sex_text).must_equal 'Male'
|
|
128
176
|
end
|
|
129
177
|
end
|
|
130
178
|
|
|
179
|
+
it 'sets nil if invalid stored attribute value is passed' do
|
|
180
|
+
user = User.new
|
|
181
|
+
user.language = :invalid
|
|
182
|
+
expect(user.language).must_be_nil
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
it 'saves stored attribute value' do
|
|
186
|
+
User.delete_all
|
|
187
|
+
user = User.new
|
|
188
|
+
user.language = :en
|
|
189
|
+
user.save!
|
|
190
|
+
user.reload
|
|
191
|
+
expect(user.language).must_equal 'en'
|
|
192
|
+
end
|
|
193
|
+
|
|
131
194
|
it 'has default value' do
|
|
132
|
-
User.new.role.must_equal 'user'
|
|
133
|
-
User.new.attributes['role'].must_equal 'user'
|
|
195
|
+
expect(User.new.role).must_equal 'user'
|
|
196
|
+
expect(User.new.attributes['role']).must_equal 'user'
|
|
134
197
|
end
|
|
135
198
|
|
|
136
199
|
it 'does not set default value for not selected attributes' do
|
|
137
200
|
User.delete_all
|
|
138
201
|
User.create!(:sex => :male)
|
|
139
202
|
|
|
140
|
-
|
|
203
|
+
user = User.select(:id).first
|
|
204
|
+
expect(user.attributes['role']).must_be_nil
|
|
205
|
+
expect(user.attributes['lambda_role']).must_be_nil
|
|
141
206
|
end
|
|
142
207
|
|
|
143
208
|
it 'has default value with lambda' do
|
|
144
|
-
User.new.lambda_role.must_equal 'admin'
|
|
145
|
-
User.new.attributes['lambda_role'].must_equal 'admin'
|
|
209
|
+
expect(User.new.lambda_role).must_equal 'admin'
|
|
210
|
+
expect(User.new.attributes['lambda_role']).must_equal 'admin'
|
|
146
211
|
end
|
|
147
212
|
|
|
148
213
|
it 'uses after_initialize callback to set default value' do
|
|
@@ -150,11 +215,11 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
150
215
|
User.create!(sex: 'male', lambda_role: nil)
|
|
151
216
|
|
|
152
217
|
user = User.where(:sex => 'male').first
|
|
153
|
-
user.lambda_role.must_equal 'admin'
|
|
218
|
+
expect(user.lambda_role).must_equal 'admin'
|
|
154
219
|
end
|
|
155
220
|
|
|
156
221
|
it 'uses default value from db column' do
|
|
157
|
-
User.new.account_type.must_equal 'basic'
|
|
222
|
+
expect(User.new.account_type).must_equal 'basic'
|
|
158
223
|
end
|
|
159
224
|
|
|
160
225
|
it 'has default value with default scope' do
|
|
@@ -162,31 +227,39 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
162
227
|
default_scope -> { having_role(:user) }
|
|
163
228
|
end
|
|
164
229
|
|
|
165
|
-
UserWithDefaultScope.new.role.must_equal 'user'
|
|
166
|
-
UserWithDefaultScope.new.attributes['role'].must_equal 'user'
|
|
230
|
+
expect(UserWithDefaultScope.new.role).must_equal 'user'
|
|
231
|
+
expect(UserWithDefaultScope.new.attributes['role']).must_equal 'user'
|
|
167
232
|
end
|
|
168
233
|
|
|
169
234
|
it 'validates inclusion' do
|
|
170
235
|
user = User.new
|
|
171
236
|
user.role = 'wrong'
|
|
172
|
-
user.wont_be :valid?
|
|
173
|
-
user.errors[:role].must_include 'is not included in the list'
|
|
237
|
+
expect(user).wont_be :valid?
|
|
238
|
+
expect(user.errors[:role]).must_include 'is not included in the list'
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
it 'sets value to enumerized field from db when record is reloaded' do
|
|
242
|
+
user = User.create!(interests: [:music])
|
|
243
|
+
User.find(user.id).update(interests: %i[music dancing])
|
|
244
|
+
expect(user.interests).must_equal %w[music]
|
|
245
|
+
user.reload
|
|
246
|
+
expect(user.interests).must_equal %w[music dancing]
|
|
174
247
|
end
|
|
175
248
|
|
|
176
249
|
it 'validates inclusion when using write_attribute with string attribute' do
|
|
177
250
|
user = User.new
|
|
178
251
|
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'
|
|
252
|
+
expect(user.read_attribute_for_validation(:role)).must_equal 'wrong'
|
|
253
|
+
expect(user).wont_be :valid?
|
|
254
|
+
expect(user.errors[:role]).must_include 'is not included in the list'
|
|
182
255
|
end
|
|
183
256
|
|
|
184
257
|
it 'validates inclusion when using write_attribute with symbol attribute' do
|
|
185
258
|
user = User.new
|
|
186
259
|
user.send(:write_attribute, :role, 'wrong')
|
|
187
|
-
user.read_attribute_for_validation(:role).must_equal 'wrong'
|
|
188
|
-
user.wont_be :valid?
|
|
189
|
-
user.errors[:role].must_include 'is not included in the list'
|
|
260
|
+
expect(user.read_attribute_for_validation(:role)).must_equal 'wrong'
|
|
261
|
+
expect(user).wont_be :valid?
|
|
262
|
+
expect(user.errors[:role]).must_include 'is not included in the list'
|
|
190
263
|
end
|
|
191
264
|
|
|
192
265
|
it 'validates inclusion on mass assignment' do
|
|
@@ -197,47 +270,72 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
197
270
|
|
|
198
271
|
it "uses persisted value for validation if it hasn't been set" do
|
|
199
272
|
user = User.create! :sex => :male
|
|
200
|
-
User.find(user.id).read_attribute_for_validation(:sex).must_equal 'male'
|
|
273
|
+
expect(User.find(user.id).read_attribute_for_validation(:sex)).must_equal 'male'
|
|
201
274
|
end
|
|
202
275
|
|
|
203
276
|
it 'is valid with empty string assigned' do
|
|
204
277
|
user = User.new
|
|
205
278
|
user.role = ''
|
|
206
|
-
user.must_be :valid?
|
|
279
|
+
expect(user).must_be :valid?
|
|
207
280
|
end
|
|
208
281
|
|
|
209
282
|
it 'stores nil when empty string assigned' do
|
|
210
283
|
user = User.new
|
|
211
284
|
user.role = ''
|
|
212
|
-
user.read_attribute(:role).must_be_nil
|
|
285
|
+
expect(user.read_attribute(:role)).must_be_nil
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
it 'validates inclusion when :skip_validations = false' do
|
|
289
|
+
user = DoNotSkipValidationsUser.new
|
|
290
|
+
user.foo = 'wrong'
|
|
291
|
+
expect(user).wont_be :valid?
|
|
292
|
+
expect(user.errors[:foo]).must_include 'is not included in the list'
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
it 'does not validate inclusion when :skip_validations = true' do
|
|
296
|
+
user = SkipValidationsUser.new
|
|
297
|
+
user.foo = 'wrong'
|
|
298
|
+
expect(user).must_be :valid?
|
|
299
|
+
end
|
|
300
|
+
|
|
301
|
+
it 'supports :skip_validations option as lambda' do
|
|
302
|
+
user = SkipValidationsLambdaUser.new
|
|
303
|
+
user.foo = 'wrong'
|
|
304
|
+
expect(user).must_be :valid?
|
|
305
|
+
end
|
|
306
|
+
|
|
307
|
+
it 'supports :skip_validations option as lambda with a parameter' do
|
|
308
|
+
user = SkipValidationsLambdaWithParamUser.new
|
|
309
|
+
user.foo = 'wrong'
|
|
310
|
+
expect(user).must_be :valid?
|
|
213
311
|
end
|
|
214
312
|
|
|
215
313
|
it 'supports multiple attributes' do
|
|
216
314
|
user = User.new
|
|
217
|
-
user.interests.must_be_empty
|
|
315
|
+
expect(user.interests).must_be_empty
|
|
218
316
|
user.interests << :music
|
|
219
|
-
user.interests.must_equal %w(music)
|
|
317
|
+
expect(user.interests).must_equal %w(music)
|
|
220
318
|
user.save!
|
|
221
319
|
|
|
222
320
|
user = User.find(user.id)
|
|
223
|
-
user.interests.must_be_instance_of Enumerize::Set
|
|
224
|
-
user.interests.must_equal %w(music)
|
|
321
|
+
expect(user.interests).must_be_instance_of Enumerize::Set
|
|
322
|
+
expect(user.interests).must_equal %w(music)
|
|
225
323
|
user.interests << :sports
|
|
226
|
-
user.interests.must_equal %w(music sports)
|
|
324
|
+
expect(user.interests).must_equal %w(music sports)
|
|
227
325
|
|
|
228
326
|
user.interests = []
|
|
229
327
|
interests = user.interests
|
|
230
328
|
interests << :music
|
|
231
|
-
interests.must_equal %w(music)
|
|
329
|
+
expect(interests).must_equal %w(music)
|
|
232
330
|
interests << :dancing
|
|
233
|
-
interests.must_equal %w(music dancing)
|
|
331
|
+
expect(interests).must_equal %w(music dancing)
|
|
234
332
|
end
|
|
235
333
|
|
|
236
334
|
it 'stores multiple value passed passed to new' do
|
|
237
335
|
user = User.new(interests: [:music, :dancing])
|
|
238
336
|
user.save!
|
|
239
|
-
user.interests.must_equal %w(music dancing)
|
|
240
|
-
User.find(user.id).interests.must_equal %w(music dancing)
|
|
337
|
+
expect(user.interests).must_equal %w(music dancing)
|
|
338
|
+
expect(User.find(user.id).interests).must_equal %w(music dancing)
|
|
241
339
|
end
|
|
242
340
|
|
|
243
341
|
it 'returns invalid multiple value for validation' do
|
|
@@ -245,57 +343,66 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
245
343
|
user.interests << :music
|
|
246
344
|
user.interests << :invalid
|
|
247
345
|
values = user.read_attribute_for_validation(:interests)
|
|
248
|
-
values.must_equal %w(music invalid)
|
|
346
|
+
expect(values).must_equal %w(music invalid)
|
|
249
347
|
end
|
|
250
348
|
|
|
251
349
|
it 'validates multiple attributes' do
|
|
252
350
|
user = User.new
|
|
253
351
|
user.interests << :invalid
|
|
254
|
-
user.wont_be :valid?
|
|
352
|
+
expect(user).wont_be :valid?
|
|
255
353
|
|
|
256
354
|
user.interests = Object.new
|
|
257
|
-
user.wont_be :valid?
|
|
355
|
+
expect(user).wont_be :valid?
|
|
258
356
|
|
|
259
357
|
user.interests = ['music', '']
|
|
260
|
-
user.must_be :valid?
|
|
358
|
+
expect(user).must_be :valid?
|
|
261
359
|
end
|
|
262
360
|
|
|
263
361
|
it 'stores custom values for multiple attributes' do
|
|
264
362
|
User.delete_all
|
|
265
363
|
|
|
266
|
-
klass = Class.new(User)
|
|
364
|
+
klass = Class.new(User) do
|
|
365
|
+
def self.name
|
|
366
|
+
'UserSubclass'
|
|
367
|
+
end
|
|
368
|
+
end
|
|
267
369
|
klass.enumerize :interests, in: { music: 0, sports: 1, dancing: 2, programming: 3}, multiple: true
|
|
268
370
|
|
|
269
371
|
user = klass.new
|
|
270
372
|
user.interests << :music
|
|
271
|
-
user.read_attribute(:interests).must_equal [0]
|
|
272
|
-
user.interests.must_equal %w(music)
|
|
373
|
+
expect(user.read_attribute(:interests)).must_equal [0]
|
|
374
|
+
expect(user.interests).must_equal %w(music)
|
|
273
375
|
user.save
|
|
274
376
|
|
|
275
377
|
user = klass.find(user.id)
|
|
276
|
-
user.interests.must_equal %w(music)
|
|
378
|
+
expect(user.interests).must_equal %w(music)
|
|
277
379
|
end
|
|
278
380
|
|
|
279
381
|
it 'adds scope' do
|
|
280
382
|
User.delete_all
|
|
281
383
|
|
|
282
|
-
user_1 = User.create!(status: :active, role: :admin)
|
|
283
|
-
user_2 = User.create!(status: :blocked)
|
|
384
|
+
user_1 = User.create!(sex: :female, skill: :noob, status: :active, role: :admin)
|
|
385
|
+
user_2 = User.create!(sex: :female, skill: :casual, status: :blocked)
|
|
386
|
+
user_3 = User.create!(sex: :male, skill: :pro)
|
|
284
387
|
|
|
285
|
-
User.with_status(:active).must_equal [user_1]
|
|
286
|
-
User.with_status(:blocked).must_equal [user_2]
|
|
287
|
-
User.with_status(:active, :blocked).to_set.must_equal [user_1, user_2].to_set
|
|
388
|
+
expect(User.with_status(:active)).must_equal [user_1]
|
|
389
|
+
expect(User.with_status(:blocked)).must_equal [user_2]
|
|
390
|
+
expect(User.with_status(:active, :blocked).to_set).must_equal [user_1, user_2].to_set
|
|
288
391
|
|
|
289
|
-
User.without_status(:active).must_equal [user_2]
|
|
290
|
-
User.without_status(:active, :blocked).must_equal []
|
|
392
|
+
expect(User.without_status(:active)).must_equal [user_2]
|
|
393
|
+
expect(User.without_status(:active, :blocked)).must_equal []
|
|
291
394
|
|
|
292
|
-
User.
|
|
395
|
+
expect(User.male).must_equal [user_3]
|
|
396
|
+
expect(User.pro).must_equal [user_3]
|
|
397
|
+
|
|
398
|
+
expect(User.not_male.to_set).must_equal [user_1, user_2].to_set
|
|
399
|
+
expect(User.not_pro.to_set).must_equal [user_1, user_2].to_set
|
|
293
400
|
end
|
|
294
401
|
|
|
295
402
|
it 'ignores not enumerized values that passed to the scope method' do
|
|
296
403
|
User.delete_all
|
|
297
404
|
|
|
298
|
-
User.with_status(:foo).must_equal []
|
|
405
|
+
expect(User.with_status(:foo)).must_equal []
|
|
299
406
|
end
|
|
300
407
|
|
|
301
408
|
it 'allows either key or value as valid' do
|
|
@@ -303,13 +410,13 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
303
410
|
user_2 = User.new(status: 1)
|
|
304
411
|
user_3 = User.new(status: '1')
|
|
305
412
|
|
|
306
|
-
user_1.status.must_equal 'active'
|
|
307
|
-
user_2.status.must_equal 'active'
|
|
308
|
-
user_3.status.must_equal 'active'
|
|
413
|
+
expect(user_1.status).must_equal 'active'
|
|
414
|
+
expect(user_2.status).must_equal 'active'
|
|
415
|
+
expect(user_3.status).must_equal 'active'
|
|
309
416
|
|
|
310
|
-
user_1.must_be :valid?
|
|
311
|
-
user_2.must_be :valid?
|
|
312
|
-
user_3.must_be :valid?
|
|
417
|
+
expect(user_1).must_be :valid?
|
|
418
|
+
expect(user_2).must_be :valid?
|
|
419
|
+
expect(user_3).must_be :valid?
|
|
313
420
|
end
|
|
314
421
|
|
|
315
422
|
it 'supports defining enumerized attributes on abstract class' do
|
|
@@ -317,7 +424,7 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
317
424
|
|
|
318
425
|
document = Document.new
|
|
319
426
|
document.visibility = :protected
|
|
320
|
-
document.visibility.must_equal 'protected'
|
|
427
|
+
expect(document.visibility).must_equal 'protected'
|
|
321
428
|
end
|
|
322
429
|
|
|
323
430
|
it 'supports defining enumerized scopes on abstract class' do
|
|
@@ -326,7 +433,7 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
326
433
|
document_1 = Document.create!(visibility: :public)
|
|
327
434
|
document_2 = Document.create!(visibility: :private)
|
|
328
435
|
|
|
329
|
-
Document.with_visibility(:public).must_equal [document_1]
|
|
436
|
+
expect(Document.with_visibility(:public)).must_equal [document_1]
|
|
330
437
|
end
|
|
331
438
|
|
|
332
439
|
it 'validates uniqueness' do
|
|
@@ -338,7 +445,7 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
338
445
|
user.status = :active
|
|
339
446
|
user.valid?
|
|
340
447
|
|
|
341
|
-
user.errors[:status].wont_be :empty?
|
|
448
|
+
expect(user.errors[:status]).wont_be :empty?
|
|
342
449
|
end
|
|
343
450
|
|
|
344
451
|
it 'validates presence with multiple attributes' do
|
|
@@ -346,17 +453,17 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
346
453
|
user.interests = []
|
|
347
454
|
user.valid?
|
|
348
455
|
|
|
349
|
-
user.errors[:interests].wont_be :empty?
|
|
456
|
+
expect(user.errors[:interests]).wont_be :empty?
|
|
350
457
|
|
|
351
458
|
user.interests = ['']
|
|
352
459
|
user.valid?
|
|
353
460
|
|
|
354
|
-
user.errors[:interests].wont_be :empty?
|
|
461
|
+
expect(user.errors[:interests]).wont_be :empty?
|
|
355
462
|
|
|
356
463
|
user.interests = [:dancing, :programming]
|
|
357
464
|
user.valid?
|
|
358
465
|
|
|
359
|
-
user.errors[:interests].must_be_empty
|
|
466
|
+
expect(user.errors[:interests]).must_be_empty
|
|
360
467
|
end
|
|
361
468
|
|
|
362
469
|
it 'is valid after #becomes' do
|
|
@@ -368,7 +475,7 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
368
475
|
uniq_user = User.find(user.id).becomes(UniqStatusUser)
|
|
369
476
|
uniq_user.valid?
|
|
370
477
|
|
|
371
|
-
uniq_user.errors.must_be_empty
|
|
478
|
+
expect(uniq_user.errors).must_be_empty
|
|
372
479
|
end
|
|
373
480
|
|
|
374
481
|
it 'supports multiple attributes in #becomes' do
|
|
@@ -381,8 +488,8 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
381
488
|
|
|
382
489
|
user = uniq_user.becomes(User)
|
|
383
490
|
|
|
384
|
-
user.sex.must_equal uniq_user.sex
|
|
385
|
-
user.interests.must_equal uniq_user.interests
|
|
491
|
+
expect(user.sex).must_equal uniq_user.sex
|
|
492
|
+
expect(user.interests).must_equal uniq_user.interests
|
|
386
493
|
end
|
|
387
494
|
|
|
388
495
|
it "doesn't update record" do
|
|
@@ -412,7 +519,7 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
412
519
|
user.reload
|
|
413
520
|
user.status = 'active'
|
|
414
521
|
|
|
415
|
-
user.changes.must_be_empty
|
|
522
|
+
expect(user.changes).must_be_empty
|
|
416
523
|
end
|
|
417
524
|
|
|
418
525
|
it 'allows using update_all' do
|
|
@@ -422,26 +529,30 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
422
529
|
|
|
423
530
|
User.update_all(status: :blocked)
|
|
424
531
|
user.reload
|
|
425
|
-
user.status.must_equal 'blocked'
|
|
532
|
+
expect(user.status).must_equal 'blocked'
|
|
426
533
|
|
|
427
534
|
User.update_all(status: :active, account_type: :basic)
|
|
428
535
|
user.reload
|
|
429
|
-
user.status.must_equal 'active'
|
|
430
|
-
user.account_type.must_equal 'basic'
|
|
536
|
+
expect(user.status).must_equal 'active'
|
|
537
|
+
expect(user.account_type).must_equal 'basic'
|
|
431
538
|
end
|
|
432
539
|
|
|
433
540
|
it 'allows using update_all for multiple enumerize' do
|
|
434
541
|
User.delete_all
|
|
435
542
|
|
|
436
|
-
klass = Class.new(User)
|
|
543
|
+
klass = Class.new(User) do
|
|
544
|
+
def self.name
|
|
545
|
+
'UserSubclass'
|
|
546
|
+
end
|
|
547
|
+
end
|
|
437
548
|
klass.enumerize :interests, in: { music: 0, sports: 1, dancing: 2, programming: 3}, multiple: true
|
|
438
549
|
|
|
439
550
|
user = klass.create(status: :active)
|
|
440
551
|
klass.update_all(status: :blocked, interests: [:music, :dancing])
|
|
441
552
|
|
|
442
553
|
user = klass.find(user.id)
|
|
443
|
-
user.status.must_equal 'blocked'
|
|
444
|
-
user.interests.must_equal %w(music dancing)
|
|
554
|
+
expect(user.status).must_equal 'blocked'
|
|
555
|
+
expect(user.interests).must_equal %w(music dancing)
|
|
445
556
|
end
|
|
446
557
|
|
|
447
558
|
it 'allows using update_all with values' do
|
|
@@ -451,7 +562,7 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
451
562
|
|
|
452
563
|
User.update_all(status: 2)
|
|
453
564
|
user.reload
|
|
454
|
-
user.status.must_equal 'blocked'
|
|
565
|
+
expect(user.status).must_equal 'blocked'
|
|
455
566
|
end
|
|
456
567
|
|
|
457
568
|
it 'allows using update_all on relation objects' do
|
|
@@ -461,7 +572,7 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
461
572
|
|
|
462
573
|
User.all.update_all(status: :blocked)
|
|
463
574
|
user.reload
|
|
464
|
-
user.status.must_equal 'blocked'
|
|
575
|
+
expect(user.status).must_equal 'blocked'
|
|
465
576
|
end
|
|
466
577
|
|
|
467
578
|
it 'allows using update_all on association relation objects' do
|
|
@@ -473,7 +584,7 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
473
584
|
|
|
474
585
|
user.documents.update_all(status: :release)
|
|
475
586
|
document.reload
|
|
476
|
-
document.status.must_equal 'release'
|
|
587
|
+
expect(document.status).must_equal 'release'
|
|
477
588
|
end
|
|
478
589
|
|
|
479
590
|
it 'preserves string usage of update_all' do
|
|
@@ -483,7 +594,7 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
483
594
|
|
|
484
595
|
User.update_all("name = 'Frederick'")
|
|
485
596
|
user.reload
|
|
486
|
-
user.name.must_equal 'Frederick'
|
|
597
|
+
expect(user.name).must_equal 'Frederick'
|
|
487
598
|
end
|
|
488
599
|
|
|
489
600
|
it 'preserves interpolated array usage of update_all' do
|
|
@@ -493,7 +604,7 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
493
604
|
|
|
494
605
|
User.update_all(["name = :name", {name: 'Frederick'}])
|
|
495
606
|
user.reload
|
|
496
|
-
user.name.must_equal 'Frederick'
|
|
607
|
+
expect(user.name).must_equal 'Frederick'
|
|
497
608
|
end
|
|
498
609
|
|
|
499
610
|
it 'sets attribute to nil if given one is not valid' do
|
|
@@ -503,24 +614,24 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
503
614
|
|
|
504
615
|
User.update_all(status: :foo)
|
|
505
616
|
user.reload
|
|
506
|
-
user.status.must_be_nil
|
|
617
|
+
expect(user.status).must_be_nil
|
|
507
618
|
end
|
|
508
619
|
|
|
509
620
|
it 'supports AR types serialization' do
|
|
510
621
|
type = User.type_for_attribute('status')
|
|
511
|
-
type.must_be_instance_of Enumerize::ActiveRecordSupport::Type
|
|
622
|
+
expect(type).must_be_instance_of Enumerize::ActiveRecordSupport::Type
|
|
512
623
|
serialized = type.serialize('blocked')
|
|
513
|
-
serialized.must_equal 2
|
|
624
|
+
expect(serialized).must_equal 2
|
|
514
625
|
end
|
|
515
626
|
|
|
516
627
|
it 'has AR type itself JSON serializable' do
|
|
517
628
|
type = User.type_for_attribute('status')
|
|
518
|
-
type.as_json['attr'].must_equal 'status'
|
|
629
|
+
expect(type.as_json['attr']).must_equal 'status'
|
|
519
630
|
end
|
|
520
631
|
|
|
521
632
|
it "doesn't break YAML serialization" do
|
|
522
633
|
user = YAML.load(User.create(status: :blocked).to_yaml)
|
|
523
|
-
user.status.must_equal 'blocked'
|
|
634
|
+
expect(user.status).must_equal 'blocked'
|
|
524
635
|
end
|
|
525
636
|
|
|
526
637
|
# https://github.com/brainspec/enumerize/issues/304
|
|
@@ -528,6 +639,32 @@ describe Enumerize::ActiveRecordSupport do
|
|
|
528
639
|
table = User.arel_table
|
|
529
640
|
sql = User.where(table[:account_type].matches '%foo%').to_sql
|
|
530
641
|
|
|
531
|
-
sql.must_include 'LIKE \'%foo%\''
|
|
642
|
+
expect(sql).must_include 'LIKE \'%foo%\''
|
|
643
|
+
end
|
|
644
|
+
|
|
645
|
+
if Rails::VERSION::MAJOR >= 6
|
|
646
|
+
it 'supports AR#insert_all' do
|
|
647
|
+
User.delete_all
|
|
648
|
+
|
|
649
|
+
User.insert_all([{ sex: :male }])
|
|
650
|
+
User.insert_all([{ status: :active }])
|
|
651
|
+
User.insert_all([{ interests: [:music, :sports] }])
|
|
652
|
+
|
|
653
|
+
expect(User.exists?(sex: :male)).must_equal true
|
|
654
|
+
expect(User.exists?(status: :active)).must_equal true
|
|
655
|
+
expect(User.exists?(interests: [:music, :sports])).must_equal true
|
|
656
|
+
end
|
|
657
|
+
|
|
658
|
+
it 'supports AR#upsert_all' do
|
|
659
|
+
User.delete_all
|
|
660
|
+
|
|
661
|
+
User.upsert_all([{ sex: :male }])
|
|
662
|
+
User.upsert_all([{ status: :active }])
|
|
663
|
+
User.upsert_all([{ interests: [:music, :sports] }])
|
|
664
|
+
|
|
665
|
+
expect(User.exists?(sex: :male)).must_equal true
|
|
666
|
+
expect(User.exists?(status: :active)).must_equal true
|
|
667
|
+
expect(User.exists?(interests: [:music, :sports])).must_equal true
|
|
668
|
+
end
|
|
532
669
|
end
|
|
533
670
|
end
|