Skip to content

Commit

Permalink
New Unit Tests for testing the new CookbookLoader behavior.
Browse files Browse the repository at this point in the history
  • Loading branch information
zuazo authored and btm committed Sep 19, 2012
1 parent 70c019f commit ad1b238
Show file tree
Hide file tree
Showing 2 changed files with 181 additions and 91 deletions.
230 changes: 141 additions & 89 deletions chef/spec/unit/cookbook_loader_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -25,120 +25,172 @@
@cookbook_loader = Chef::CookbookLoader.new(@repo_paths)
end

describe "[]" do
it "should return cookbook objects with []" do
@cookbook_loader[:openldap].should be_a_kind_of(Chef::CookbookVersion)
describe "loading all cookbooks" do
before(:each) do
@cookbook_loader.load_cookbooks
end

describe "[]" do
it "should return cookbook objects with []" do
@cookbook_loader[:openldap].should be_a_kind_of(Chef::CookbookVersion)
end

it "should raise an exception if it cannot find a cookbook with []" do
lambda { @cookbook_loader[:monkeypoop] }.should raise_error(Chef::Exceptions::CookbookNotFoundInRepo)
end

it "should allow you to look up available cookbooks with [] and a symbol" do
@cookbook_loader[:openldap].name.should eql(:openldap)
end
it "should raise an exception if it cannot find a cookbook with []" do
lambda { @cookbook_loader[:monkeypoop] }.should raise_error(Chef::Exceptions::CookbookNotFoundInRepo)
end

it "should allow you to look up available cookbooks with [] and a string" do
@cookbook_loader["openldap"].name.should eql(:openldap)
end
end
it "should allow you to look up available cookbooks with [] and a symbol" do
@cookbook_loader[:openldap].name.should eql(:openldap)
end

describe "each" do
it "should allow you to iterate over cookbooks with each" do
seen = Hash.new
@cookbook_loader.each do |cookbook_name, cookbook|
seen[cookbook_name] = true
it "should allow you to look up available cookbooks with [] and a string" do
@cookbook_loader["openldap"].name.should eql(:openldap)
end
seen.should have_key("openldap")
seen.should have_key("apache2")
end

it "should iterate in alphabetical order" do
seen = Array.new
@cookbook_loader.each do |cookbook_name, cookbook|
seen << cookbook_name
describe "each" do
it "should allow you to iterate over cookbooks with each" do
seen = Hash.new
@cookbook_loader.each do |cookbook_name, cookbook|
seen[cookbook_name] = true
end
seen.should have_key("openldap")
seen.should have_key("apache2")
end
seen[0].should == "apache2"
seen[1].should == "borken"
seen[2].should == "java"
seen[3].should == "openldap"
end
end

describe "load_cookbooks" do
it "should find all the cookbooks in the cookbook path" do
Chef::Config.cookbook_path << File.expand_path(File.join(CHEF_SPEC_DATA, "hidden-cookbooks"))
@cookbook_loader.load_cookbooks
@cookbook_loader.should have_key(:openldap)
@cookbook_loader.should have_key(:apache2)
it "should iterate in alphabetical order" do
seen = Array.new
@cookbook_loader.each do |cookbook_name, cookbook|
seen << cookbook_name
end
seen[0].should == "apache2"
seen[1].should == "borken"
seen[2].should == "java"
seen[3].should == "openldap"
end
end

it "should allow you to override an attribute file via cookbook_path" do
@cookbook_loader[:openldap].attribute_filenames.detect { |f|
f =~ /cookbooks\/openldap\/attributes\/default.rb/
}.should_not eql(nil)
@cookbook_loader[:openldap].attribute_filenames.detect { |f|
f =~ /kitchen\/openldap\/attributes\/default.rb/
}.should eql(nil)

describe "load_cookbooks" do
it "should find all the cookbooks in the cookbook path" do
Chef::Config.cookbook_path << File.expand_path(File.join(CHEF_SPEC_DATA, "hidden-cookbooks"))
@cookbook_loader.load_cookbooks
@cookbook_loader.should have_key(:openldap)
@cookbook_loader.should have_key(:apache2)
end

