enumerize 2.0.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.
Files changed (64) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/ruby.yml +73 -0
  3. data/CHANGELOG.md +80 -3
  4. data/Gemfile +3 -3
  5. data/Gemfile.global +2 -9
  6. data/Gemfile.mongo_mapper +2 -2
  7. data/Gemfile.rails60 +6 -0
  8. data/Gemfile.rails61 +6 -0
  9. data/Gemfile.rails70 +9 -0
  10. data/Gemfile.railsmaster +5 -0
  11. data/README.md +209 -92
  12. data/Rakefile +2 -0
  13. data/lib/enumerize/activemodel.rb +47 -0
  14. data/lib/enumerize/activerecord.rb +79 -0
  15. data/lib/enumerize/attribute.rb +19 -11
  16. data/lib/enumerize/attribute_map.rb +2 -0
  17. data/lib/enumerize/base.rb +6 -6
  18. data/lib/enumerize/hooks/formtastic.rb +4 -1
  19. data/lib/enumerize/hooks/sequel_dataset.rb +2 -0
  20. data/lib/enumerize/hooks/simple_form.rb +4 -1
  21. data/lib/enumerize/hooks/uniqueness.rb +5 -1
  22. data/lib/enumerize/integrations/rails_admin.rb +3 -1
  23. data/lib/enumerize/integrations/rspec/matcher.rb +7 -2
  24. data/lib/enumerize/integrations/rspec.rb +2 -0
  25. data/lib/enumerize/module.rb +2 -0
  26. data/lib/enumerize/module_attributes.rb +2 -0
  27. data/lib/enumerize/mongoid.rb +16 -0
  28. data/lib/enumerize/predicatable.rb +3 -1
  29. data/lib/enumerize/predicates.rb +2 -0
  30. data/lib/enumerize/scope/activerecord.rb +16 -0
  31. data/lib/enumerize/scope/mongoid.rb +15 -0
  32. data/lib/enumerize/scope/sequel.rb +16 -0
  33. data/lib/enumerize/sequel.rb +9 -4
  34. data/lib/enumerize/set.rb +2 -0
  35. data/lib/enumerize/utils.rb +12 -0
  36. data/lib/enumerize/value.rb +14 -15
  37. data/lib/enumerize/version.rb +3 -1
  38. data/lib/enumerize.rb +9 -0
  39. data/lib/sequel/plugins/enumerize.rb +18 -0
  40. data/spec/enumerize/integrations/rspec/matcher_spec.rb +13 -10
  41. data/spec/spec_helper.rb +2 -0
  42. data/test/activemodel_test.rb +114 -0
  43. data/test/activerecord_test.rb +277 -79
  44. data/test/attribute_map_test.rb +9 -7
  45. data/test/attribute_test.rb +37 -30
  46. data/test/base_test.rb +66 -64
  47. data/test/formtastic_test.rb +25 -0
  48. data/test/module_attributes_test.rb +10 -8
  49. data/test/mongo_mapper_test.rb +19 -10
  50. data/test/mongoid_test.rb +51 -22
  51. data/test/multiple_test.rb +26 -18
  52. data/test/predicates_test.rb +30 -28
  53. data/test/rails_admin_test.rb +8 -6
  54. data/test/sequel_test.rb +111 -58
  55. data/test/set_test.rb +28 -26
  56. data/test/simple_form_test.rb +25 -0
  57. data/test/support/mock_controller.rb +6 -0
  58. data/test/support/shared_enums.rb +43 -0
  59. data/test/support/view_test_helper.rb +14 -1
  60. data/test/test_helper.rb +2 -0
  61. data/test/value_test.rb +51 -30
  62. metadata +14 -27
  63. data/.travis.yml +0 -18
  64. data/Gemfile.rails42 +0 -6
