require 'simplecov'
SimpleCov.start do
  add_filter "/spec/"
  add_filter "/config/"
  add_filter "/lib/image_uploader_common.rb"
  add_filter "/lib/uploader_common.rb"
  add_filter "/lib/video_uploader_common.rb"
end
ENV['SKIP_RAILS_ADMIN_INITIALIZER'] = 'false'

require 'rubygems'

ENV["RAILS_ENV"] = 'test'

# require File.expand_path("../../config/environment", __FILE__)

require 'rspec'
require 'avocado/rspec'
require 'capybara/rspec'
require 'rspec/rails'
require 'shoulda/matchers'
#require 'rspec/autorun'
require 'mocha/setup'

require 'database_cleaner'
require 'yarjuf'
require 'webmock/rspec'

require 'sidekiq/testing'

Sidekiq::Testing.inline! # Immediately execute delayed jobs

DatabaseCleaner.clean_with :truncation

# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

WebMock.disable_net_connect! allow_localhost: true
ActionMailer::Base.delivery_method = :test
Capybara.server_port = 8888 + ENV['TEST_ENV_NUMBER'].to_i

#pp Capybara.server_port

#This silences the harmless warnings matching this type:
# CoreText performance note: Client called CTFontCreateWithName() using name "Arial" and got font with PostScript name "ArialMT".
Capybara.register_driver :quiet_webkit do |app|
  Capybara::Webkit::Driver.new(app, stderr: HushLittleWebkit.new)
end

Capybara.javascript_driver = :quiet_webkit

class HushLittleWebkit
  IGNOREABLE = /CoreText performance|userSpaceScaleFactor/

  def write(message)
    if message =~ IGNOREABLE
      0
    else
      puts(message)
      1
    end
  end
end

# Checks for pending migrations before tests are run.
# If you are not using ActiveRecord, you can remove this line.
#ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)

# if ActiveRecord::Migrator.needs_migration?
#   require 'rake'
#   TrunkMediaWeb::Application.load_tasks
#   Rake::Task['test:prepare'].invoke
# end
ActiveRecord::Migration.maintain_test_schema!


RSpec.configure do |config|
  #config.mock_with :mocha
  config.include(MailerMacros)
  config.use_transactional_fixtures = false
  config.infer_base_class_for_anonymous_controllers = false
  config.order = "random"
  config.include Rails.application.routes.url_helpers
  config.include Capybara::DSL
  config.include Devise::TestHelpers, type: :controller
  config.include JsonHelper
  config.include RequestHelper
  config.include ModelHelper
  config.include Warden::Test::Helpers
  config.include RSpecAll

  config.add_formatter('JUnit', "reports/results#{ENV['TEST_ENV_NUMBER']}.xml")

  config.after(:all) do
    #pp "AFTER ALL"
    Warden.test_reset!
  end

  # Focus Filter
  config.filter_run :focus => true
  config.alias_example_to :fit, focus: true
  config.run_all_when_everything_filtered = true
  config.treat_symbols_as_metadata_keys_with_true_values = true

  # config.before(:each, js: true) do
  #   DatabaseCleaner.strategy = :truncation, {:pre_count => true, reset_ids: true}
  # end

  # config.after(:each, js: true) do
  # end

  config.before :suite do
    #pp "BEFORE SUITE"
    DatabaseCleaner.strategy = :transaction
    DatabaseCleaner.clean_with(:truncation)
  end

  # Request specs cannot use a transaction because Capybara runs in a
  # separate thread with a different database connection.
  config.before type: :request do
    #pp "BEFORE REQUEST"
    DatabaseCleaner.strategy = :truncation
  end

  # Reset so other non-request specs don't have to deal with slow truncation.
  config.after type: :request  do
    #pp "AFTER REQUEST"
    DatabaseCleaner.strategy = :transaction
  end

  config.before do
    #pp "BEFORE"
    DatabaseCleaner.start
    WebMock.disable_net_connect!(:allow_localhost => true)
    ActionMailer::Base.deliveries.clear
  end

  config.after do
    #pp "AFTER"
    DatabaseCleaner.clean
  end

  config.before(:each) do
    request.env['HTTP_ACCEPT'] ='application/json' if described_class.try(:name).try(:include?, 'Api')
  end
end


def time_rand( from = 0.0, to = Time.now )
  Time.at(from + rand * (to.to_f - from.to_f))
end

#ActiveRecord::Base.logger = Logger.new(STDOUT)
