Sha256: 3c451345372c7384a576c105f71ed35766f0f1ce42e5c4078a711c4d9c69bb6c

Contents?: true

Size: 1.62 KB

Versions: 1

Compression:

Stored size: 1.62 KB

Contents

require 'rutl/utilities'
require 'rutl/base_page'

#
# Currently called Browser, this top-level class controls a browser and
# a fake browser. It will soon call into apps, at which point I need to
# rethink this naming convention.
#
class Browser
  include Utilities

  attr_reader :interface

  def initialize(interface_type:, page_object_dir: 'spec/pages')
    # This is kind of evil. Figure out how to ditch the $ variable.
    $browser = self
    @interface = nil
    @interface = load_interface(interface_type)
    @interface.pages = load_pages(dir: page_object_dir)
  end

  def load_interface(type)
    require "rutl/interface/#{type}_interface"
    klass = "#{type.to_s.capitalize}Interface"
    Object.const_get(klass).new
  end

  # Ugly. Requires files for page objects. Returns array of class names to load.
  def require_pages(dir: 'spec/pages')
    names = []
    Dir["#{dir}/*"].each do |file|
      require "rutl/../../#{file}"
      File.open(file).each do |line|
        bingo = line.match(/class (.*) < BasePage/)
        names << bingo[1] if bingo && bingo[1]
      end
    end
    names
  end

  def load_pages(*)
    pages = []
    require_pages.each do |klass|
      # Don't have @interface set yet.
      # That would have been the param to new, :interface.
      pages << Object.const_get(klass).new(@interface)
    end
    pages
  end

  def method_missing(method, *args, &block)
    if args.empty?
      @interface.send(method)
    else
      @interface.send(method, *args, &block)
    end
  end

  def respond_to_missing?(*args)
    @interface.respond_to?(*args)
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rutl-0.1.4 lib/rutl/browser.rb