2011-12-03 15:44:08 -08:00

115 lines
3.7 KiB
Ruby

require "test_helper"
class ChefSoloProvisionerTest < Test::Unit::TestCase
setup do
@klass = Vagrant::Provisioners::ChefSolo
@action_env = Vagrant::Action::Environment.new(vagrant_env.vms[:default].env)
@config = @klass::Config.new
@action = @klass.new(@action_env, @config)
@env = @action.env
@vm = @action.vm
end
context "config validation" do
setup do
@errors = Vagrant::Config::ErrorRecorder.new
@config.run_list = ["foo"]
@config.cookbooks_path = "cookbooks"
end
should "be invalid if run list is empty" do
@config.run_list = []
@config.validate(@errors)
assert !@errors.errors.empty?
end
should "be invalid if cookbooks path is empty" do
@config.cookbooks_path = nil
@config.validate(@errors)
assert !@errors.errors.empty?
end
end
context "provisioning" do
should "run the proper sequence of methods in order" do
prov_seq = sequence("prov_seq")
@action.expects(:verify_binary).with("chef-solo").once.in_sequence(prov_seq)
@action.expects(:chown_provisioning_folder).once.in_sequence(prov_seq)
@action.expects(:setup_json).once.in_sequence(prov_seq)
@action.expects(:setup_solo_config).once.in_sequence(prov_seq)
@action.expects(:run_chef_solo).once.in_sequence(prov_seq)
@action.provision!
end
end
context "creating expanded folder sets" do
should "expand VM folders properly" do
assert_equal [[:vm, nil, "/foo"]], @action.expanded_folders([:vm, "/foo"])
end
should "expand host folders properly" do
path = "foo"
local_path = File.expand_path(path, @env.root_path)
remote_path = "#{@action.config.provisioning_path}/chef-solo-1"
assert_equal [[:host, local_path, remote_path]], @action.expanded_folders([:host, path])
end
should "share roles and cookbooks in different folders" do
local_roles_path = File.expand_path('roles',@env.root_path)
local_cookbooks_path = File.expand_path('cookbooks',@env.root_path)
remote_roles_path = @action.expanded_folders([:host,local_roles_path])[0][2]
remote_cookbooks_path = @action.expanded_folders([:host,local_cookbooks_path])[0][2]
assert_not_equal remote_roles_path, remote_cookbooks_path
end
end
context "guest paths" do
should "extract the parts properly" do
structure = [[1,2,3],[1,2,3]]
assert_equal [3,3], @action.guest_paths(structure)
end
end
context "generating and uploading chef solo configuration file" do
setup do
@vm.ssh.stubs(:upload!)
@config.recipe_url = "foo/bar/baz"
@action.prepare
end
should "call setup_config with proper variables" do
@action.expects(:setup_config).with("chef_solo_solo", "solo.rb", {
:node_name => @config.node_name,
:provisioning_path => @config.provisioning_path,
:cookbooks_path => @action.guest_paths(@action.cookbook_folders),
:recipe_url => @config.recipe_url,
:roles_path => @action.guest_paths(@action.role_folders).first,
:data_bags_path => @action.guest_paths(@action.data_bags_folders).first
})
@action.setup_solo_config
end
end
context "running chef solo" do
setup do
@ssh = mock("ssh")
@vm.ssh.stubs(:execute).yields(@ssh)
end
should "run chef solo" do
@ssh.expects(:sudo!).with("chef-solo -c #{@config.provisioning_path}/solo.rb -j #{@config.provisioning_path}/dna.json").once
@action.run_chef_solo
end
should "check the exit status if that is given" do
@ssh.stubs(:sudo!).yields(nil, :exit_status, :foo)
@ssh.expects(:check_exit_status).with(:foo, anything).once
@action.run_chef_solo
end
end
end