class Rails5::SpecConverter::TestTypeIdentifier

Constants

DIRECTORY_TO_TYPE_MAP

Public Class Methods

new(content, options = TextTransformerOptions.new) click to toggle source
# File lib/rails5/spec_converter/test_type_identifier.rb, line 14
def initialize(content, options = TextTransformerOptions.new)
  @options = options
  @content = content

  @source_buffer = Parser::Source::Buffer.new('(string)')
  @source_buffer.source = @content

  ast_builder = Astrolabe::Builder.new
  @parser = Parser::CurrentRuby.new(ast_builder)

  @source_rewriter = Parser::Source::Rewriter.new(@source_buffer)
end

Public Instance Methods

test_type() click to toggle source
# File lib/rails5/spec_converter/test_type_identifier.rb, line 27
def test_type
  test_type_from_content || test_type_from_filename || test_type_default
end

Private Instance Methods

test_type_default() click to toggle source
# File lib/rails5/spec_converter/test_type_identifier.rb, line 33
def test_type_default
  :request
end
test_type_from_content() click to toggle source
# File lib/rails5/spec_converter/test_type_identifier.rb, line 37
def test_type_from_content
  root_node = @parser.parse(@source_buffer)
  root_node.each_node(:class) do |node|
    class_const_node, superclass_const_node = node.children
    next unless superclass_const_node && superclass_const_node.const_type?

    superclass_str = superclass_const_node.loc.expression.source
    return :controller if superclass_str == "ActionController::TestCase"
    return :request if superclass_str == "ActionDispatch::IntegrationTest"
  end

  root_node.each_node(:send) do |node|
    target, method, test_name, params = node.children
    next unless target.nil? || target == :RSpec
    next unless method == :describe

    return type_from_params_hash(params)
  end

  nil
end
test_type_from_filename() click to toggle source
# File lib/rails5/spec_converter/test_type_identifier.rb, line 59
def test_type_from_filename
  return nil unless @options.file_path

  dirs = @options.file_path.split('/')
  folder_index = dirs.index('spec') || dirs.index('test')
  return nil unless folder_index
  DIRECTORY_TO_TYPE_MAP[dirs[folder_index + 1]]
end
type_from_params_hash(params) click to toggle source
# File lib/rails5/spec_converter/test_type_identifier.rb, line 68
def type_from_params_hash(params)
  return nil unless params && params.hash_type?

  params.children.each do |node|
    if node.pair_type? && node.children.first.sym_type?
      key_node, value_node = node.children
      next unless key_node.children.first == :type

      value_str = value_node.children.first.to_s
      return :controller if value_str == 'controller'
      return :request if value_str == 'request'
    end
  end

  nil
end