-
-
Notifications
You must be signed in to change notification settings - Fork 269
/
repeated_example.rb
53 lines (45 loc) · 1.25 KB
/
repeated_example.rb
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# frozen_string_literal: true
module RuboCop
module Cop
module RSpec
# Check for repeated examples within example groups.
#
# @example
#
# it 'is valid' do
# expect(user).to be_valid
# end
#
# it 'validates the user' do
# expect(user).to be_valid
# end
#
class RepeatedExample < Base
MSG = "Don't repeat examples within an example group."
def on_block(node) # rubocop:disable InternalAffairs/NumblockHandler
return unless example_group?(node)
repeated_examples(node).each do |repeated_example|
add_offense(repeated_example)
end
end
private
def repeated_examples(node)
RuboCop::RSpec::ExampleGroup.new(node)
.examples
.group_by { |example| example_signature(example) }
.values
.reject(&:one?)
.flatten
.map(&:to_node)
end
def example_signature(example)
key_parts = [example.metadata, example.implementation]
if example.definition.method?(:its)
key_parts << example.definition.arguments
end
key_parts
end
end
end
end
end