require "rake"
require "rspec/core/rake_task"
require "json"

servers = JSON.parse(File.read("spec/env/servers.json"))

task spec: "spec:all"

namespace :spec do
  desc "Run all serverspecs"
  task all: ["spec:local", "spec:servers", "spec:infra"]

  desc "Run serverspecs targeting localhost"
  RSpec::Core::RakeTask.new(:local) do |t|
    t.pattern = "spec/localhost/**/*_spec.rb"
  end

  desc "Run serverspecs targeting hosts in servers.json"
  task servers: servers.map { |s| "spec:" + s["name"] }

  servers.each do |server|
    short_name = server["name"]
    roles      = server["roles"]

    desc "Run specs for #{server}"
    RSpec::Core::RakeTask.new(short_name) do |t|
      ENV["TARGET_HOST"] = server["hostname"]
      t.pattern = "spec/{#{roles.join(',')}}/*_spec.rb"
    end
  end

  desc "Run infrataster specs (tests for db, http, etc.)"
  # See https://medium.com/@KitaitiMakoto/instead-of-serverspec-use-infrataster-to-test-http-and-sql-results-aba6d59830f1
  # and https://github.com/ryotarai/infrataster
  RSpec::Core::RakeTask.new(:infra) do |t|
    t.pattern = "spec/infra/**/*_spec.rb"
  end
end
