require 'simplecov'
SimpleCov.start 'rails'
require 'rspec'
require 'active_support'
require 'action_view'
require 'action_controller'
require 'deface'
require 'rails/generators'
# have to manually require following for testing purposes
require 'deface/action_view_extensions'
require 'rails/version'

#adding fake class as it's needed by haml 4.0, don't
#want to have to require the entire rails stack in specs.
module Rails
  class Railtie
    def self.initializer(*args)
    end
  end
end

require 'haml'
require 'slim'
require 'deface/haml_converter'
require 'generators/deface/override_generator'
require 'time'

if defined?(Haml::Options)
  # Haml 3.2 changes the default output format to HTML5
  Haml::Options.defaults[:format] = :xhtml
end

RSpec.configure do |config|
  config.mock_framework = :rspec
end

module ActionView::CompiledTemplates
  #empty module for testing purposes
end

shared_context "mock Rails" do
  before(:each) do
    rails_version = Rails::VERSION::STRING

    # mock rails to keep specs FAST!
    unless defined? Rails
      Rails = double 'Rails'
    end

    Rails.stub :version => rails_version

    Rails.stub :application => double('application')
    Rails.application.stub :config => double('config')
    Rails.application.config.stub :cache_classes => true
    Rails.application.config.stub :deface => ActiveSupport::OrderedOptions.new
    Rails.application.config.deface.enabled = true

    if Rails.version[0..2] == '3.2'
      Rails.application.config.stub :watchable_dirs => {}
    end

    Rails.stub :root => Pathname.new('spec/dummy')

    Rails.stub :logger => double('logger')
    Rails.logger.stub(:error)
    Rails.logger.stub(:warning)
    Rails.logger.stub(:info)
    Rails.logger.stub(:debug)

    Time.stub :zone => double('zone')
    Time.zone.stub(:now).and_return Time.parse('1979-05-25')

    require "haml/template/plugin"
    require 'slim/erb_converter'
  end
end

shared_context "mock Rails.application" do
  include_context "mock Rails"

  before(:each) do
    Rails.application.config.stub :deface => Deface::Environment.new
    Rails.application.config.deface.haml_support = true
    Rails.application.config.deface.slim_support = true
  end
end

# Dummy Deface instance for testing actions / applicator
class Dummy
  extend Deface::Applicator::ClassMethods
  extend Deface::Search::ClassMethods

  attr_reader :parsed_document

  def self.all
    Rails.application.config.deface.overrides.all
  end
end