Class: Omnitest::Skeptic::Scenario

Inherits:
Core::Dash
  • Object
show all
Extended by:
Forwardable
Includes:
Core::FileSystem, Core::Logging, Core::Util::String, Psychic::Code2Doc::CodeHelper, TestStatuses, TestTransitions
Defined in:
lib/omnitest/skeptic/scenario.rb

Overview

rubocop:disable ClassLength

Constant Summary collapse

KEYS_TO_PERSIST =
[:last_attempted_action, :last_completed_action, :result,
:spy_data, :error, :duration]

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from TestStatuses

#failed?, #sample?, #skipped?, #status, #status_color, #status_description

Methods included from TestTransitions

#action, #clear, #clear_action, #detect, #detect_action, #exec, #exec_action, #failure_message, #log_failure, #perform_action, #test, #transition_to, #verify, #verify_action

Constructor Details

#initialize(data) ⇒ Scenario

Returns a new instance of Scenario.



50
51
52
53
54
# File 'lib/omnitest/skeptic/scenario.rb', line 50

def initialize(data)
  super
  @slug = slugify(suite, name, psychic.name)
  @evidence_file = Pathname.new(Omnitest.basedir).join('.omnitest', "#{slug}.pstore").expand_path.freeze
end

Instance Attribute Details

#slugObject (readonly)

Returns the value of attribute slug.



48
49
50
# File 'lib/omnitest/skeptic/scenario.rb', line 48

def slug
  @slug
end

Instance Method Details

#absolute_source_fileObject



76
77
78
79
80
# File 'lib/omnitest/skeptic/scenario.rb', line 76

def absolute_source_file
  return nil unless code_sample

  code_sample.absolute_source_file
end

#clear!Object



146
147
148
149
# File 'lib/omnitest/skeptic/scenario.rb', line 146

def clear!
  @evidence.clear
  @evidence = nil
end

#code2doc(options = {}) ⇒ Object



88
89
90
91
92
# File 'lib/omnitest/skeptic/scenario.rb', line 88

def code2doc(options = {})
  return nil unless code_sample

  doc = code_sample.code2doc(options)
end

#code_sampleObject



64
65
66
67
68
# File 'lib/omnitest/skeptic/scenario.rb', line 64

def code_sample
  self[:code_sample] ||= psychic.script(name)
rescue Errno::ENOENT
  nil
end

#detect!Object



94
95
96
97
98
99
100
# File 'lib/omnitest/skeptic/scenario.rb', line 94

def detect!
  # fail FeatureNotImplementedError, "Project #{psychic.name} has not been cloned" unless psychic.cloned?
  fail FeatureNotImplementedError, name if source_file.nil?
  self.source_file = Pathname(code_sample)
rescue Errno::ENOENT
  raise FeatureNotImplementedError, name
end

#evidence(initial_data = {}) ⇒ Object



56
57
58
# File 'lib/omnitest/skeptic/scenario.rb', line 56

def evidence(initial_data = {})
  @evidence ||= Skeptic::Evidence.load(@evidence_file, initial_data)
end

#exec!Object



102
103
104
105
# File 'lib/omnitest/skeptic/scenario.rb', line 102

def exec!
  detect!
  evidence.result = run!
end

#run!(spies = Omnitest::Skeptic::Spies) ⇒ Object

rubocop:disable Metrics/AbcSize



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# File 'lib/omnitest/skeptic/scenario.rb', line 107

def run!(spies = Omnitest::Skeptic::Spies) # rubocop:disable Metrics/AbcSize
  spies.observe(self) do
    if code_sample.params.is_a? String
      code_sample.params = YAML.load(Psychic::Tokens.replace_tokens(code_sample.params, vars))
    else
      code_sample.params = vars
    end
    execution_result = code_sample.execute(env: upcased_hash(vars).merge(ENV.to_hash))
    evidence.result = Skeptic::Result.new(execution_result: execution_result, source_file: source_file.to_s)
  end
  result
rescue Omnitest::Shell::ExecutionError => e
  execution_error = ExecutionError.new(e)
  execution_error.execution_result = e.execution_result
  evidence.error = Omnitest::Error.formatted_trace(e).join("\n")
  raise execution_error
rescue => e
  evidence.error = Omnitest::Error.formatted_trace(e).join("\n")
  raise e
ensure
  save
end

#sourceObject



82
83
84
85
86
# File 'lib/omnitest/skeptic/scenario.rb', line 82

def source
  return nil unless code_sample

  code_sample.source
end

#source_fileObject



70
71
72
73
74
# File 'lib/omnitest/skeptic/scenario.rb', line 70

def source_file
  return nil unless code_sample

  self[:source_file] ||= Pathname(code_sample)
end

#validationsObject



151
152
153
154
# File 'lib/omnitest/skeptic/scenario.rb', line 151

def validations
  return nil if result.nil?
  result.validations
end

#validatorsObject



60
61
62
# File 'lib/omnitest/skeptic/scenario.rb', line 60

def validators
  Omnitest::Skeptic::ValidatorRegistry.validators_for self
end

#verify!Object



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'lib/omnitest/skeptic/scenario.rb', line 130

def verify!
  validators.each do |validator|
    validation = validator.validate(self)
    status = case validation.status
             when :passed
               Core::Color.colorize("\u2713 Passed", :green)
             when :failed
               Core::Color.colorize('x Failed', :red)
               Omnitest.handle_validation_failure(validation.error)
             else
               Core::Color.colorize(validation.status, :yellow)
             end
    info format('%-50s %s', validator.description, status)
  end
end