summaryrefslogtreecommitdiff
path: root/rubocop/cop/rspec/top_level_describe_path.rb
blob: 61796e23af04aaaca75c2a710d4c23083e1deda2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# frozen_string_literal: true

require 'rubocop/rspec/top_level_describe'

module RuboCop
  module Cop
    module RSpec
      class TopLevelDescribePath < RuboCop::Cop::Cop
        include RuboCop::RSpec::TopLevelDescribe

        MESSAGE = 'A file with a top-level `describe` must end in _spec.rb.'
        SHARED_EXAMPLES = %i[shared_examples shared_examples_for].freeze

        def on_top_level_describe(node, args)
          return if acceptable_file_path?(processed_source.buffer.name)
          return if shared_example?(node)

          add_offense(node, message: MESSAGE)
        end

        private

        def acceptable_file_path?(path)
          File.fnmatch?('*_spec.rb', path) || File.fnmatch?('*/frontend/fixtures/*', path)
        end

        def shared_example?(node)
          node.ancestors.any? do |node|
            node.respond_to?(:method_name) && SHARED_EXAMPLES.include?(node.method_name)
          end
        end
      end
    end
  end
end