Skip to content

Commit 8cb663e

Browse files
authored
Merge pull request rails#44471 from postmodern/better_activerecord_enum_assertions
Better ActiveRecord enum assertions (issue rails#44457)
2 parents 74fedee + bd9d940 commit 8cb663e

File tree

2 files changed

+61
-11
lines changed

2 files changed

+61
-11
lines changed

activerecord/lib/active_record/enum.rb

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -267,15 +267,29 @@ def _enum_methods_module
267267
end
268268

269269
def assert_valid_enum_definition_values(values)
270-
unless values.is_a?(Hash) || values.all?(Symbol) || values.all?(String)
271-
error_message = <<~MSG
272-
Enum values #{values} must be either a hash, an array of symbols, or an array of strings.
273-
MSG
274-
raise ArgumentError, error_message
275-
end
270+
case values
271+
when Hash
272+
if values.empty?
273+
raise ArgumentError, "Enum values #{values} must not be empty."
274+
end
275+
276+
if values.keys.any?(&:blank?)
277+
raise ArgumentError, "Enum values #{values} must not contain a blank name."
278+
end
279+
when Array
280+
if values.empty?
281+
raise ArgumentError, "Enum values #{values} must not be empty."
282+
end
276283

277-
if values.is_a?(Hash) && values.keys.any?(&:blank?) || values.is_a?(Array) && values.any?(&:blank?)
278-
raise ArgumentError, "Enum label name must not be blank."
284+
unless values.all?(Symbol) || values.all?(String)
285+
raise ArgumentError, "Enum values #{values} must only contain symbols or strings."
286+
end
287+
288+
if values.any?(&:blank?)
289+
raise ArgumentError, "Enum values #{values} must not contain a blank name."
290+
end
291+
else
292+
raise ArgumentError, "Enum values #{values} must be either a non-empty hash or an array."
279293
end
280294
end
281295

activerecord/test/cases/enum_test.rb

Lines changed: 39 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -401,14 +401,41 @@ class EnumTest < ActiveRecord::TestCase
401401
end
402402

403403
test "invalid definition values raise an ArgumentError" do
404+
e = assert_raises(ArgumentError) do
405+
Class.new(ActiveRecord::Base) do
406+
self.table_name = "books"
407+
enum :status
408+
end
409+
end
410+
411+
assert_match(/must not be empty\.$/, e.message)
412+
413+
e = assert_raises(ArgumentError) do
414+
Class.new(ActiveRecord::Base) do
415+
self.table_name = "books"
416+
enum :status, {}
417+
end
418+
end
419+
420+
assert_match(/must not be empty\.$/, e.message)
421+
422+
e = assert_raises(ArgumentError) do
423+
Class.new(ActiveRecord::Base) do
424+
self.table_name = "books"
425+
enum :status, []
426+
end
427+
end
428+
429+
assert_match(/must not be empty\.$/, e.message)
430+
404431
e = assert_raises(ArgumentError) do
405432
Class.new(ActiveRecord::Base) do
406433
self.table_name = "books"
407434
enum status: [proposed: 1, written: 2, published: 3]
408435
end
409436
end
410437

411-
assert_match(/must be either a hash, an array of symbols, or an array of strings./, e.message)
438+
assert_match(/must only contain symbols or strings\.$/, e.message)
412439

413440
e = assert_raises(ArgumentError) do
414441
Class.new(ActiveRecord::Base) do
@@ -417,7 +444,7 @@ class EnumTest < ActiveRecord::TestCase
417444
end
418445
end
419446

420-
assert_match(/Enum label name must not be blank/, e.message)
447+
assert_match(/must not contain a blank name\.$/, e.message)
421448

422449
e = assert_raises(ArgumentError) do
423450
Class.new(ActiveRecord::Base) do
@@ -426,7 +453,16 @@ class EnumTest < ActiveRecord::TestCase
426453
end
427454
end
428455

429-
assert_match(/Enum label name must not be blank/, e.message)
456+
assert_match(/must not contain a blank name\.$/, e.message)
457+
458+
e = assert_raises(ArgumentError) do
459+
Class.new(ActiveRecord::Base) do
460+
self.table_name = "books"
461+
enum status: Object.new
462+
end
463+
end
464+
465+
assert_match(/must be either a non-empty hash or an array\.$/, e.message)
430466
end
431467

432468
test "reserved enum names" do

0 commit comments

Comments
 (0)