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

require Vagrant.source_root.join("plugins/provisioners/chef/command_builder")

describe VagrantPlugins::Chef::CommandBuilder do

  let(:machine) { double("machine") }
  let(:chef_config) { double("chef_config") }

  before(:each) do
    allow(chef_config).to receive(:provisioning_path).and_return('/tmp/vagrant-chef-1')
    allow(chef_config).to receive(:arguments).and_return(nil)
    allow(chef_config).to receive(:binary_env).and_return(nil)
    allow(chef_config).to receive(:binary_path).and_return(nil)
    allow(chef_config).to receive(:binary_env).and_return(nil)
  end

  describe '.initialize' do
    it 'should raise when chef type is not client or solo' do
      expect { VagrantPlugins::Chef::CommandBuilder.new(chef_config, :client_bad) }.
        to raise_error
    end
  end

  describe 'build_command' do
    describe 'windows' do
      subject do
        VagrantPlugins::Chef::CommandBuilder.new(chef_config, :client, true)
      end

      it "executes the chef-client in PATH by default" do
        expect(subject.build_command()).to match(/^chef-client/)
      end

      it "executes the chef-client using full path if binary_path is specified" do
        allow(chef_config).to receive(:binary_path).and_return(
          "c:\\opscode\\chef\\bin\\chef-client")
        expect(subject.build_command()).to match(/^c:\\opscode\\chef\\bin\\chef-client\\chef-client/)
      end

      it "builds a guest friendly client.rb path" do
        expect(subject.build_command()).to include(
          '-c c:\\tmp\\vagrant-chef-1\\client.rb')
      end

      it "builds a guest friendly solo.json path" do
        expect(subject.build_command()).to include(
          '-j c:\\tmp\\vagrant-chef-1\\dna.json')
      end

      it 'includes Chef arguments if specified' do
        allow(chef_config).to receive(:arguments).and_return("-l DEBUG")
        expect(subject.build_command()).to include(
          '-l DEBUG')
      end

      it 'includes --no-color if UI is not colored' do
        expect(subject.build_command()).to include(
          ' --no-color')
      end
    end

    describe 'linux' do
      subject do
        VagrantPlugins::Chef::CommandBuilder.new(chef_config, :client, false)
      end

      it "executes the chef-client in PATH by default" do
        expect(subject.build_command()).to match(/^chef-client/)
      end

      it "executes the chef-client using full path if binary_path is specified" do
        allow(chef_config).to receive(:binary_path).and_return(
          "/opt/chef/chef-client")
        expect(subject.build_command()).to match(/^\/opt\/chef\/chef-client/)
      end

      it "builds a guest friendly client.rb path" do
        expect(subject.build_command()).to include(
          '-c /tmp/vagrant-chef-1/client.rb')
      end

      it "builds a guest friendly solo.json path" do
        expect(subject.build_command()).to include(
          '-j /tmp/vagrant-chef-1/dna.json')
      end

      it 'includes Chef arguments if specified' do
        allow(chef_config).to receive(:arguments).and_return("-l DEBUG")
        expect(subject.build_command()).to include(
          '-l DEBUG')
      end

      it 'includes --no-color if UI is not colored' do
        expect(subject.build_command()).to include(
          ' --no-color')
      end

      it 'includes environment variables if specified' do
        allow(chef_config).to receive(:binary_env).and_return("ENVVAR=VAL")
        expect(subject.build_command()).to match(/^ENVVAR=VAL /)
      end
    end
  end
end