summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordanielsdeleo <dan@getchef.com>2015-02-09 16:31:37 -0800
committerdanielsdeleo <dan@getchef.com>2015-02-09 16:31:37 -0800
commit6114088c9591bf3a77ea9ef2682941e63fc5e95a (patch)
tree33c385a4ce5724eb0b64c564c56f77a4743c95c2
parent7b87eca83e270f6ea8cbbecefac85cae28a6f8ec (diff)
downloadchef-6114088c9591bf3a77ea9ef2682941e63fc5e95a.tar.gz
Test cookbook manifest behavior separately
-rw-r--r--spec/unit/cookbook_manifest_spec.rb197
-rw-r--r--spec/unit/cookbook_version_spec.rb191
2 files changed, 197 insertions, 191 deletions
diff --git a/spec/unit/cookbook_manifest_spec.rb b/spec/unit/cookbook_manifest_spec.rb
new file mode 100644
index 0000000000..8f9c9810d4
--- /dev/null
+++ b/spec/unit/cookbook_manifest_spec.rb
@@ -0,0 +1,197 @@
+#
+# Author:: Daniel DeLeo (<dan@chef.io>)
+# Copyright:: Copyright (c) 2015 Opscode, Inc.
+# License:: Apache License, Version 2.0
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+require 'spec_helper'
+require 'chef/cookbook_manifest'
+require 'chef/digester'
+require 'pathname'
+
+describe Chef::CookbookManifest do
+
+ let(:version) { "1.2.3" }
+
+ let(:metadata) do
+ Chef::Cookbook::Metadata.new.tap do |m|
+ m.version(version)
+ end
+ end
+
+ let(:cookbook_root) { '/tmp/blah' }
+
+ let(:cookbook_version) do
+ Chef::CookbookVersion.new("tatft", cookbook_root).tap do |c|
+ c.metadata = metadata
+ end
+ end
+
+ subject(:cookbook_manifest) { Chef::CookbookManifest.new(cookbook_version) }
+
+ describe "collecting cookbook data from the cookbook version object" do
+
+ it "delegates `name' to cookbook_version" do
+ expect(cookbook_manifest.name).to eq("tatft")
+ end
+
+ it "delegates `root_paths' to cookbook_version" do
+ expect(cookbook_manifest.root_paths).to eq(['/tmp/blah'])
+ end
+
+ it "delegates `metadata' to cookbook_version" do
+ expect(cookbook_manifest.metadata).to eq(metadata)
+ end
+
+ it "delegates `full_name' to cookbook_version" do
+ expect(cookbook_manifest.full_name).to eq("tatft-1.2.3")
+ end
+
+ it "delegates `version' to cookbook_version" do
+ expect(cookbook_manifest.version).to eq(version)
+ end
+
+ it "delegates `frozen_version?' to cookbook_version" do
+ expect(cookbook_manifest.frozen_version?).to be(false)
+ end
+
+ it "delegates `segment_filenames' to cookbook_version" do
+ expect(cookbook_version).to receive(:segment_filenames).with(:recipes).and_return([])
+ expect(cookbook_manifest.segment_filenames(:recipes)).to eq([])
+ end
+
+ end
+
+ context "when given an empty cookbook" do
+
+ let(:expected_hash) do
+ {
+ "chef_type" => "cookbook_version",
+
+ "name" => "tatft-1.2.3",
+ "version" => "1.2.3",
+ "cookbook_name" => "tatft",
+ "metadata" => metadata,
+
+ "frozen?" => false,
+
+ "recipes" =>[],
+ "definitions" =>[],
+ "libraries" =>[],
+ "attributes" =>[],
+ "files" =>[],
+ "templates" =>[],
+ "resources" =>[],
+ "providers" =>[],
+ "root_files" =>[],
+ }
+ end
+
+ it "converts the CookbookVersion to a ruby Hash representation" do
+ expect(cookbook_manifest.to_hash).to eq(expected_hash)
+ end
+
+ end
+
+ context "when given a cookbook with files" do
+
+ let(:cookbook_root) { File.join(CHEF_SPEC_DATA, 'cb_version_cookbooks', 'tatft') }
+
+ let(:attribute_filenames) { Dir[File.join(cookbook_root, 'attributes', '**', '*.rb')] }
+ let(:definition_filenames) { Dir[File.join(cookbook_root, 'definitions', '**', '*.rb')] }
+ let(:file_filenames) { Dir[File.join(cookbook_root, 'files', '**', '*.tgz')] }
+ let(:recipe_filenames) { Dir[File.join(cookbook_root, 'recipes', '**', '*.rb')] }
+ let(:template_filenames) { Dir[File.join(cookbook_root, 'templates', '**', '*.erb')] }
+ let(:library_filenames) { Dir[File.join(cookbook_root, 'libraries', '**', '*.rb')] }
+ let(:resource_filenames) { Dir[File.join(cookbook_root, 'resources', '**', '*.rb')] }
+ let(:provider_filenames) { Dir[File.join(cookbook_root, 'providers', '**', '*.rb')] }
+ let(:root_filenames) { Array(File.join(cookbook_root, 'README.rdoc')) }
+ let(:metadata_filenames) { Array(File.join(cookbook_root, 'metadata.json')) }
+
+ let(:match_md5) { /[0-9a-f]{32}/ }
+
+ def map_to_file_specs(paths)
+ paths.map do |path|
+
+ relative_path = Pathname.new(path).relative_path_from(Pathname.new(cookbook_root)).to_s
+
+ {
+ "name" => File.basename(path),
+ "path" => relative_path,
+ "checksum" => Chef::Digester.generate_md5_checksum_for_file(path),
+ "specificity" => "default",
+ }
+ end
+ end
+
+ let(:expected_hash) do
+ {
+ "chef_type" => "cookbook_version",
+
+ "name" => "tatft-1.2.3",
+ "version" => "1.2.3",
+ "cookbook_name" => "tatft",
+ "metadata" => metadata,
+
+ "frozen?" => false,
+
+ "recipes" => map_to_file_specs(recipe_filenames),
+ "definitions" => map_to_file_specs(definition_filenames),
+ "libraries" => map_to_file_specs(library_filenames),
+ "attributes" => map_to_file_specs(attribute_filenames),
+ "files" => map_to_file_specs(file_filenames),
+ "templates" => map_to_file_specs(template_filenames),
+ "resources" => map_to_file_specs(resource_filenames),
+ "providers" => map_to_file_specs(provider_filenames),
+ "root_files" => map_to_file_specs(root_filenames),
+ }
+ end
+ before do
+ cookbook_version.attribute_filenames = attribute_filenames
+ cookbook_version.definition_filenames = definition_filenames
+ cookbook_version.file_filenames = file_filenames
+ cookbook_version.recipe_filenames = recipe_filenames
+ cookbook_version.template_filenames = template_filenames
+ cookbook_version.library_filenames = library_filenames
+ cookbook_version.resource_filenames = resource_filenames
+ cookbook_version.provider_filenames = provider_filenames
+ cookbook_version.root_filenames = root_filenames
+ cookbook_version.metadata_filenames = metadata_filenames
+ end
+
+ it "converts the CookbookVersion to a ruby Hash representation" do
+ cookbook_manifest_hash = cookbook_manifest.to_hash
+
+ expect(cookbook_manifest_hash.keys).to match_array(expected_hash.keys)
+ cookbook_manifest_hash.each do |key, value|
+ expect(cookbook_manifest_hash[key]).to eq(expected_hash[key])
+ end
+ end
+
+ end
+
+ describe "providing upstream URLs for save" do
+
+ it "gives the save URL" do
+ expect(cookbook_manifest.save_url).to eq("cookbooks/tatft/1.2.3")
+ end
+
+ it "gives the force save URL" do
+ expect(cookbook_manifest.force_save_url).to eq("cookbooks/tatft/1.2.3?force=true")
+ end
+
+ end
+
+end
+
diff --git a/spec/unit/cookbook_version_spec.rb b/spec/unit/cookbook_version_spec.rb
index 7ae6be1b2b..d806153bc9 100644
--- a/spec/unit/cookbook_version_spec.rb
+++ b/spec/unit/cookbook_version_spec.rb
@@ -72,22 +72,6 @@ describe Chef::CookbookVersion do
expect(@cookbook_version.metadata).to eq(Chef::Cookbook::Metadata.new)
end
- it "creates a manifest hash of its contents" do
- expected = {"recipes"=>[],
- "definitions"=>[],
- "libraries"=>[],
- "attributes"=>[],
- "files"=>[],
- "templates"=>[],
- "resources"=>[],
- "providers"=>[],
- "root_files"=>[],
- "cookbook_name"=>"tatft",
- "metadata"=>Chef::Cookbook::Metadata.new,
- "version"=>"0.0.0",
- "name"=>"tatft-0.0.0"}
- expect(@cookbook_version.manifest).to eq(expected)
- end
end
describe "with a cookbook directory named tatft" do
@@ -135,85 +119,6 @@ describe Chef::CookbookVersion do
@node.name("testing")
end
- it "generates a manifest containing the cookbook's files" do
- manifest = @cookbook_version.manifest
-
- expect(manifest["metadata"]).to eq(Chef::Cookbook::Metadata.new)
- expect(manifest["cookbook_name"]).to eq("tatft")
-
- expect(manifest["recipes"].size).to eq(1)
-
- recipe = manifest["recipes"].first
- expect(recipe["name"]).to eq("default.rb")
- expect(recipe["path"]).to eq("recipes/default.rb")
- expect(recipe["checksum"]).to match(MD5)
- expect(recipe["specificity"]).to eq("default")
-
- expect(manifest["definitions"].size).to eq(1)
-
- definition = manifest["definitions"].first
- expect(definition["name"]).to eq("runit_service.rb")
- expect(definition["path"]).to eq("definitions/runit_service.rb")
- expect(definition["checksum"]).to match(MD5)
- expect(definition["specificity"]).to eq("default")
-
- expect(manifest["libraries"].size).to eq(1)
-
- library = manifest["libraries"].first
- expect(library["name"]).to eq("ownage.rb")
- expect(library["path"]).to eq("libraries/ownage.rb")
- expect(library["checksum"]).to match(MD5)
- expect(library["specificity"]).to eq("default")
-
- expect(manifest["attributes"].size).to eq(1)
-
- attribute_file = manifest["attributes"].first
- expect(attribute_file["name"]).to eq("default.rb")
- expect(attribute_file["path"]).to eq("attributes/default.rb")
- expect(attribute_file["checksum"]).to match(MD5)
- expect(attribute_file["specificity"]).to eq("default")
-
- expect(manifest["files"].size).to eq(1)
-
- cookbook_file = manifest["files"].first
- expect(cookbook_file["name"]).to eq("giant_blob.tgz")
- expect(cookbook_file["path"]).to eq("files/default/giant_blob.tgz")
- expect(cookbook_file["checksum"]).to match(MD5)
- expect(cookbook_file["specificity"]).to eq("default")
-
- expect(manifest["templates"].size).to eq(1)
-
- template = manifest["templates"].first
- expect(template["name"]).to eq("configuration.erb")
- expect(template["path"]).to eq("templates/default/configuration.erb")
- expect(template["checksum"]).to match(MD5)
- expect(template["specificity"]).to eq("default")
-
- expect(manifest["resources"].size).to eq(1)
-
- lwr = manifest["resources"].first
- expect(lwr["name"]).to eq("lwr.rb")
- expect(lwr["path"]).to eq("resources/lwr.rb")
- expect(lwr["checksum"]).to match(MD5)
- expect(lwr["specificity"]).to eq("default")
-
- expect(manifest["providers"].size).to eq(1)
-
- lwp = manifest["providers"].first
- expect(lwp["name"]).to eq("lwp.rb")
- expect(lwp["path"]).to eq("providers/lwp.rb")
- expect(lwp["checksum"]).to match(MD5)
- expect(lwp["specificity"]).to eq("default")
-
- expect(manifest["root_files"].size).to eq(1)
-
- readme = manifest["root_files"].first
- expect(readme["name"]).to eq("README.rdoc")
- expect(readme["path"]).to eq("README.rdoc")
- expect(readme["checksum"]).to match(MD5)
- expect(readme["specificity"]).to eq("default")
- end
-
it "determines whether a template is available for a given node" do
expect(@cookbook_version).to have_template_for_node(@node, "configuration.erb")
expect(@cookbook_version).not_to have_template_for_node(@node, "missing.erb")
@@ -247,102 +152,6 @@ describe Chef::CookbookVersion do
end
end
- describe "and a cookbook_version with a different name" do
- before do
- # Currently the cookbook loader finds all the files then tells CookbookVersion
- # where they are.
- @cookbook_version = Chef::CookbookVersion.new("blarghle", @cookbook_root)
- @cookbook_version.attribute_filenames = @cookbook[:attribute_filenames]
- @cookbook_version.definition_filenames = @cookbook[:definition_filenames]
- @cookbook_version.recipe_filenames = @cookbook[:recipe_filenames]
- @cookbook_version.template_filenames = @cookbook[:template_filenames]
- @cookbook_version.file_filenames = @cookbook[:file_filenames]
- @cookbook_version.library_filenames = @cookbook[:library_filenames]
- @cookbook_version.resource_filenames = @cookbook[:resource_filenames]
- @cookbook_version.provider_filenames = @cookbook[:provider_filenames]
- @cookbook_version.root_filenames = @cookbook[:root_filenames]
- @cookbook_version.metadata_filenames = @cookbook[:metadata_filenames]
- end
-
- it "generates a manifest containing the cookbook's files" do
- manifest = @cookbook_version.manifest
-
- expect(manifest["metadata"]).to eq(Chef::Cookbook::Metadata.new)
- expect(manifest["cookbook_name"]).to eq("blarghle")
-
- expect(manifest["recipes"].size).to eq(1)
-
- recipe = manifest["recipes"].first
- expect(recipe["name"]).to eq("default.rb")
- expect(recipe["path"]).to eq("recipes/default.rb")
- expect(recipe["checksum"]).to match(MD5)
- expect(recipe["specificity"]).to eq("default")
-
- expect(manifest["definitions"].size).to eq(1)
-
- definition = manifest["definitions"].first
- expect(definition["name"]).to eq("runit_service.rb")
- expect(definition["path"]).to eq("definitions/runit_service.rb")
- expect(definition["checksum"]).to match(MD5)
- expect(definition["specificity"]).to eq("default")
-
- expect(manifest["libraries"].size).to eq(1)
-
- library = manifest["libraries"].first
- expect(library["name"]).to eq("ownage.rb")
- expect(library["path"]).to eq("libraries/ownage.rb")
- expect(library["checksum"]).to match(MD5)
- expect(library["specificity"]).to eq("default")
-
- expect(manifest["attributes"].size).to eq(1)
-
- attribute_file = manifest["attributes"].first
- expect(attribute_file["name"]).to eq("default.rb")
- expect(attribute_file["path"]).to eq("attributes/default.rb")
- expect(attribute_file["checksum"]).to match(MD5)
- expect(attribute_file["specificity"]).to eq("default")
-
- expect(manifest["files"].size).to eq(1)
-
- cookbook_file = manifest["files"].first
- expect(cookbook_file["name"]).to eq("giant_blob.tgz")
- expect(cookbook_file["path"]).to eq("files/default/giant_blob.tgz")
- expect(cookbook_file["checksum"]).to match(MD5)
- expect(cookbook_file["specificity"]).to eq("default")
-
- expect(manifest["templates"].size).to eq(1)
-
- template = manifest["templates"].first
- expect(template["name"]).to eq("configuration.erb")
- expect(template["path"]).to eq("templates/default/configuration.erb")
- expect(template["checksum"]).to match(MD5)
- expect(template["specificity"]).to eq("default")
-
- expect(manifest["resources"].size).to eq(1)
-
- lwr = manifest["resources"].first
- expect(lwr["name"]).to eq("lwr.rb")
- expect(lwr["path"]).to eq("resources/lwr.rb")
- expect(lwr["checksum"]).to match(MD5)
- expect(lwr["specificity"]).to eq("default")
-
- expect(manifest["providers"].size).to eq(1)
-
- lwp = manifest["providers"].first
- expect(lwp["name"]).to eq("lwp.rb")
- expect(lwp["path"]).to eq("providers/lwp.rb")
- expect(lwp["checksum"]).to match(MD5)
- expect(lwp["specificity"]).to eq("default")
-
- expect(manifest["root_files"].size).to eq(1)
-
- readme = manifest["root_files"].first
- expect(readme["name"]).to eq("README.rdoc")
- expect(readme["path"]).to eq("README.rdoc")
- expect(readme["checksum"]).to match(MD5)
- expect(readme["specificity"]).to eq("default")
- end
- end
end
describe 'with a cookbook directory named cookbook2 that has unscoped files' do