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

require File.expand_path("../../../base", __FILE__)

require 'vagrant/util/install_cli_autocomplete'
require 'fileutils'

describe Vagrant::Util::InstallZSHShellConfig do

  let(:home) { "#{Dir.tmpdir}/not-home" }
  let(:target_file) { "#{home}/.zshrc" }

  subject { described_class.new() }

  describe "#shell_installed" do
    it "should return path to config file if exists" do
      allow(File).to receive(:exist?).with(target_file).and_return(true)
      expect(subject.shell_installed(home)).to eq(target_file) 
    end

    it "should return nil if config file does not exists" do
      FileUtils.rm_rf(target_file)
      expect(subject.shell_installed(home)).to eq(nil) 
    end
  end

  describe "#is_installed" do
    it "returns false if autocompletion not already installed" do
      allow(File).to receive(:foreach).with(target_file).and_yield("nothing")
      expect(subject.is_installed(target_file)).to eq(false)
    end

    it "returns true if autocompletion is already installed" do
      allow(File).to receive(:foreach).with(target_file).and_yield(subject.prepend_string)
      expect(subject.is_installed(target_file)).to eq(true)
    end
  end

  describe "#install" do
    it "installs autocomplete" do
      allow(File).to receive(:exist?).with(target_file).and_return(true)
      allow(File).to receive(:foreach).with(target_file).and_yield("nothing")
      expect(File).to receive(:open).with(target_file, "a")
      subject.install(home)
    end
  end
end

describe Vagrant::Util::InstallCLIAutocomplete do

  let(:zshrc_path) { "/path/to/.zshrc" }
  let(:bashrc_path) { "/path/to/.bash_profile" }

  subject { described_class }

  describe ".install" do
    it "installs requested shells" do
      allow_any_instance_of(Vagrant::Util::InstallZSHShellConfig).to receive(:install).and_return(zshrc_path)
      expect(subject.install(["zsh"])).to eq([zshrc_path])
    end

    it "installs all shells by default" do
      allow_any_instance_of(Vagrant::Util::InstallZSHShellConfig).to receive(:install).and_return(zshrc_path)
      allow_any_instance_of(Vagrant::Util::InstallBashShellConfig).to receive(:install).and_return(bashrc_path)
      expect(subject.install()).to eq([zshrc_path, bashrc_path])
    end

    it "does not install unsupported shells" do
      expect{ subject.install(["oops"]) }.to raise_error(ArgumentError)
    end
  end
end
