vaguerent/test/unit/vagrant/action/builtin/cloud_init_wait_test.rb

60 lines
1.9 KiB
Ruby

# Copyright (c) HashiCorp, Inc.
# SPDX-License-Identifier: BUSL-1.1
require File.expand_path("../../../../base", __FILE__)
describe Vagrant::Action::Builtin::CloudInitWait do
let(:app) { lambda { |env| } }
let(:config) { double("config", :vm => vm) }
let(:comm) { double("comm") }
let(:machine) { double("machie", :config => config, :communicate => comm, :name => "test") }
let(:ui) { Vagrant::UI::Silent.new }
let(:env) { { machine: machine, ui: ui} }
let(:subject) { described_class.new(app, env) }
describe "#call" do
context "cloud init configuration exists" do
let(:vm) { double("vm", cloud_init_configs: ["some config"]) }
before do
allow(comm).to receive(:test).with("command -v cloud-init").and_return(true)
end
it "waits for cloud init to be executed" do
expect(comm).to receive(:sudo).with("cloud-init status --wait", any_args).and_return(0)
subject.call(env)
end
it "raises an error when cloud init not installed" do
allow(comm).to receive(:test).with("command -v cloud-init").and_return(false)
expect { subject.call(env) }.
to raise_error(Vagrant::Errors::CloudInitNotFound)
end
it "raises an error when cloud init command fails" do
expect(comm).to receive(:sudo).with("cloud-init status --wait", any_args).and_return(1)
expect { subject.call(env) }.
to raise_error(Vagrant::Errors::CloudInitCommandFailed)
end
end
context "no cloud init configuration" do
let(:vm) { double("vm", cloud_init_configs: []) }
before do
allow(comm).to receive(:test).with("command -v cloud-init").and_return(true)
end
it "does not wait for cloud init if there are no cloud init configs" do
expect(comm).to_not receive(:sudo).with("cloud-init status --wait", any_args)
subject.call(env)
end
end
end
end