From de4e4c57251b95ff9884665db993c0bc27e27c87 Mon Sep 17 00:00:00 2001 From: Ted Johansson Date: Tue, 17 Jan 2017 00:58:48 +0800 Subject: [PATCH] [Fix #3918] Prevent `Rails/EnumUniqueness` from breaking on a non-literal hash value This cop would break on any enum hash that did not have a literal value. This change fixes that. --- CHANGELOG.md | 1 + lib/rubocop/cop/rails/enum_uniqueness.rb | 2 +- .../rubocop/cop/rails/enum_uniqueness_spec.rb | 28 ++++++++++++++++++- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dc58c1822392..65c612dccaf1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ * [#3911](https://github.com/bbatsov/rubocop/issues/3911): Prevent a crash in `Performance/RegexpMatch` cop with module definition. ([@pocke][]) * [#3908](https://github.com/bbatsov/rubocop/issues/3908): Prevent `Style/AlignHash` from breaking on a keyword splat when using enforced `table` style. ([@drenmi][]) +* [#3918](https://github.com/bbatsov/rubocop/issues/3918): Prevent `Rails/EnumUniqueness` from breaking on a non-literal hash value. ([@drenmi][]) ## 0.47.0 (2017-01-16) diff --git a/lib/rubocop/cop/rails/enum_uniqueness.rb b/lib/rubocop/cop/rails/enum_uniqueness.rb index c1f906d78cfa..768606e225fa 100644 --- a/lib/rubocop/cop/rails/enum_uniqueness.rb +++ b/lib/rubocop/cop/rails/enum_uniqueness.rb @@ -23,7 +23,7 @@ class EnumUniqueness < Cop MSG = 'Duplicate value `%s` found in `%s` enum declaration.'.freeze def_node_matcher :enum_declaration, <<-END - (send nil :enum (hash (pair (_ $_) $_))) + (send nil :enum (hash (pair (_ $_) ${array hash}))) END def on_send(node) diff --git a/spec/rubocop/cop/rails/enum_uniqueness_spec.rb b/spec/rubocop/cop/rails/enum_uniqueness_spec.rb index f3c0258f8da2..1af9f3ac8ef7 100644 --- a/spec/rubocop/cop/rails/enum_uniqueness_spec.rb +++ b/spec/rubocop/cop/rails/enum_uniqueness_spec.rb @@ -64,11 +64,37 @@ end context 'when receiving a variable' do - it 'does not register an offence' do + it 'does not register an offense' do inspect_source(cop, ['var = { status: { active: 0, archived: 1 } }', 'enum var']) expect(cop.offenses).to be_empty end end + + context 'when receiving a hash without literal values' do + context 'when value is a variable' do + it 'does not register an offense' do + inspect_source(cop, 'enum status: statuses') + + expect(cop.offenses).to be_empty + end + end + + context 'when value is a method chain' do + it 'does not register an offense' do + inspect_source(cop, 'enum status: User.statuses.keys') + + expect(cop.offenses).to be_empty + end + end + + context 'when value is a constant' do + it 'does not register an offense' do + inspect_source(cop, 'enum status: STATUSES') + + expect(cop.offenses).to be_empty + end + end + end end