@@ -1,11 +1,59 @@
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.establish_connection(:adapter => "sqlite3", :database => ":memory:")
12
+ ActiveRecord::Base.configurations = {
13
+ 'sqlite3' => {
14
+ 'adapter' => 'sqlite3',
15
+ 'database' => ':memory:'
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
+ },
26
+ 'postgresql' => {
27
+ 'adapter' => 'postgresql',
28
+ 'host' => 'localhost',
29
+ 'username' => ENV['POSTGRES_USER'],
30
+ 'password' => ENV['POSTGRES_PASSWORD']
31
+ },
32
+ 'postgresql_master' => {
33
+ 'adapter' => 'postgresql',
34
+ 'host' => 'localhost',
35
+ 'username' => ENV['POSTGRES_USER'],
36
+ 'password' => ENV['POSTGRES_PASSWORD'],
37
+ 'database' => 'template1',
38
+ 'schema_search_path' => 'public'
39
+ }
40
+ }
41
+
42
+ case db
43
+ when :postgresql
44
+ ActiveRecord::Base.establish_connection(:postgresql_master)
45
+ ActiveRecord::Base.connection.recreate_database('enumerize_test')
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
52
+
53
+ ActiveRecord::Base.establish_connection(db)
54
+ else
55
+ ActiveRecord::Base.establish_connection(db)
56
+ end
9
57
  end
10
58
 
11
59
  ActiveRecord::Base.connection.instance_eval do
@@ -16,7 +64,10 @@ ActiveRecord::Base.connection.instance_eval do
16
64
  t.string :name
17
65
  t.string :interests
18
66
  t.integer :status
67
+ t.text :settings
68
+ t.integer :skill
19
69
  t.string :account_type, :default => :basic
70
+ t.string :foo
20
71
  end
21
72
 
22
73
  create_table :documents do |t|
@@ -50,13 +101,18 @@ class User < ActiveRecord::Base
50
101
  extend Enumerize
51
102
  include RoleEnum
52
103
 
53
- enumerize :sex, :in => [:male, :female]
104
+ store :settings, accessors: [:language]
105
+
106
+ enumerize :sex, :in => [:male, :female], scope: :shallow
107
+ enumerize :language, :in => [:en, :jp]
54
108
 
55
109
  serialize :interests, Array
56
110
  enumerize :interests, :in => [:music, :sports, :dancing, :programming], :multiple => true
57
111
 
58
112
  enumerize :status, :in => { active: 1, blocked: 2 }, scope: true
59
113
 
114
+ enumerize :skill, :in => { noob: 0, casual: 1, pro: 2 }, scope: :shallow
115
+
60
116
  enumerize :account_type, :in => [:basic, :premium]
61
117
 
62
118
  # There is no column for relationship enumeration for testing purposes: model
@@ -75,11 +131,31 @@ class InterestsRequiredUser < User
75
131
  validates :interests, presence: true
76
132
  end
77
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
+
78
154
  describe Enumerize::ActiveRecordSupport do
79
155
  it 'sets nil if invalid value is passed' do
80
156
  user = User.new
81
157
  user.sex = :invalid
82
- user.sex.must_equal nil
158
+ expect(user.sex).must_be_nil
83
159
  end
84
160
 
85
161
  it 'saves value' do
@@ -87,7 +163,7 @@ describe Enumerize::ActiveRecordSupport do
87
163
  user = User.new
88
164
  user.sex = :female
89
165
  user.save!
90
- user.sex.must_equal 'female'
166
+ expect(user.sex).must_equal 'female'
91
167
  end
92
168
 
93
169
  it 'loads value' do
@@ -95,26 +171,43 @@ describe Enumerize::ActiveRecordSupport do
95
171
  User.create!(:sex => :male)
96
172
  store_translations(:en, :enumerize => {:sex => {:male => 'Male'}}) do
97
173
  user = User.first
98
- user.sex.must_equal 'male'
99
- user.sex_text.must_equal 'Male'
174
+ expect(user.sex).must_equal 'male'
175
+ expect(user.sex_text).must_equal 'Male'
100
176
  end
101
177
  end
102
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
+
103
194
  it 'has default value' do