it "should allow you to override an attribute file via cookbook_path" do
@cookbook_loader[:openldap].attribute_filenames.detect { |f|
f =~ /cookbooks\/openldap\/attributes\/default.rb/
}.should_not eql(nil)
@cookbook_loader[:openldap].attribute_filenames.detect { |f|
f =~ /kitchen\/openldap\/attributes\/default.rb/
}.should eql(nil)
end

it "should load different attribute files from deeper paths" do
@cookbook_loader[:openldap].attribute_filenames.detect { |f|
f =~ /kitchen\/openldap\/attributes\/robinson.rb/
}.should_not eql(nil)
end

it "should allow you to override a definition file via cookbook_path" do
@cookbook_loader[:openldap].definition_filenames.detect { |f|
f =~ /cookbooks\/openldap\/definitions\/client.rb/
}.should_not eql(nil)
@cookbook_loader[:openldap].definition_filenames.detect { |f|
f =~ /kitchen\/openldap\/definitions\/client.rb/
}.should eql(nil)
end

it "should load definition files from deeper paths" do
@cookbook_loader[:openldap].definition_filenames.detect { |f|
f =~ /kitchen\/openldap\/definitions\/drewbarrymore.rb/
}.should_not eql(nil)
end

it "should allow you to override a recipe file via cookbook_path" do
@cookbook_loader[:openldap].recipe_filenames.detect { |f|
f =~ /cookbooks\/openldap\/recipes\/gigantor.rb/
}.should_not eql(nil)
@cookbook_loader[:openldap].recipe_filenames.detect { |f|
f =~ /kitchen\/openldap\/recipes\/gigantor.rb/
}.should eql(nil)
end

it "should load recipe files from deeper paths" do
@cookbook_loader[:openldap].recipe_filenames.detect { |f|
f =~ /kitchen\/openldap\/recipes\/woot.rb/
}.should_not eql(nil)
end

it "should allow you to have an 'ignore' file, which skips loading files in later cookbooks" do
@cookbook_loader[:openldap].recipe_filenames.detect { |f|
f =~ /kitchen\/openldap\/recipes\/ignoreme.rb/
}.should eql(nil)
end

it "should find files that start with a ." do
@cookbook_loader[:openldap].file_filenames.detect { |f|
f =~ /\.dotfile$/
}.should =~ /\.dotfile$/
@cookbook_loader[:openldap].file_filenames.detect { |f|
f =~ /\.ssh\/id_rsa$/
}.should =~ /\.ssh\/id_rsa$/
end

it "should load the metadata for the cookbook" do
@cookbook_loader.metadata[:openldap].name.should == :openldap
@cookbook_loader.metadata[:openldap].should be_a_kind_of(Chef::Cookbook::Metadata)
end

end

it "should load different attribute files from deeper paths" do
@cookbook_loader[:openldap].attribute_filenames.detect { |f|
f =~ /kitchen\/openldap\/attributes\/robinson.rb/
}.should_not eql(nil)
end
end

it "should allow you to override a definition file via cookbook_path" do
@cookbook_loader[:openldap].definition_filenames.detect { |f|
f =~ /cookbooks\/openldap\/definitions\/client.rb/
}.should_not eql(nil)
@cookbook_loader[:openldap].definition_filenames.detect { |f|
f =~ /kitchen\/openldap\/definitions\/client.rb/
}.should eql(nil)
describe "loading only one cookbook" do
before(:each) do
@cookbook_loader = Chef::CookbookLoader.new(@repo_paths)
@cookbook_loader.load_cookbook("openldap")
end

it "should load definition files from deeper paths" do
@cookbook_loader[:openldap].definition_filenames.detect { |f|
f =~ /kitchen\/openldap\/definitions\/drewbarrymore.rb/
}.should_not eql(nil)
it "should have loaded the correct cookbook" do
seen = Hash.new
@cookbook_loader.each do |cookbook_name, cookbook|
seen[cookbook_name] = true
end
seen.should have_key("openldap")
end

