48 lines
1.2 KiB
Ruby
48 lines
1.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require_relative '../../qa_helpers'
|
|
|
|
module RuboCop
|
|
module Cop
|
|
module QA
|
|
# This cop checks for the usage of the ambiguous name "page"
|
|
#
|
|
# @example
|
|
#
|
|
# # bad
|
|
# Page::Object.perform do |page| do ...
|
|
# Page::Another.perform { |page| ... }
|
|
#
|
|
# # good
|
|
# Page::Object.perform do |object| do ...
|
|
# Page::Another.perform { |another| ... }
|
|
class AmbiguousPageObjectName < RuboCop::Cop::Cop
|
|
include QAHelpers
|
|
|
|
MESSAGE = "Don't use 'page' as a name for a Page Object. Use `%s` instead.".freeze
|
|
|
|
def_node_matcher :ambiguous_page?, <<~PATTERN
|
|
(block
|
|
(send
|
|
(const ...) :perform)
|
|
(args
|
|
(arg :page)) ...)
|
|
PATTERN
|
|
|
|
def on_block(node)
|
|
return unless in_qa_file?(node)
|
|
return unless ambiguous_page?(node)
|
|
|
|
add_offense(node.arguments.each_node(:arg).first,
|
|
message: MESSAGE % page_object_name(node))
|
|
end
|
|
|
|
private
|
|
|
|
def page_object_name(node)
|
|
node.send_node.children[-2].const_name.downcase.split('::').last
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|