104
- User.new.role.must_equal 'user'
105
- User.new.attributes['role'].must_equal 'user'
195
+ expect(User.new.role).must_equal 'user'
196
+ expect(User.new.attributes['role']).must_equal 'user'
106
197
  end
107
198
 
108
199
  it 'does not set default value for not selected attributes' do
109
200
  User.delete_all
110
201
  User.create!(:sex => :male)
111
202
 
112
- assert_equal ['id'], User.select(:id).first.attributes.keys
203
+ user = User.select(:id).first
204
+ expect(user.attributes['role']).must_be_nil
205
+ expect(user.attributes['lambda_role']).must_be_nil
113
206
  end
114
207
 
115
208
  it 'has default value with lambda' do
116
- User.new.lambda_role.must_equal 'admin'
117
- 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'
118
211
  end
119
212
 
120
213
  it 'uses after_initialize callback to set default value' do
@@ -122,11 +215,11 @@ describe Enumerize::ActiveRecordSupport do
122
215
  User.create!(sex: 'male', lambda_role: nil)
123
216
 
124
217
  user = User.where(:sex => 'male').first
125
- user.lambda_role.must_equal 'admin'
218
+ expect(user.lambda_role).must_equal 'admin'
126
219
  end
127
220
 
128
221
  it 'uses default value from db column' do
129
- User.new.account_type.must_equal 'basic'
222
+ expect(User.new.account_type).must_equal 'basic'
130
223
  end
131
224
 
132
225
  it 'has default value with default scope' do
@@ -134,31 +227,39 @@ describe Enumerize::ActiveRecordSupport do
134
227
  default_scope -> { having_role(:user) }
135
228
  end
136
229
 
137
- UserWithDefaultScope.new.role.must_equal 'user'
138
- UserWithDefaultScope.new.attributes['role'].must_equal 'user'
230
+ expect(UserWithDefaultScope.new.role).must_equal 'user'
231
+ expect(UserWithDefaultScope.new.attributes['role']).must_equal 'user'
139
232
  end
140
233
 
141
234
  it 'validates inclusion' do
142
235
  user = User.new
143
236
  user.role = 'wrong'
144
- user.wont_be :valid?
145
- 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]
146
247
  end
147
248
 
148
249
  it 'validates inclusion when using write_attribute with string attribute' do
149
250
  user = User.new
150
251
  user.send(:write_attribute, 'role', 'wrong')
151
- user.read_attribute_for_validation(:role).must_equal 'wrong'
152
- user.wont_be :valid?
153
- 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'
154
255
  end
155
256
 
156
257
  it 'validates inclusion when using write_attribute with symbol attribute' do
157
258
  user = User.new
158
259
  user.send(:write_attribute, :role, 'wrong')
159
- user.read_attribute_for_validation(:role).must_equal 'wrong'
160
- user.wont_be :valid?
161
- 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'
162
263
  end
163
264
 
164
265
  it 'validates inclusion on mass assignment' do
@@ -169,47 +270,72 @@ describe Enumerize::ActiveRecordSupport do
169
270
 
170
271
  it "uses persisted value for validation if it hasn't been set" do
171
272
  user = User.create! :sex => :male
172
- 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'
173
274
  end
174
275
 
175
276
  it 'is valid with empty string assigned' do
176
277
  user = User.new
177
278
  user.role = ''
178
- user.must_be :valid?
279
+ expect(user).must_be :valid?
179
280
  end
180
281
 
181
282
  it 'stores nil when empty string assigned' do
182
283
  user = User.new
183
284
  user.role = ''
184
- user.read_attribute(:role).must_equal 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?
185
311
  end
186
312
 
187
313
  it 'supports multiple attributes' do
188
314
  user = User.new
189
- user.interests.must_be_empty
315
+ expect(user.interests).must_be_empty
190
316
  user.interests << :music
191
- user.interests.must_equal %w(music)
317
+ expect(user.interests).must_equal %w(music)
192
318
  user.save!
193
319
 
194
320
  user = User.find(user.id)
