class RuboCop::Cop::RSpec::RepeatedExampleGroupDescription

Check for repeated example group descriptions.

@example

# bad
describe 'cool feature' do
  # example group
end

describe 'cool feature' do
  # example group
end

# bad
context 'when case x' do
  # example group
end

describe 'when case x' do
  # example group
end

# good
describe 'cool feature' do
  # example group
end

describe 'another cool feature' do
  # example group
end

# good
context 'when case x' do
  # example group
end

context 'when another case' do
  # example group
end

Constants

MSG

Public Instance Methods

on_begin(node) click to toggle source
# File lib/rubocop/cop/rspec/repeated_example_group_description.rb, line 67
def on_begin(node)
  return unless several_example_groups?(node)

  repeated_group_descriptions(node).each do |group, repeats|
    add_offense(group, message: message(group, repeats))
  end
end

Private Instance Methods

add_repeated_lines(groups) click to toggle source
# File lib/rubocop/cop/rspec/repeated_example_group_description.rb, line 89
def add_repeated_lines(groups)
  repeated_lines = groups.map(&:first_line)
  groups.map { |group| [group, repeated_lines - [group.first_line]] }
end
message(group, repeats) click to toggle source
# File lib/rubocop/cop/rspec/repeated_example_group_description.rb, line 94
def message(group, repeats)
  format(MSG, group: group.method_name, loc: repeats)
end
repeated_group_descriptions(node) click to toggle source
# File lib/rubocop/cop/rspec/repeated_example_group_description.rb, line 77
def repeated_group_descriptions(node)
  node
    .children
    .select { |child| example_group?(child) }
    .reject { |child| skip_or_pending?(child) }
    .reject { |child| empty_description?(child) }
    .group_by { |group| doc_string_and_metadata(group) }
    .values
    .reject(&:one?)
    .flat_map { |groups| add_repeated_lines(groups) }
end