it "should allow you to override a recipe file via cookbook_path" do
@cookbook_loader[:openldap].recipe_filenames.detect { |f|
f =~ /cookbooks\/openldap\/recipes\/gigantor.rb/
}.should_not eql(nil)
@cookbook_loader[:openldap].recipe_filenames.detect { |f|
f =~ /kitchen\/openldap\/recipes\/gigantor.rb/
}.should eql(nil)
it "should not load the cookbook again when accessed" do
@cookbook_loader.should_not_receive('load_cookbook')
@cookbook_loader["openldap"]
end

it "should load recipe files from deeper paths" do
@cookbook_loader[:openldap].recipe_filenames.detect { |f|
f =~ /kitchen\/openldap\/recipes\/woot.rb/
}.should_not eql(nil)
it "should not load the other cookbooks" do
seen = Hash.new
@cookbook_loader.each do |cookbook_name, cookbook|
seen[cookbook_name] = true
end
seen.should_not have_key("apache2")
end

it "should allow you to have an 'ignore' file, which skips loading files in later cookbooks" do
@cookbook_loader[:openldap].recipe_filenames.detect { |f|
f =~ /kitchen\/openldap\/recipes\/ignoreme.rb/
}.should eql(nil)
it "should load another cookbook lazily with []" do
@cookbook_loader["apache2"].should be_a_kind_of(Chef::CookbookVersion)
end

it "should find files that start with a ." do
@cookbook_loader[:openldap].file_filenames.detect { |f|
f =~ /\.dotfile$/
}.should =~ /\.dotfile$/
@cookbook_loader[:openldap].file_filenames.detect { |f|
f =~ /\.ssh\/id_rsa$/
}.should =~ /\.ssh\/id_rsa$/
end
describe "loading all cookbooks after loading only one cookbook" do
before(:each) do
@cookbook_loader.load_cookbooks
end

it "should load the metadata for the cookbook" do
@cookbook_loader.metadata[:openldap].name.should == :openldap
@cookbook_loader.metadata[:openldap].should be_a_kind_of(Chef::Cookbook::Metadata)
it "should load all cookbooks" do
seen = Hash.new
@cookbook_loader.each do |cookbook_name, cookbook|
seen[cookbook_name] = true
end
seen.should have_key("openldap")
seen.should have_key("apache2")
end
end

end

end
42 changes: 40 additions & 2 deletions chef/spec/unit/knife/cookbook_upload_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,44 @@
end
end

describe 'when specifying the same cookbook name twice' do
it 'should upload the cookbook only once' do
@knife.name_args = ['test_cookbook', 'test_cookbook']
@knife.should_receive(:upload).once
@knife.run
end
end

describe 'when specifying a cookbook name among many' do
before(:each) do
@knife.name_args = ['test_cookbook1']
@cookbooks = {
'test_cookbook1' => Chef::CookbookVersion.new('test_cookbook1'),
'test_cookbook2' => Chef::CookbookVersion.new('test_cookbook2'),
'test_cookbook3' => Chef::CookbookVersion.new('test_cookbook3')
}
@cookbook_loader = {}
@cookbook_loader.stub!(:merged_cookbooks).and_return([])
@cookbook_loader.stub(:[]) { |ckbk| @cookbooks[ckbk] }
Chef::CookbookLoader.stub!(:new).and_return(@cookbook_loader)
end

it "should read only one cookbook" do
@cookbook_loader.should_receive(:[]).once.with('test_cookbook1')
@knife.run
end

it "should not read all cookbooks" do
@cookbook_loader.should_not_receive(:load_cookbooks)
@knife.run
end

it "should upload only one cookbook" do
@knife.should_receive(:upload).exactly(1).times
@knife.run
end
end

# This is testing too much. We should break it up.
describe 'when specifying a cookbook name with dependencies' do
it "should upload all dependencies once" do
Expand Down Expand Up @@ -141,5 +179,5 @@
lambda { @knife.run }.should raise_error(SystemExit)
end
end
end
end # run
end # run
end # Chef::Knife::CookbookUpload

0 comments on commit ad1b238

Please sign in to comment.