195
- user.interests.must_be_instance_of Enumerize::Set
196
- user.interests.must_equal %w(music)
321
+ expect(user.interests).must_be_instance_of Enumerize::Set
322
+ expect(user.interests).must_equal %w(music)
197
323
  user.interests << :sports
198
- user.interests.must_equal %w(music sports)
324
+ expect(user.interests).must_equal %w(music sports)
199
325
 
200
326
  user.interests = []
201
327
  interests = user.interests
202
328
  interests << :music
203
- interests.must_equal %w(music)
329
+ expect(interests).must_equal %w(music)
204
330
  interests << :dancing
205
- interests.must_equal %w(music dancing)
331
+ expect(interests).must_equal %w(music dancing)
206
332
  end
207
333
 
208
334
  it 'stores multiple value passed passed to new' do
209
335
  user = User.new(interests: [:music, :dancing])
210
336
  user.save!
211
- user.interests.must_equal %w(music dancing)
212
- 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)
213
339
  end
214
340
 
215
341
  it 'returns invalid multiple value for validation' do
@@ -217,57 +343,66 @@ describe Enumerize::ActiveRecordSupport do
217
343
  user.interests << :music
218
344
  user.interests << :invalid
219
345
  values = user.read_attribute_for_validation(:interests)
220
- values.must_equal %w(music invalid)
346
+ expect(values).must_equal %w(music invalid)
221
347
  end
222
348
 
223
349
  it 'validates multiple attributes' do
224
350
  user = User.new
225
351
  user.interests << :invalid
226
- user.wont_be :valid?
352
+ expect(user).wont_be :valid?
227
353
 
228
354
  user.interests = Object.new
229
- user.wont_be :valid?
355
+ expect(user).wont_be :valid?
230
356
 
231
357
  user.interests = ['music', '']
232
- user.must_be :valid?
358
+ expect(user).must_be :valid?
233
359
  end
234
360
 
235
361
  it 'stores custom values for multiple attributes' do
236
362
  User.delete_all
237
363
 
238
- klass = Class.new(User)
364
+ klass = Class.new(User) do
365
+ def self.name
366
+ 'UserSubclass'
367
+ end
368
+ end
239
369
  klass.enumerize :interests, in: { music: 0, sports: 1, dancing: 2, programming: 3}, multiple: true
240
370
 
241
371
  user = klass.new
242
372
  user.interests << :music
243
- user.read_attribute(:interests).must_equal [0]
244
- user.interests.must_equal %w(music)
373
+ expect(user.read_attribute(:interests)).must_equal [0]
374
+ expect(user.interests).must_equal %w(music)
245
375
  user.save
246
376
 
247
377
  user = klass.find(user.id)
248
- user.interests.must_equal %w(music)
378
+ expect(user.interests).must_equal %w(music)
249
379
  end
250
380
 
251
381
  it 'adds scope' do
252
382
  User.delete_all
253
383
 
254
- user_1 = User.create!(status: :active, role: :admin)
255
- 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)
256
387
 
257
- User.with_status(:active).must_equal [user_1]
258
- User.with_status(:blocked).must_equal [user_2]
259
- 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
260
391
 
261
- User.without_status(:active).must_equal [user_2]
262
- 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 []
263
394
 
264
- User.having_role(:admin).must_equal [user_1]
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
265
400
  end
266
401
 
267
402
  it 'ignores not enumerized values that passed to the scope method' do
268
403
  User.delete_all
269
404
 
270
- User.with_status(:foo).must_equal []
405
+ expect(User.with_status(:foo)).must_equal []
271
406
  end
272
407
 
273
408
  it 'allows either key or value as valid' do
@@ -275,13 +410,13 @@ describe Enumerize::ActiveRecordSupport do
275
410
  user_2 = User.new(status: 1)
276
411
  user_3 = User.new(status: '1')
277
412
 
278
- user_1.status.must_equal 'active'
279
- user_2.status.must_equal 'active'
280
- 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'
281
416
 
282
- user_1.must_be :valid?
283
- user_2.must_be :valid?
284
- 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?
285
420
  end
286
421
 
