module RuboCop::Cop::MinitestExplorationHelpers

def assertion_method?(node)

def assertion_method?(node)
  return false unless node
  return assertion_method?(node.expression) if node.assignment? && node.respond_to?(:expression)
  return false unless node.type?(:send, :any_block)
  ASSERTION_PREFIXES.any? do |prefix|
    method_name = node.method_name
    method_name.start_with?(prefix) || node.method?(:flunk)
  end
end

def assertions(def_node)

def assertions(def_node)
  method_def = def_node.body
  return [] unless method_def
  send_nodes =
    if method_def.send_type?
      [method_def]
    else
      method_def.each_child_node(:send)
    end
  send_nodes.select { |send_node| assertion_method?(send_node) }
end

def assertions_count(node)

def assertions_count(node)
  node.each_descendant(:send).count do |send_node|
    assertion_method?(send_node)
  end
end

def class_def_nodes(class_node)

def class_def_nodes(class_node)
  class_def = class_node.body
  return [] unless class_def
  if class_def.def_type?
    [class_def]
  else
    class_def.each_child_node(:def).to_a
  end
end

def lifecycle_hook_method?(node)

def lifecycle_hook_method?(node)
  node.def_type? && LIFECYCLE_HOOK_METHODS.include?(node.method_name)
end

def lifecycle_hooks(class_node)

def lifecycle_hooks(class_node)
  class_def_nodes(class_node)
    .select { |def_node| lifecycle_hook_method?(def_node) }
end

def test_block?(block_node)

def test_block?(block_node)
  block_node.method?(:test) || block_node.method?(:it)
end

def test_case?(node)

def test_case?(node)
  return false unless (node&.def_type? && test_method?(node)) ||
                      (node&.block_type? && test_block?(node))
  class_ancestor = node.each_ancestor(:class).first
  class_ancestor && test_class?(class_ancestor)
end

def test_case_name?(name)

def test_case_name?(name)
  name.to_s.start_with?('test_')
end

def test_cases(class_node, visibility_check: true)

def test_cases(class_node, visibility_check: true)
  test_methods = class_def_nodes(class_node).select do |def_node|
    test_method?(def_node, visibility_check: visibility_check)
  end
  # Support Active Support's `test 'example' { ... }` method.
  # https://api.rubyonrails.org/classes/ActiveSupport/Testing/Declarative.html
  test_blocks = class_node.each_descendant(:block).select { |block_node| test_block?(block_node) }
  test_methods + test_blocks
end

def test_class?(class_node)

def test_class?(class_node)
  class_node.parent_class && class_node.identifier.source.end_with?('Test')
end

def test_method?(def_node, visibility_check: true)

def test_method?(def_node, visibility_check: true)
  return false if visibility_check && non_public?(def_node)
  test_case_name?(def_node.method_name) && !def_node.arguments?
end