# Record code coverage with coveralls on Travis
require 'factory_bot_rails'
require 'coveralls'
Coveralls.wear! 'rails'
require 'capybara'
require 'capybara/dsl'
require 'selenium-webdriver'
require 'sidekiq/testing'

# Record code coverage with simplecov locally
require 'simplecov'
SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
                                                                 SimpleCov::Formatter::HTMLFormatter,
                                                                 Coveralls::SimpleCov::Formatter
                                                               ])
SimpleCov.start 'rails'

# This file was generated by the `rails generate rspec:install` command. Conventionally, all
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
# The generated `.rspec` file contains `--require spec_helper` which will cause this
# file to always be loaded, without a need to explicitly require it in any files.
#
# Given that it is always loaded, you are encouraged to keep this file as
# light-weight as possible. Requiring heavyweight dependencies from this file
# will add to the boot time of your test suite on EVERY test run, even for an
# individual file that may not need all of that loaded. Instead, make a
# separate helper file that requires this one and then use it only in the specs
# that actually need it.
#
# The `.rspec` file also contains a few flags that are not defaults but that
# users commonly want.
#
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
RSpec.configure do |config|
  config.include FactoryBot::Syntax::Methods
  # config.include PenaltyHelper
  # The settings below are suggested to provide a good initial experience
  # with RSpec, but feel free to customize to your heart's content.
  #   # These two settings work together to allow you to limit a spec run
  #   # to individual examples or groups you care about by tagging them with
  #   # `:focus` metadata. When nothing is tagged with `:focus`, all examples
  #   # get run.
  #   config.filter_run :focus
  #   config.run_all_when_everything_filtered = true
  #
  #   # Many RSpec users commonly either run the entire suite or an individual
  #   # file, and it's useful to allow more verbose output when running an
  #   # individual spec file.
  #   if config.files_to_run.one?
  #     # Use the documentation formatter for detailed output,
  #     # unless a formatter has already been configured
  #     # (e.g. via a command-line flag).
  #     config.default_formatter = 'doc'
  #   end
  #
  #   # Print the 10 slowest examples and example groups at the
  #   # end of the spec run, to help surface which specs are running
  #   # particularly slow.
  #   config.profile_examples = 10
  #
  #   # 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
  #   # Seed global randomization in this process using the `--seed` CLI option.
  #   # Setting this allows you to use `--seed` to deterministically reproduce
  #   # test failures related to randomization by passing the same `--seed` value
  #   # as the one that triggered the failure.
  #   Kernel.srand config.seed
  #
  #   # rspec-expectations config goes here. You can use an alternate
  #   # assertion/expectation library such as wrong or the stdlib/minitest
  #   # assertions if you prefer.
     config.expect_with :rspec do |expectations|
       # Enable only the newer, non-monkey-patching expect syntax.
       # For more details, see:
       #   - http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax
       expectations.syntax = :expect
       
       RSpec.configure do |rspec|
         rspec.expect_with :rspec do |c|
           c.max_formatted_output_length = nil
         end
       end  
   end
  #
  #   # rspec-mocks config goes here. You can use an alternate test double
  #   # library (such as bogus or mocha) by changing the `mock_with` option here.
  config.mock_with :rspec do |mocks|
    # Enable only the newer, non-monkey-patching expect syntax.
    # For more details, see:
    #   - http://teaisaweso.me/blog/2013/05/27/rspecs-new-message-expectation-syntax/
    mocks.syntax = :expect

    # Prevents you from mocking or stubbing a method that does not exist on
    # a real object. This is generally recommended.
    mocks.verify_partial_doubles = false

    # This option should be set when all dependencies are being loaded
    # before a spec run, as is the case in a typical spec helper. It will
    # cause any verifying double instantiation for a class that does not
    # exist to raise, protecting against incorrectly spelt names.
    mocks.verify_doubled_constant_names = false
  end

  # Before EACH test
  # Do NOT clear out any dummy users from the session
  #   Any RSpec test may depend on the current user
  #   so this is dangerous to do globally
  # Set up some roles
  #   The authorization helper depends on roles actually existing
  #   These are not explicitly used in tests
  #   But they must exist in memory for the authorization helper to work correctly
  # Parent IDs are the IDs of lesser privileged roles, per role.rb
  #   Some tests call code that makes use of parent_id
  #   so populate this information here
  #   by defining the least to most privileged roles
  config.before(:each) do
    role_student = create(:role_of_student)
    role_teaching_assistant = create(:role_of_teaching_assistant, parent_id: role_student.id)
    role_instructor = create(:role_of_instructor, parent_id: role_teaching_assistant.id)
    role_admin = create(:role_of_administrator, parent_id: role_instructor.id)
    create(:role_of_superadministrator, parent_id: role_admin.id)
  end

  Dir['./spec/features/helpers/*.rb'].each do |filename|
    require filename.gsub(/\.rb/, '')
  end
end
