diff options
author | danielsdeleo <dan@getchef.com> | 2015-02-09 16:31:37 -0800 |
---|---|---|
committer | danielsdeleo <dan@getchef.com> | 2015-02-11 10:52:49 -0800 |
commit | 20bc6b6e6faa8c3730eb59f3a999ec41ebb8a560 (patch) | |
tree | 9227328c200b2c4aa3f2af5433a1c23afc9bb6cf | |
parent | c2c723d9c418f5981a04ac7442dbe377ddb05a43 (diff) | |
download | chef-20bc6b6e6faa8c3730eb59f3a999ec41ebb8a560.tar.gz |
Test cookbook manifest behavior separately
-rw-r--r-- | spec/unit/cookbook_manifest_spec.rb | 197 | ||||
-rw-r--r-- | spec/unit/cookbook_version_spec.rb | 191 |
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 |