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

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

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

describe VagrantPlugins::Chef::Config::ChefApply do
  include_context "unit"

  subject { described_class.new }

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

  def chef_error(key, options = {})
    I18n.t("vagrant.provisioners.chef.#{key}", **options)
  end

  describe "#recipe" do
    it "defaults to nil" do
      subject.finalize!
      expect(subject.recipe).to be(nil)
    end
  end

  describe "#upload_path" do
    it "defaults to /tmp/vagrant-chef-apply.rb" do
      subject.finalize!
      expect(subject.upload_path).to eq("/tmp/vagrant-chef-apply")
    end
  end

  describe "#validate" do
    before do
      allow(machine).to receive(:env)
        .and_return(double("env",
          root_path: "",
        ))

      subject.recipe = <<-EOH
        package "foo"
      EOH
    end

    let(:result) { subject.validate(machine) }
    let(:errors) { result["chef apply provisioner"] }

    context "when the recipe is nil" do
      it "returns an error" do
        subject.recipe = nil
        subject.finalize!
        expect(errors).to include chef_error("recipe_empty")
      end
    end

    context "when the recipe is empty" do
      it "returns an error" do
        subject.recipe = "  "
        subject.finalize!
        expect(errors).to include chef_error("recipe_empty")
      end
    end

    context "when the log_level is an empty array" do
      it "returns an error" do
        subject.log_level = "  "
        subject.finalize!
        expect(errors).to include chef_error("log_level_empty")
      end
    end

    context "when the upload_path is nil" do
      it "returns an error" do
        subject.upload_path = nil
        subject.finalize!
        expect(errors).to include chef_error("upload_path_empty")
      end
    end

    context "when the upload_path is an empty array" do
      it "returns an error" do
        subject.upload_path = "  "
        subject.finalize!
        expect(errors).to include chef_error("upload_path_empty")
      end
    end
  end
end
