# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: BUSL-1.1

require_relative "../../../base"

require Vagrant.source_root.join("plugins/pushes/atlas/config")
require Vagrant.source_root.join("plugins/pushes/atlas/push")

describe VagrantPlugins::AtlasPush::Push do
  include_context "unit"

  let(:bin) { VagrantPlugins::AtlasPush::Push::UPLOADER_BIN }

  let(:env) do
    iso_env = isolated_environment
    iso_env.vagrantfile("")
    iso_env.create_vagrant_env
  end

  let(:config) do
    VagrantPlugins::AtlasPush::Config.new.tap do |c|
      c.finalize!
    end
  end

  subject { described_class.new(env, config) }

  before do
    # Stub this right away to avoid real execs
    allow(Vagrant::Util::SafeExec).to receive(:exec)
  end

  # DEPRECATED
  # describe "#push" do
  #   it "pushes with the uploader" do
  #     allow(subject).to receive(:uploader_path).and_return("foo")

  #     expect(subject).to receive(:execute).with("foo")

  #     subject.push
  #   end

  #   it "raises an exception if the uploader couldn't be found" do
  #     expect(subject).to receive(:uploader_path).and_return(nil)

  #     expect { subject.push }.to raise_error(
  #       VagrantPlugins::AtlasPush::Errors::UploaderNotFound)
  #   end
  # end

  # describe "#execute" do
  #   let(:app) { "foo/bar" }

  #   before do
  #     config.app = app
  #   end

  #   it "sends the basic flags" do
  #     expect(Vagrant::Util::SafeExec).to receive(:exec).
  #       with("foo", "-vcs", app, env.root_path.to_s)

  #     subject.execute("foo")
  #   end

  #   it "doesn't send VCS if disabled" do
  #     expect(Vagrant::Util::SafeExec).to receive(:exec).
  #       with("foo", app, env.root_path.to_s)

  #     config.vcs = false
  #     subject.execute("foo")
  #   end

  #   it "sends includes" do
  #     expect(Vagrant::Util::SafeExec).to receive(:exec).
  #       with("foo", "-vcs", "-include", "foo", "-include",
  #            "bar", app, env.root_path.to_s)

  #     config.includes = ["foo", "bar"]
  #     subject.execute("foo")
  #   end

  #   it "sends excludes" do
  #     expect(Vagrant::Util::SafeExec).to receive(:exec).
  #       with("foo", "-vcs", "-exclude", "foo", "-exclude",
  #            "bar", app, env.root_path.to_s)

  #     config.excludes = ["foo", "bar"]
  #     subject.execute("foo")
  #   end

  #   it "sends custom server address" do
  #     expect(Vagrant::Util::SafeExec).to receive(:exec).
  #       with("foo", "-vcs", "-address", "foo", app, env.root_path.to_s)

  #     config.address = "foo"
  #     subject.execute("foo")
  #   end

  #   it "sends custom token" do
  #     expect(Vagrant::Util::SafeExec).to receive(:exec).
  #       with("foo", "-vcs", "-token", "atlas_token", app, env.root_path.to_s)

  #     config.token = "atlas_token"
  #     subject.execute("foo")
  #   end

  #   context "when metadata is available" do
  #     let(:env) do
  #       iso_env = isolated_environment
  #       iso_env.vagrantfile <<-EOH
  #         Vagrant.configure("2") do |config|
  #           config.vm.box = "hashicorp/precise64"
  #           config.vm.box_url = "https://atlas.hashicorp.com/hashicorp/precise64"
  #         end
  #       EOH
  #       iso_env.create_vagrant_env
  #     end

  #     it "sends the metadata" do
  #       expect(Vagrant::Util::SafeExec).to receive(:exec).
  #         with("foo", "-vcs", "-metadata", "box=hashicorp/precise64",
  #           "-metadata", "box_url=https://atlas.hashicorp.com/hashicorp/precise64",
  #           "-token", "atlas_token", app, env.root_path.to_s)

  #       config.token = "atlas_token"
  #       subject.execute("foo")
  #     end
  #   end
  # end

  # describe "#uploader_path" do
  #   let(:scratch) do
  #     Pathname.new(Dir.mktmpdir("vagrant-test-atlas-push-upload-path"))
  #   end

  #   after do
  #     FileUtils.rm_rf(scratch)
  #   end

  #   it "should return the configured path if set" do
  #     config.uploader_path = "foo"
  #     expect(subject.uploader_path).to eq("foo")
  #   end

  #   it "should look up the uploader via PATH if not set" do
  #     allow(Vagrant).to receive(:in_installer?).and_return(false)

  #     expect(Vagrant::Util::Which).to receive(:which).
  #       with(described_class.const_get(:UPLOADER_BIN)).
  #       and_return("bar")

  #     expect(subject.uploader_path).to eq("bar")
  #   end

  #   it "should look up the uploader in the embedded dir if installer" do
  #     allow(Vagrant).to receive(:in_installer?).and_return(true)
  #     allow(Vagrant).to receive(:installer_embedded_dir).and_return(scratch.to_s)

  #     bin_path = scratch.join("bin", bin)
  #     bin_path.dirname.mkpath
  #     bin_path.open("w+") { |f| f.write("hi") }

  #     expect(subject.uploader_path).to eq(bin_path.to_s)
  #   end

  #   it "should look up the uploader in the PATH if not in the installer" do
  #     allow(Vagrant).to receive(:in_installer?).and_return(true)
  #     allow(Vagrant).to receive(:installer_embedded_dir).and_return(scratch.to_s)

  #     expect(Vagrant::Util::Which).to receive(:which).
  #       with(described_class.const_get(:UPLOADER_BIN)).
  #       and_return("bar")

  #     expect(subject.uploader_path).to eq("bar")
  #   end

  #   it "should return nil if its not found anywhere" do
  #     allow(Vagrant).to receive(:in_installer?).and_return(false)
  #     allow(Vagrant::Util::Which).to receive(:which).and_return(nil)

  #     expect(subject.uploader_path).to be_nil
  #   end
  # end
end
