namespace :test do

    desc "Run tests for templates"
    task templates: "templates:all"

    namespace :templates do
      task all: [ :daemonize, :npm, :rackup, :wait, :mocha, :kill, :exit ]
      task serve: [ :npm, :rackup ]

      work_dir    = Pathname(EXPANDED_CWD).join("test/templates")
      pid_file    = Pathname(Dir.tmpdir).join("web_console.#{SecureRandom.uuid}.pid")
      runner_uri  = URI.parse("http://localhost:29292/html/spec_runner.html")
      rackup_opts = "-p #{runner_uri.port}"
      test_result = nil

      def need_to_wait?(uri)
        Net::HTTP.start(uri.host, uri.port) { |http| http.get(uri.path) }
      rescue Errno::ECONNREFUSED
        retry if yield
      end

      task :daemonize do
        rackup_opts += " -D -P #{pid_file}"
      end

      task :npm do
        Dir.chdir(work_dir) { system "npm install --silent" }
      end

      task :rackup do
        Dir.chdir(work_dir) { system "bundle exec rackup #{rackup_opts}" }
      end

      task :wait do
        cnt = 0
        need_to_wait?(runner_uri) { sleep 1; cnt += 1; cnt < 5 }
      end

      task :mocha do
        Dir.chdir(work_dir) { test_result = system("$(npm bin)/mocha-phantomjs #{runner_uri}") }
      end

      task :kill do
        system "kill #{File.read pid_file}"
      end

      task :exit do
        exit test_result
      end
    end

end