Module: EffectiveTestBot

Defined in:
lib/effective_test_bot/middleware.rb,
lib/effective_test_bot.rb,
lib/effective_test_bot/dsl.rb,
lib/effective_test_bot/engine.rb,
lib/effective_test_bot/version.rb,
lib/generators/effective_test_bot/install_generator.rb

Overview

Watch for any rails server exceptions and write the stacktrace to ./tmp/test_bot/exception.txt This file is checked for by assert_no_exceptions

Defined Under Namespace

Modules: DSL, Generators Classes: Engine, Middleware

Constant Summary collapse

VERSION =
'1.1.13'.freeze

Class Method Summary collapse

Class Method Details

.autosave_animated_gif_on_failure?Boolean



76
77
78
# File 'lib/effective_test_bot.rb', line 76

def self.autosave_animated_gif_on_failure?
  autosave_animated_gif_on_failure && gifs?
end

.exceptsObject



145
146
147
# File 'lib/effective_test_bot.rb', line 145

def self.excepts
  @@excepts ||= flatten_and_sort(except)
end

.fail_fast?Boolean



80
81
82
83
84
85
86
# File 'lib/effective_test_bot.rb', line 80

def self.fail_fast?
  if (ENV['FAIL_FAST'] || ENV['FAILFAST']).present?
    ['true', '1'].include?((ENV['FAIL_FAST'] || ENV['FAILFAST']).to_s.downcase)
  else
    fail_fast == true
  end
end

.failed_tests_only?Boolean



88
89
90
91
92
93
94
# File 'lib/effective_test_bot.rb', line 88

def self.failed_tests_only?
  if (ENV['FAILS'] || ENV['FAIL']).present?
    ['true', '1'].include?((ENV['FAILS'] || ENV['FAIL']).to_s.downcase)
  else
    false
  end
end

.flatten_and_sort(skips) ⇒ Object

We need to flatten any Hashes into

'users#create_invalid' => ['assert_path', 'assert_page_title'],

into this [‘users#create_invalid assert_path’ ‘users#create_invalid assert_page_title’]



163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/effective_test_bot.rb', line 163

def self.flatten_and_sort(skips)
  Array(skips).flat_map do |skip|
    case skip
    when Symbol
      skip.to_s
    when Hash
      skip.keys.product(skip.values.flatten).map { |p| p.join(' ') }
    else
      skip
    end
  end.compact.sort
end

.gifs?Boolean



68
69
70
# File 'lib/effective_test_bot.rb', line 68

def self.gifs?
  image_processing_class.present?
end

.image_processing_classObject



72
73
74
# File 'lib/effective_test_bot.rb', line 72

def self.image_processing_class
  @@image_processing_class ||= image_processing_class_name.safe_constantize
end

.load_passed_testsObject



117
118
119
120
121
# File 'lib/effective_test_bot.rb', line 117

def self.load_passed_tests
  {}.tap do |tests|
    (File.readlines(passed_tests_filename).each { |line| tests[line.chomp] = true } rescue nil)
  end
end

.onliesObject



133
134
135
136
137
138
139
140
141
142
143
# File 'lib/effective_test_bot.rb', line 133

def self.onlies
  @@onlines ||= begin
    flatten_and_sort(
      if ENV['TEST_BOT_TEST'].present?
        ENV['TEST_BOT_TEST'].to_s.gsub('[', '').gsub(']', '').split(',').map { |str| str.strip }
      else
        only
      end
    )
  end
end

.passed_testsObject



113
114
115
# File 'lib/effective_test_bot.rb', line 113

def self.passed_tests
  @@passed_tests ||= load_passed_tests
end

.passed_tests_filenameObject



180
181
182
# File 'lib/effective_test_bot.rb', line 180

def self.passed_tests_filename
  "#{passed_tests_path}/passed_tests.txt"
end

.passed_tests_pathObject



176
177
178
# File 'lib/effective_test_bot.rb', line 176

def self.passed_tests_path
  "#{Rails.root}/tmp/test_bot"
end

.save_passed_test(name) ⇒ Object



123
124
125
126
127
128
129
# File 'lib/effective_test_bot.rb', line 123

def self.save_passed_test(name)
  return if EffectiveTestBot.passed_tests[name] == true

  EffectiveTestBot.passed_tests[name] = true
  Dir.mkdir(passed_tests_path) unless File.exist?(passed_tests_path)
  File.open(passed_tests_filename, 'a') { |file| file.puts(name) }
end

.screenshots?Boolean

If you call rake test:bot TOUR=false, then disable screenshots too



64
65
66
# File 'lib/effective_test_bot.rb', line 64

def self.screenshots?
  screenshots == true
end

.setup {|_self| ... } ⇒ Object

Yields:

  • (_self)

Yield Parameters:



25
26
27
# File 'lib/effective_test_bot.rb', line 25

def self.setup
  yield self
end

.skip?(test, assertion = nil) ⇒ Boolean

Test could be something like “crud_test”, “crud_test (documents#new)”, “documents”, documents#new“ Assertion will be page_title, or flash



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/effective_test_bot.rb', line 32

def self.skip?(test, assertion = nil)
  return false if (test || assertion).blank?

  test = test.to_s
  assertion = assertion.to_s

  # If I get passed a method_name, "crud_test: (posts#create_invalid)" extract the inner test name from it
  # I dunno why this is needed really, but it might help someone one day.
  if test.include?('_test: (')  # This is how the BaseDsl test_bot_method_name formats the test names.
    left = test.index('(') || -1
    right = test.rindex(')') || (test.length+1)
    test = test[(left+1)..(right-1)]
  end

  if failed_tests_only? && test.present? && passed_tests[test]
    return true
  end

  value = "#{test} #{assertion}".strip # This is the format config.excepts is flattened into
  test_prefix = test.split('#').first

  # Excepts are defined in the app's config/initializers/effective_test_bot.rb file
  return true if excepts.any? { |except| [test, test_prefix, assertion, value].include?(except) }

  # Onlies are defined in the same config file, or on the command like rake test:bot TEST=posts#new
  # It doesn't match just 'flash' or 'page_title' assertions
  return true if onlies.present? && onlies.find { |only| test.start_with?(only) }.blank?

  false # Don't skip this test
end

.tour_mode?Boolean



96
97
98
99
100
101
102
# File 'lib/effective_test_bot.rb', line 96

def self.tour_mode?
  if ENV['TOUR'].present?
    ENV['TOUR'].to_s != 'false'
  else
    screenshots? && (tour_mode != false)
  end
end

.tour_mode_extreme?Boolean

form_filler will take a screenshot after every form field is filled



105
106
107
108
109
110
111
# File 'lib/effective_test_bot.rb', line 105

def self.tour_mode_extreme?
  if ENV['TOUR'].present?
    ['extreme', 'debug'].include?(ENV['TOUR'].to_s.downcase)
  else
    screenshots? && ['extreme', 'debug'].include?(tour_mode.to_s)
  end
end