require 'rspec/core/rake_task'

# syntax/lint checks: RuboCop & Foodcritic
namespace :lint do
  require 'rubocop/rake_task'
  require 'foodcritic'

  desc 'Run Ruby syntax/lint checks'
  RuboCop::RakeTask.new(:ruby)

  desc 'Run Chef syntax/lint checks'
  FoodCritic::Rake::LintTask.new(:chef) do |task|
    task.options = {
      :tags => ['~FC037'],
      :fail_tags => ['any']
    }
  end
end

desc 'Run all syntax/lint checks'
task :lint => ['lint:ruby', 'lint:chef']

# unit testing: ChefSpec
desc 'Run RSpec and ChefSpec unit tests'
RSpec::Core::RakeTask.new(:unit)

# integration testing: Test Kitchen
namespace :integration do
  require 'kitchen'

  desc 'Run Test Kitchen integration tests with Vagrant'
  task :vagrant do
    Kitchen.logger = Kitchen.default_file_logger
    Kitchen::Config.new.instances.each do |instance|
      instance.test(:always)
    end
  end
end

desc 'Run all integration tests'
task :integration => ['integration:vagrant']

# Travic CI
desc 'Run tests on Travis CI'
task :travis => [:lint, :unit]

# the default rake task should just run it all
task :default => [:lint, :unit, :integration]
