Sha256: 62d2f27408c9c68147be5534f298725382544af8601b161d55166a75bee68089

Contents?: true

Size: 1.7 KB

Versions: 1

Compression:

Stored size: 1.7 KB

Contents

require 'rspec/expectations'

class Lopata::Scenario
  include RSpec::Matchers

  attr_reader :title, :metadata, :steps, :status

  def initialize(*args)
    @title = args.first
    @metadata = args.last.is_a?(Hash) ? args.last : {}
    @steps = []
    @status = :not_runned
  end

  def run
    @status = :running
    world.notify_observers(:scenario_started, self)
    teardown_steps = []
    @steps.reject(&:teardown?).each { |step| step.run(self) }
    @steps.select(&:teardown?).each { |step| step.run(self) }
    @status = @steps.all?(&:passed?) ? :passed : :failed
    world.notify_observers(:scenario_finished, self)
  end

  def match_metadata?(metadata_key)
    case metadata_key
    when Hash
      metadata_key.keys.all? { |k| metadata[k] == metadata_key[k] }
    when Array
      metadata_key.map { |key| metadata[key] }.none?(&:nil?)
    else
      metadata[metadata_key]
    end
  end

  def run_step(method_name, *args, &block)
    instance_exec(&block)
  end

  def world
    @world ||= Lopata::Config.world
  end

  def convert_args(*args)
    args.map do |arg|
      case arg
        # trait symbols as link to metadata.
        when Symbol then metadata[arg]
      else
        arg
      end
    end.flatten
  end

  def separate_args(args)
    args.map { |a| a.is_a?(String) && a =~ /,/ ? a.split(',').map(&:strip) : a }.flatten
  end

  def failed?
    status == :failed
  end

  private

    def method_missing(method, *args, &block)
      if metadata.keys.include?(method)
        metadata[method]
      else
        super
      end
    end

    def respond_to_missing?(method, *)
      metadata.keys.include?(method) or super
    end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
lopata-0.1.0 lib/lopata/scenario.rb