287
422
  it 'supports defining enumerized attributes on abstract class' do
@@ -289,7 +424,7 @@ describe Enumerize::ActiveRecordSupport do
289
424
 
290
425
  document = Document.new
291
426
  document.visibility = :protected
292
- document.visibility.must_equal 'protected'
427
+ expect(document.visibility).must_equal 'protected'
293
428
  end
294
429
 
295
430
  it 'supports defining enumerized scopes on abstract class' do
@@ -298,7 +433,7 @@ describe Enumerize::ActiveRecordSupport do
298
433
  document_1 = Document.create!(visibility: :public)
299
434
  document_2 = Document.create!(visibility: :private)
300
435
 
301
- Document.with_visibility(:public).must_equal [document_1]
436
+ expect(Document.with_visibility(:public)).must_equal [document_1]
302
437
  end
303
438
 
304
439
  it 'validates uniqueness' do
@@ -310,7 +445,7 @@ describe Enumerize::ActiveRecordSupport do
310
445
  user.status = :active
311
446
  user.valid?
312
447
 
313
- user.errors[:status].wont_be :empty?
448
+ expect(user.errors[:status]).wont_be :empty?
314
449
  end
315
450
 
316
451
  it 'validates presence with multiple attributes' do
@@ -318,17 +453,17 @@ describe Enumerize::ActiveRecordSupport do
318
453
  user.interests = []
319
454
  user.valid?
320
455
 
321
- user.errors[:interests].wont_be :empty?
456
+ expect(user.errors[:interests]).wont_be :empty?
322
457
 
323
458
  user.interests = ['']
324
459
  user.valid?
325
460
 
326
- user.errors[:interests].wont_be :empty?
461
+ expect(user.errors[:interests]).wont_be :empty?
327
462
 
328
463
  user.interests = [:dancing, :programming]
329
464
  user.valid?
330
465
 
331
- user.errors[:interests].must_be_empty
466
+ expect(user.errors[:interests]).must_be_empty
332
467
  end
333
468
 
334
469
  it 'is valid after #becomes' do
@@ -340,7 +475,7 @@ describe Enumerize::ActiveRecordSupport do
340
475
  uniq_user = User.find(user.id).becomes(UniqStatusUser)
341
476
  uniq_user.valid?
342
477
 
343
- uniq_user.errors.must_be_empty
478
+ expect(uniq_user.errors).must_be_empty
344
479
  end
345
480
 
346
481
  it 'supports multiple attributes in #becomes' do
@@ -353,8 +488,8 @@ describe Enumerize::ActiveRecordSupport do
353
488
 
354
489
  user = uniq_user.becomes(User)
355
490
 
356
- user.sex.must_equal uniq_user.sex
357
- 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
358
493
  end
359
494
 
360
495
  it "doesn't update record" do
@@ -379,6 +514,14 @@ describe Enumerize::ActiveRecordSupport do
379
514
  assert_equal [1, 2], YAML.load(user.changes.to_yaml)[:status]
380
515
  end
381
516
 
517
+ it 'does not change by the practical same value' do
518
+ user = User.create!(status: 'active')
519
+ user.reload
520
+ user.status = 'active'
521
+
522
+ expect(user.changes).must_be_empty
523
+ end
524
+
382
525
  it 'allows using update_all' do
383
526
  User.delete_all
384
527
 
@@ -386,26 +529,30 @@ describe Enumerize::ActiveRecordSupport do
386
529
 
387
530
  User.update_all(status: :blocked)
388
531
  user.reload
389
- user.status.must_equal 'blocked'
532
+ expect(user.status).must_equal 'blocked'
390
533
 
391
534
  User.update_all(status: :active, account_type: :basic)
392
535
  user.reload
393
- user.status.must_equal 'active'
394
- user.account_type.must_equal 'basic'
536
+ expect(user.status).must_equal 'active'
537
+ expect(user.account_type).must_equal 'basic'
395
538
  end
396
539
 
397
540
  it 'allows using update_all for multiple enumerize' do
