vaguerent/test/unit/plugins/kernel_v2/config/vm_trigger_test.rb
Brian Cain f4d618eb58
Fixes #9840: Introduce ruby option for trigger
This commit introduces a new option to the core trigger feature: `ruby`.
It can be defined to run ruby code when the trigger is configured to
fire. If you give the ruby block an env and machine argument, the
defined ruby code can use those variables internally.
2018-10-05 12:53:41 -07:00

147 lines
3.6 KiB
Ruby

require File.expand_path("../../../../base", __FILE__)
require Vagrant.source_root.join("plugins/kernel_v2/config/vm_trigger")
describe VagrantPlugins::Kernel_V2::VagrantConfigTrigger do
include_context "unit"
let(:command) { :up }
subject { described_class.new(command) }
let(:machine) { double("machine") }
def assert_invalid
errors = subject.validate(machine)
if !errors.empty? { |v| !v.empty? }
raise "No errors: #{errors.inspect}"
end
end
def assert_valid
errors = subject.validate(machine)
if !errors.empty? { |v| v.empty? }
raise "Errors: #{errors.inspect}"
end
end
before do
env = double("env")
allow(env).to receive(:root_path).and_return(nil)
allow(machine).to receive(:env).and_return(env)
allow(machine).to receive(:provider_config).and_return(nil)
allow(machine).to receive(:provider_options).and_return({})
subject.name = "foo"
subject.info = "Hello there"
subject.warn = "Warning!!"
subject.ignore = :up
subject.only_on = "guest"
subject.ruby do |env,machine|
var = 'test'
math = 1+1
end
subject.run = {inline: "apt-get update"}
subject.run_remote = {inline: "apt-get update", env: {"VAR"=>"VAL"}}
end
describe "with defaults" do
it "is valid with test defaults" do
subject.finalize!
assert_valid
end
it "sets a command" do
subject.finalize!
expect(subject.command).to eq(command)
end
it "uses default error behavior" do
subject.finalize!
expect(subject.on_error).to eq(:halt)
end
end
describe "defining a new config that needs to match internal restraints" do
let(:cmd) { :destroy }
let(:cfg) { described_class.new(cmd) }
let(:arr_cfg) { described_class.new(cmd) }
before do
cfg.only_on = :guest
cfg.ignore = "up"
cfg.abort = true
cfg.ruby do
var = 1+1
end
arr_cfg.only_on = ["guest", /other/]
arr_cfg.ignore = ["up", "destroy"]
end
it "ensures only_on is an array" do
cfg.finalize!
arr_cfg.finalize!
expect(cfg.only_on).to be_a(Array)
expect(arr_cfg.only_on).to be_a(Array)
end
it "ensures ignore is an array of symbols" do
cfg.finalize!
arr_cfg.finalize!
expect(cfg.ignore).to be_a(Array)
expect(arr_cfg.ignore).to be_a(Array)
cfg.ignore.each do |a|
expect(a).to be_a(Symbol)
end
arr_cfg.ignore.each do |a|
expect(a).to be_a(Symbol)
end
end
it "ensures ruby is a proc" do
cfg.finalize!
expect(cfg.ruby_block).to be_a(Proc)
end
it "converts aborts true to exit code 0" do
cfg.finalize!
expect(cfg.abort).to eq(1)
end
end
describe "defining a basic trigger config" do
let(:cmd) { :up }
let(:cfg) { described_class.new(cmd) }
before do
cfg.info = "Hello there"
cfg.warn = "Warning!!"
cfg.on_error = :continue
cfg.ignore = :up
cfg.abort = 3
cfg.only_on = "guest"
cfg.ruby = proc{ var = 1+1 }
cfg.run = {inline: "apt-get update"}
cfg.run_remote = {inline: "apt-get update", env: {"VAR"=>"VAL"}}
end
it "sets the options" do
cfg.finalize!
expect(cfg.info).to eq("Hello there")
expect(cfg.warn).to eq("Warning!!")
expect(cfg.on_error).to eq(:continue)
expect(cfg.ignore).to eq([:up])
expect(cfg.only_on).to eq(["guest"])
expect(cfg.run).to be_a(VagrantPlugins::Shell::Config)
expect(cfg.run_remote).to be_a(VagrantPlugins::Shell::Config)
expect(cfg.abort).to eq(3)
expect(cfg.ruby_block).to be_a(Proc)
end
end
end