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.
- checksums.yaml +5 -5
- data/.github/workflows/ruby.yml +73 -0
- data/CHANGELOG.md +80 -3
- data/Gemfile +3 -3
- data/Gemfile.global +2 -9
- data/Gemfile.mongo_mapper +2 -2
- data/Gemfile.rails60 +6 -0
- data/Gemfile.rails61 +6 -0
- data/Gemfile.rails70 +9 -0
- data/Gemfile.railsmaster +5 -0
- data/README.md +209 -92
- data/Rakefile +2 -0
- data/lib/enumerize/activemodel.rb +47 -0
- data/lib/enumerize/activerecord.rb +79 -0
- 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 +5 -1
- data/lib/enumerize/integrations/rails_admin.rb +3 -1
- 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 +3 -1
- data/lib/enumerize.rb +9 -0
- data/lib/sequel/plugins/enumerize.rb +18 -0
- data/spec/enumerize/integrations/rspec/matcher_spec.rb +13 -10
- data/spec/spec_helper.rb +2 -0
- data/test/activemodel_test.rb +114 -0
- data/test/activerecord_test.rb +277 -79
- data/test/attribute_map_test.rb +9 -7
- data/test/attribute_test.rb +37 -30
- data/test/base_test.rb +66 -64
- data/test/formtastic_test.rb +25 -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 +26 -18
- data/test/predicates_test.rb +30 -28
- data/test/rails_admin_test.rb +8 -6
- data/test/sequel_test.rb +111 -58
- data/test/set_test.rb +28 -26
- data/test/simple_form_test.rb +25 -0
- data/test/support/mock_controller.rb +6 -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 +14 -27
- data/.travis.yml +0 -18
- data/Gemfile.rails42 +0 -6
data/test/activerecord_test.rb
CHANGED
@@ -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.
|
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
|
-
|
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.
|
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
|
-
|
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).
|
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.
|
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.
|
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
|