module ActionDispatch::SystemTesting::TestHelpers::ScreenshotHelper

def absolute_image_path

def absolute_image_path
  Rails.root.join("tmp/screenshots/#{image_name}.png")
end

def display_image

def display_image
  message = "[Screenshot]: #{image_path}\n".dup
  case output_type
  when "artifact"
    message << "\e]1338;url=artifact://#{absolute_image_path}\a\n"
  when "inline"
    name = inline_base64(File.basename(absolute_image_path))
    image = inline_base64(File.read(absolute_image_path))
    message << "\e]1337;File=name=#{name};height=400px;inline=1:#{image}\a\n"
  end
  message
end

def failed?

def failed?
  !passed? && !skipped?
end

def image_name

def image_name
  failed? ? "failures_#{method_name}" : method_name
end

def image_path

def image_path
  @image_path ||= absolute_image_path.relative_path_from(Pathname.pwd).to_s
end

def inline_base64(path)

def inline_base64(path)
  Base64.encode64(path).gsub("\n", "")
end

def output_type

def output_type
  # Environment variables have priority
  output_type = ENV["RAILS_SYSTEM_TESTING_SCREENSHOT"] || ENV["CAPYBARA_INLINE_SCREENSHOT"]
  # Default to outputting a path to the screenshot
  output_type ||= "simple"
  output_type
end

def save_image

def save_image
  page.save_screenshot(absolute_image_path)
end

def supports_screenshot?

def supports_screenshot?
  Capybara.current_driver != :rack_test
end

def take_failed_screenshot

sessions.
fails add +take_failed_screenshot+ to the teardown block before clearing
that is generated with the application. To take screenshots when a test
+take_failed_screenshot+ is included in application_system_test_case.rb

failed.
Takes a screenshot of the current page in the browser if the test
def take_failed_screenshot
  take_screenshot if failed? && supports_screenshot?
end

def take_screenshot

artifact format (https://buildkite.github.io/terminal/inline-images/).
* [+artifact+] Display the screenshot in the terminal, using the terminal
iTerm image protocol (https://iterm2.com/documentation-images.html).
* [+inline+] Display the screenshot in the terminal using the
This is the default value.
* [+simple+ (default)] Only displays the screenshot path.
control the output. Possible values are:
You can set the +RAILS_SYSTEM_TESTING_SCREENSHOT+ environment variable to

The screenshot will be displayed in your console, if supported.

automating visual testing.
a screenshot of the current state. This can be useful for debugging or
+take_screenshot+ can be used at any point in your system tests to take

Takes a screenshot of the current page in the browser.
def take_screenshot
  save_image
  puts display_image
end