# IMPORTANT: This file is generated by cucumber-rails - edit at your own peril.
# It is recommended to regenerate this file in the future when you upgrade to a
# newer version of cucumber-rails. Consider adding your own code to a new file
# instead of editing this one. Cucumber will automatically load all features/**/*.rb
# files.

require 'rubygems'
require 'spork'

Spork.prefork do
  require 'cucumber/rails'
  require 'rspec/mocks'
  require_relative '../../spec/support/trace_command_execution'
  require_relative '../../spec/support/wait'

  # Capybara defaults to CSS3 selectors rather than XPath.
  # If you'd prefer to use XPath, just uncomment this line and adjust any
  # selectors in your step definitions to use the XPath syntax.
  # Capybara.default_selector = :xpath
end

Spork.each_run do
  # By default, any exception happening in your Rails application will bubble up
  # to Cucumber so that your scenario will fail. This is a different from how
  # your application behaves in the production environment, where an error page will
  # be rendered instead.
  #
  # Sometimes we want to override this default behaviour and allow Rails to rescue
  # exceptions and display an error page (just like when the app is running in production).
  # Typical scenarios where you want to do this is when you test your error pages.
  # There are two ways to allow Rails to rescue exceptions:
  #
  # 1) Tag your scenario (or feature) with @allow-rescue
  #
  # 2) Set the value below to true. Beware that doing this globally is not
  # recommended as it will mask a lot of errors for you!
  #
  ActionController::Base.allow_rescue = false

  # Remove/comment out the lines below if your app doesn't have a database.
  # For some databases (like MongoDB and CouchDB) you may need to use :truncation instead.
  begin
    DatabaseCleaner.strategy = :transaction
  rescue NameError
    raise 'You need to add database_cleaner to your Gemfile (in the :test group) if you wish to use it.'
  end

  # You may also want to configure DatabaseCleaner to use different strategies for certain features and scenarios.
  # See the DatabaseCleaner documentation for details. Example:
  #
  #   Before('@no-txn,@selenium,@culerity,@celerity,@javascript') do
  #     # { :except => [:widgets] } may not do what you expect here
  #     # as Cucumber::Rails::Database.javascript_strategy overrides
  #     # this setting.
  #     DatabaseCleaner.strategy = :truncation
  #   end
  #
  #   Before('~@no-txn', '~@selenium', '~@culerity', '~@celerity', '~@javascript') do
  #     DatabaseCleaner.strategy = :transaction
  #   end
  #

  # Possible values are :truncation and :transaction
  # The :transaction strategy is faster, but might give you threading problems.
  # See https://github.com/cucumber/cucumber-rails/blob/master/features/choose_javascript_database_strategy.feature
  Cucumber::Rails::Database.javascript_strategy = :truncation

  Capybara.server_port = 3001
  Capybara.register_server(:puma) do |app, port|
    Puma::Server.new(app).tap do |s|
      s.add_tcp_listener Capybara.server_host, port
    end.run.join
  end
  Capybara.server = :puma

  Capybara.register_driver :chrome do |app|
    prefs = {
      'download' => {
        'default_directory' => DownloadHelpers::PATH.to_s,
        'directory_upgrade' => true,
        'extensions_to_open' => ''
      }
    }
    caps = Selenium::WebDriver::Remote::Capabilities.chrome
    caps['chromeOptions'] = { 'prefs' => prefs }
    Capybara::Selenium::Driver.new app,
      browser: :chrome,
      args: ['--window-size=1920,1080'],
      detach: false,
      desired_capabilities: caps
  end
  Capybara.javascript_driver = :chrome
  Capybara.default_selector = :css
  Capybara.default_max_wait_time = 10
  Capybara.ignore_hidden_elements = false
  Capybara.exact = false

  World(RSpec::Wait)

  After do
    FileUtils.rm_rf 'public/system/test'
  end

  World(RSpec::Mocks::ExampleMethods)

  Before do
    RSpec::Mocks.setup
  end

  After do
    begin
      RSpec::Mocks.verify
    ensure
      RSpec::Mocks.teardown
    end
  end
end