398
541
  User.delete_all
399
542
 
400
- klass = Class.new(User)
543
+ klass = Class.new(User) do
544
+ def self.name
545
+ 'UserSubclass'
546
+ end
547
+ end
401
548
  klass.enumerize :interests, in: { music: 0, sports: 1, dancing: 2, programming: 3}, multiple: true
402
549
 
403
550
  user = klass.create(status: :active)
404
551
  klass.update_all(status: :blocked, interests: [:music, :dancing])
405
552
 
406
553
  user = klass.find(user.id)
407
- user.status.must_equal 'blocked'
408
- user.interests.must_equal %w(music dancing)
554
+ expect(user.status).must_equal 'blocked'
555
+ expect(user.interests).must_equal %w(music dancing)
409
556
  end
410
557
 
411
558
  it 'allows using update_all with values' do
@@ -415,7 +562,7 @@ describe Enumerize::ActiveRecordSupport do
415
562
 
416
563
  User.update_all(status: 2)
417
564
  user.reload
418
- user.status.must_equal 'blocked'
565
+ expect(user.status).must_equal 'blocked'
419
566
  end
420
567
 
421
568
  it 'allows using update_all on relation objects' do
@@ -425,7 +572,7 @@ describe Enumerize::ActiveRecordSupport do
425
572
 
426
573
  User.all.update_all(status: :blocked)
427
574
  user.reload
428
- user.status.must_equal 'blocked'
575
+ expect(user.status).must_equal 'blocked'
429
576
  end
430
577
 
431
578
  it 'allows using update_all on association relation objects' do
@@ -437,7 +584,7 @@ describe Enumerize::ActiveRecordSupport do
437
584
 
438
585
  user.documents.update_all(status: :release)
439
586
  document.reload
440
- document.status.must_equal 'release'
587
+ expect(document.status).must_equal 'release'
441
588
  end
442
589
 
443
590
  it 'preserves string usage of update_all' do
@@ -447,7 +594,7 @@ describe Enumerize::ActiveRecordSupport do
447
594
 
448
595
  User.update_all("name = 'Frederick'")
449
596
  user.reload
450
- user.name.must_equal 'Frederick'
597
+ expect(user.name).must_equal 'Frederick'
451
598
  end
452
599
 
453
600
  it 'preserves interpolated array usage of update_all' do
@@ -457,7 +604,7 @@ describe Enumerize::ActiveRecordSupport do
457
604
 
458
605
  User.update_all(["name = :name", {name: 'Frederick'}])
459
606
  user.reload
460
- user.name.must_equal 'Frederick'
607
+ expect(user.name).must_equal 'Frederick'
461
608
  end
462
609
 
463
610
  it 'sets attribute to nil if given one is not valid' do
@@ -467,6 +614,57 @@ describe Enumerize::ActiveRecordSupport do
467
614
 
468
615
  User.update_all(status: :foo)
469
616
  user.reload
470
- user.status.must_equal nil
617
+ expect(user.status).must_be_nil
618
+ end
619
+
620
+ it 'supports AR types serialization' do
621
+ type = User.type_for_attribute('status')
622
+ expect(type).must_be_instance_of Enumerize::ActiveRecordSupport::Type
623
+ serialized = type.serialize('blocked')
624
+ expect(serialized).must_equal 2
625
+ end
626
+
627
+ it 'has AR type itself JSON serializable' do
628
+ type = User.type_for_attribute('status')
629
+ expect(type.as_json['attr']).must_equal 'status'
630
+ end
631
+
632
+ it "doesn't break YAML serialization" do
633
+ user = YAML.load(User.create(status: :blocked).to_yaml)
634
+ expect(user.status).must_equal 'blocked'
635
+ end
636
+
637
+ # https://github.com/brainspec/enumerize/issues/304
638
+ it "fallbacks to a raw passed value if AR type can't find value in the attribute" do
639
+ table = User.arel_table
640
+ sql = User.where(table[:account_type].matches '%foo%').to_sql
641
+
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
471
669
  end
472
670
  end