vaguerent/test/unit/vagrant/cli_test.rb
Chris Roberts d08c68ecf3 Adjust how trigger actions are inserted into the stack
This adjusts how triggers are implemented during a normal run. Any
defined triggers which are applicable are located and injected into
the run stack as the stack is built, including hook type triggers.

Support is included for dynamic hook lookup.

The data type used when defining triggers has also been relaxed to
support symbols, strings, or constants.
2020-03-17 15:07:36 -07:00

111 lines
3.4 KiB
Ruby

require_relative "../base"
require "vagrant/cli"
require "vagrant/util"
describe Vagrant::CLI do
include_context "unit"
include_context "command plugin helpers"
let(:commands) { {} }
let(:iso_env) { isolated_environment }
let(:env) { iso_env.create_vagrant_env }
let(:checkpoint) { double("checkpoint") }
before do
allow(Vagrant.plugin("2").manager).to receive(:commands).and_return(commands)
allow(Vagrant::Util::CheckpointClient).to receive(:instance).and_return(checkpoint)
allow(checkpoint).to receive(:setup).and_return(checkpoint)
allow(checkpoint).to receive(:check)
allow(checkpoint).to receive(:display)
end
describe "#initialize" do
it "should setup checkpoint" do
expect(checkpoint).to receive(:check)
described_class.new(["destroy"], env)
end
end
describe "#execute" do
let(:triggers) { double("triggers") }
it "invokes help and exits with 1 if invalid command" do
subject = described_class.new(["i-dont-exist"], env)
expect(subject).to receive(:help).once
expect(subject.execute).to eql(1)
end
it "invokes command and returns its exit status if the command is valid" do
commands[:destroy] = [command_lambda("destroy", 42), {}]
subject = described_class.new(["destroy"], env)
expect(subject).not_to receive(:help)
expect(subject.execute).to eql(42)
end
it "returns exit code 1 if interrupted" do
commands[:destroy] = [command_lambda("destroy", 42, exception: Interrupt), {}]
subject = described_class.new(["destroy"], env)
expect(subject.execute).to eql(1)
end
it "displays any checkpoint information" do
commands[:destroy] = [command_lambda("destroy", 42), {}]
expect(checkpoint).to receive(:display)
described_class.new(["destroy"], env).execute
end
it "fires triggers, if enabled" do
allow(Vagrant::Util::Experimental).to receive(:feature_enabled?).
with("typed_triggers").and_return(true)
allow(triggers).to receive(:fire)
allow(triggers).to receive(:find).and_return([double("trigger-result")])
commands[:destroy] = [command_lambda("destroy", 42), {}]
allow(Vagrant::Plugin::V2::Trigger).to receive(:new).and_return(triggers)
subject = described_class.new(["destroy"], env)
expect(triggers).to receive(:fire).twice
expect(subject).not_to receive(:help)
expect(subject.execute).to eql(42)
end
it "does not fire triggers if disabled" do
allow(Vagrant::Util::Experimental).to receive(:feature_enabled?).
with("typed_triggers").and_return(false)
commands[:destroy] = [command_lambda("destroy", 42), {}]
subject = described_class.new(["destroy"], env)
expect(triggers).not_to receive(:fire)
expect(subject).not_to receive(:help)
expect(subject.execute).to eql(42)
end
end
describe "#help" do
subject { described_class.new([], env) }
it "includes all primary subcommands" do
commands[:foo] = [command_lambda("foo", 0), { primary: true }]
commands[:bar] = [command_lambda("bar", 0), { primary: true }]
commands[:baz] = [command_lambda("baz", 0), { primary: false }]
expect(env.ui).to receive(:info).with(any_args) { |message, opts|
expect(message).to include("foo")
expect(message).to include("bar")
expect(message.include?("baz")).to be(false)
}
subject.help
end
end
end