# frozen_string_literal: true

# This file is copied to spec/ when you run 'rails generate rspec:install'
require 'simplecov'

if ENV['GITHUB_ACTIONS']
  require 'simplecov-cobertura'
  SimpleCov.formatter = SimpleCov::Formatter::CoberturaFormatter
end
SimpleCov.start 'rails'

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)

require 'rspec/rails'
require 'shoulda/matchers'
require 'webdrivers'

# To avoid confusion on missed migrations - use Rails 4 checker to ensure
# all migrations applied
ActiveRecord::Migration.maintain_test_schema!

# Adds rspec helper provided by paper_trail
# makes it easier to control when PaperTrail is enabled during testing.
require 'paper_trail/frameworks/rspec'

# Make htmlescape() available
require 'erb'
include ERB::Util

# Requires supporting ruby files with custom matchers and macros, etc, in
# spec/support/ and its subdirectories. Files matching `spec/**/*_spec.rb` are
# run as spec files by default. This means that files in spec/support that end
# in _spec.rb will both be required and run as specs, causing the specs to be
# run twice. It is recommended that you do not name files matching this glob to
# end with _spec.rb. You can configure this pattern with with the --pattern
# option on the command line or in ~/.rspec, .rspec or `.rspec-local`.
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }

RSpec.configure do |config|
  # ## Mock Framework
  #
  # If you prefer to use mocha, flexmock or RR, uncomment the appropriate line:
  #
  # config.mock_with :mocha
  # config.mock_with :flexmock
  # config.mock_with :rr

  # Test within database transactions
  config.use_transactional_examples = true

  # Run specs in random order to surface order dependencies. If you find an
  # order dependency and want to debug it, you can fix the order by providing
  # the seed, which is printed after each run.
  #     --seed 1234
  config.order = 'random'

  Capybara.disable_animation = true

  Capybara.register_driver :firefox do |app|
    Capybara::Selenium::Driver.new(app, browser: :firefox)
  end

  Capybara.register_driver :chrome do |app|
    Capybara::Selenium::Driver.new(app, browser: :chrome)
  end

  Capybara.register_driver :firefox_headless do |app|
    options = Selenium::WebDriver::Firefox::Options.new
    options.args << '--headless'
    options.args << '--window-size=1920,1080'
    Capybara::Selenium::Driver.new(app, browser: :firefox, options: options)
  end

  Capybara.register_driver :chrome_headless do |app|
    options = ::Selenium::WebDriver::Chrome::Options.new
    options.args << '--window-size=1920x1080'
    options.args << '--headless'
    options.args << '--no-sandbox'
    options.args << '--disable-gpu'
    Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
  end

  Capybara.default_max_wait_time = 10 # seconds

  # use a real browser for JS tests
  Capybara.javascript_driver = (
    ENV.fetch('OSEM_TEST_DRIVER', 'chrome_headless').to_sym
  )

  # Includes helpers and connect them to specific types of tests
  config.include FactoryBot::Syntax::Methods
  config.include OmniauthMacros
  config.include Devise::Test::ControllerHelpers, type: :controller
  config.include LoginMacros, type: :feature
  config.include Flash, type: :feature
  config.include Sidebar, type: :view
  config.include Devise::Test::ControllerHelpers, type: :view

  # As we start from scratch in April 2014, let's forbid the old :should syntax
  config.expect_with :rspec do |c|
    c.syntax = :expect
  end

  # Reuse rspec as mocking framework
  config.mock_framework = :rspec

  # Types of tests (controller, feature, model) will
  # be inferred from subfolder name
  config.infer_spec_type_from_file_location!

  # Enable this if you like to see what you're debugging
  # config.after(:example) do |example|
  #   if example.exception
  #     save_and_open_screenshot
  #     save_and_open_page
  #   end
  # end

  # Expect configured host instead of `test.host` (see https://stackoverflow.com/q/15414847)
  config.before(:each, type: :controller) do
    @request.host = Rails.application.routes.default_url_options[:host]
  end

  # use the config to use
  # t('some.locale.key') instead of always having to type I18n.t
  config.include AbstractController::Translation
end

OmniAuth.config.test_mode = true

Shoulda::Matchers.configure do |config|
  config.integrate do |with|
    with.test_framework :rspec
    with.library :rails
  end
end
