diff --git a/lib/rubocop/cop/rspec/describe_class.rb b/lib/rubocop/cop/rspec/describe_class.rb index 32e834113..f1f3d49a3 100644 --- a/lib/rubocop/cop/rspec/describe_class.rb +++ b/lib/rubocop/cop/rspec/describe_class.rb @@ -27,52 +27,33 @@ class DescribeClass < Base MSG = 'The first argument to describe should be '\ 'the class or module being tested.' - def_node_matcher :valid_describe?, <<-PATTERN - { - (send #{RSPEC} :describe const ...) - (send #{RSPEC} :describe) - } - PATTERN - - def_node_matcher :describe_with_rails_metadata?, <<-PATTERN - (send #{RSPEC} :describe !const ... - (hash <#rails_metadata? ...>) - ) - PATTERN - def_node_matcher :rails_metadata?, <<-PATTERN (pair (sym :type) - (sym { - :channel :controller :helper :job :mailer :model :request - :routing :view :feature :system :mailbox - } - ) + (sym { :channel :controller :helper :job :mailer :model :request + :routing :view :feature :system :mailbox }) ) PATTERN - def_node_matcher :described, <<~PATTERN - (block $(send #{RSPEC} :describe $_ ...) ...) + def_node_matcher :not_a_const_described, <<~PATTERN + (block + [ (send #{RSPEC} :describe $[!const !#string_constant?] ...) + !(send #{RSPEC} :describe ... (hash <#rails_metadata? ...>)) ] + ... + ) PATTERN def on_top_level_group(top_level_node) - node, described = described(top_level_node) - - return unless described - - return if shared_group?(node) || - valid_describe?(node) || - describe_with_rails_metadata?(node) || - string_constant_describe?(described) - - add_offense(described) + not_a_const_described(top_level_node) do |described| + add_offense(described) + end end private - def string_constant_describe?(described_value) - described_value.str_type? && - described_value.value.match?(/^(?:(?:::)?[A-Z]\w*)+$/) + def string_constant?(described) + described.str_type? && + described.value.match?(/^(?:(?:::)?[A-Z]\w*)+$/) end end end diff --git a/spec/rubocop/cop/rspec/multiple_describes_spec.rb b/spec/rubocop/cop/rspec/multiple_describes_spec.rb index 41b476344..ce35a61af 100644 --- a/spec/rubocop/cop/rspec/multiple_describes_spec.rb +++ b/spec/rubocop/cop/rspec/multiple_describes_spec.rb @@ -26,10 +26,9 @@ RUBY end - it 'flags shared example groups' do - expect_offense(<<-RUBY) + it 'ignores shared example groups' do + expect_no_offenses(<<-RUBY) shared_examples_for 'behaves' do - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Do not use multiple top-level example groups - try to nest them. end shared_examples_for 'misbehaves' do end