summaryrefslogtreecommitdiff
path: root/spec/unit/policy_builder/expand_node_object_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/unit/policy_builder/expand_node_object_spec.rb')
-rw-r--r--spec/unit/policy_builder/expand_node_object_spec.rb336
1 files changed, 0 insertions, 336 deletions
diff --git a/spec/unit/policy_builder/expand_node_object_spec.rb b/spec/unit/policy_builder/expand_node_object_spec.rb
deleted file mode 100644
index a1e0b881d5..0000000000
--- a/spec/unit/policy_builder/expand_node_object_spec.rb
+++ /dev/null
@@ -1,336 +0,0 @@
-#
-# Author:: Daniel DeLeo (<dan@getchef.com>)
-# Copyright:: Copyright 2014 Chef Software, 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/policy_builder'
-
-describe Chef::PolicyBuilder::ExpandNodeObject do
-
- let(:node_name) { "joe_node" }
- let(:ohai_data) { {"platform" => "ubuntu", "platform_version" => "13.04", "fqdn" => "joenode.example.com"} }
- let(:json_attribs) { {"run_list" => []} }
- let(:override_runlist) { "recipe[foo::default]" }
- let(:events) { Chef::EventDispatch::Dispatcher.new }
- let(:policy_builder) { Chef::PolicyBuilder::ExpandNodeObject.new(node_name, ohai_data, json_attribs, override_runlist, events) }
-
- # All methods that Chef::Client calls on this class.
- describe "Public API" do
- it "implements a node method" do
- expect(policy_builder).to respond_to(:node)
- end
-
- it "implements a load_node method" do
- expect(policy_builder).to respond_to(:load_node)
- end
-
- it "implements a build_node method" do
- expect(policy_builder).to respond_to(:build_node)
- end
-
- it "implements a setup_run_context method that accepts a list of recipe files to run" do
- expect(policy_builder).to respond_to(:setup_run_context)
- expect(policy_builder.method(:setup_run_context).arity).to eq(-1) #optional argument
- end
-
- it "implements a run_context method" do
- expect(policy_builder).to respond_to(:run_context)
- end
-
- it "implements an expand_run_list method" do
- expect(policy_builder).to respond_to(:expand_run_list)
- end
-
- it "implements a sync_cookbooks method" do
- expect(policy_builder).to respond_to(:sync_cookbooks)
- end
-
- it "implements a temporary_policy? method" do
- expect(policy_builder).to respond_to(:temporary_policy?)
- end
-
- describe "loading the node" do
-
- context "on chef-solo" do
-
- before do
- Chef::Config[:solo] = true
- end
-
- it "creates a new in-memory node object with the given name" do
- policy_builder.load_node
- policy_builder.node.name.should == node_name
- end
-
- end
-
- context "on chef-client" do
-
- let(:node) { Chef::Node.new.tap { |n| n.name(node_name) } }
-
- it "loads or creates a node on the server" do
- Chef::Node.should_receive(:find_or_create).with(node_name).and_return(node)
- policy_builder.load_node
- policy_builder.node.should == node
- end
-
- end
- end
-
- describe "building the node" do
-
- # XXX: Chef::Client just needs to be able to call this, it doesn't depend on the return value.
- it "builds the node and returns the updated node object" do
- pending
- end
-
- end
-
- end
-
- # Implementation specific tests
-
- describe "when first created" do
-
- it "has a node_name" do
- expect(policy_builder.node_name).to eq(node_name)
- end
-
- it "has ohai data" do
- expect(policy_builder.ohai_data).to eq(ohai_data)
- end
-
- it "has a set of attributes from command line option" do
- expect(policy_builder.json_attribs).to eq(json_attribs)
- end
-
- it "has an override_runlist" do
- expect(policy_builder.override_runlist).to eq(override_runlist)
- end
-
- end
-
- context "once the node has been loaded" do
- let(:node) do
- node = Chef::Node.new
- node.name(node_name)
- node.run_list(["recipe[a::default]", "recipe[b::server]"])
- node
- end
-
- before do
- Chef::Node.should_receive(:find_or_create).with(node_name).and_return(node)
- policy_builder.load_node
- end
-
- it "expands the run_list" do
- expect(policy_builder.expand_run_list).to be_a(Chef::RunList::RunListExpansion)
- expect(policy_builder.run_list_expansion).to be_a(Chef::RunList::RunListExpansion)
- expect(policy_builder.run_list_expansion.recipes).to eq(["a::default", "b::server"])
- end
-
- end
-
- describe "building the node" do
-
- let(:configured_environment) { nil }
- let(:json_attribs) { nil }
-
- let(:override_runlist) { nil }
- let(:primary_runlist) { ["recipe[primary::default]"] }
-
- let(:original_default_attrs) { {"default_key" => "default_value"} }
- let(:original_override_attrs) { {"override_key" => "override_value"} }
-
- let(:node) do
- node = Chef::Node.new
- node.name(node_name)
- node.default_attrs = original_default_attrs
- node.override_attrs = original_override_attrs
- node.run_list(primary_runlist)
- node
- end
-
- before do
- Chef::Config[:environment] = configured_environment
- Chef::Node.should_receive(:find_or_create).with(node_name).and_return(node)
- policy_builder.load_node
- policy_builder.build_node
- end
-
- it "sanity checks test setup" do
- expect(node.run_list).to eq(primary_runlist)
- end
-
- it "clears existing default and override attributes from the node" do
- expect(node["default_key"]).to be_nil
- expect(node["override_key"]).to be_nil
- end
-
- it "applies ohai data to the node" do
- expect(node["fqdn"]).to eq(ohai_data["fqdn"])
- end
-
- it "reports that a temporary_policy is not being used" do
- expect(policy_builder.temporary_policy?).to be_false
- end
-
- describe "when the given run list is not in expanded form" do
-
- # NOTE: for chef-client, the behavior is always to expand the run list,
- # but this operation is a no-op when none of the run list items are
- # roles. Because of the amount of mocking required to make this work in
- # tests, this test is isolated from the others.
-
- let(:primary_runlist) { ["role[some_role]"] }
- let(:expansion) do
- recipe_list = Chef::RunList::VersionedRecipeList.new
- recipe_list.add_recipe("recipe[from_role::default", "1.0.2")
- double("RunListExpansion", :recipes => recipe_list)
- end
-
- let(:node) do
- node = Chef::Node.new
- node.name(node_name)
- node.default_attrs = original_default_attrs
- node.override_attrs = original_override_attrs
- node.run_list(primary_runlist)
-
- node.should_receive(:expand!).with("server") do
- node.run_list("recipe[from_role::default]")
- expansion
- end
-
- node
- end
-
- it "expands run list items via the server API" do
- expect(node.run_list).to eq(["recipe[from_role::default]"])
- end
-
- end
-
- context "when JSON attributes are given on the command line" do
-
- let(:json_attribs) { {"run_list" => ["recipe[json_attribs::default]"], "json_attribs_key" => "json_attribs_value" } }
-
- it "sets the run list according to the given JSON" do
- expect(node.run_list).to eq(["recipe[json_attribs::default]"])
- end
-
- it "sets node attributes according to the given JSON" do
- expect(node["json_attribs_key"]).to eq("json_attribs_value")
- end
-
- end
-
- context "when an override_runlist is given" do
-
- let(:override_runlist) { "recipe[foo::default]" }
-
- it "sets the override run_list on the node" do
- expect(node.run_list).to eq([override_runlist])
- expect(node.primary_runlist).to eq(primary_runlist)
- end
-
- it "reports that a temporary policy is being used" do
- expect(policy_builder.temporary_policy?).to be_true
- end
-
- end
-
- context "when no environment is specified" do
-
- it "does not set the environment" do
- expect(node.chef_environment).to eq("_default")
- end
-
- end
-
- context "when a custom environment is configured" do
-
- let(:configured_environment) { environment.name }
-
- let(:environment) do
- environment = Chef::Environment.new.tap {|e| e.name("prod") }
- Chef::Environment.should_receive(:load).with("prod").and_return(environment)
- environment
- end
-
- it "sets the environment as configured" do
- expect(node.chef_environment).to eq(environment.name)
- end
- end
-
- end
-
- describe "configuring the run_context" do
- let(:json_attribs) { nil }
- let(:override_runlist) { nil }
-
- let(:node) do
- node = Chef::Node.new
- node.name(node_name)
- node.run_list("recipe[first::default]", "recipe[second::default]")
- node
- end
-
- let(:chef_http) { double("Chef::REST") }
-
- let(:cookbook_resolve_url) { "environments/#{node.chef_environment}/cookbook_versions" }
- let(:cookbook_resolve_post_data) { {:run_list=>["first::default", "second::default"]} }
-
- # cookbook_hash is just a hash, but since we're passing it between mock
- # objects, we get a little better test strictness by using a double (which
- # will have object equality rather than semantic equality #== semantics).
- let(:cookbook_hash) { double("cookbook hash", :each => nil) }
-
- let(:cookbook_synchronizer) { double("CookbookSynchronizer") }
-
- before do
- Chef::Node.should_receive(:find_or_create).with(node_name).and_return(node)
-
- policy_builder.stub(:api_service).and_return(chef_http)
-
- policy_builder.load_node
- policy_builder.build_node
-
- run_list_expansion = policy_builder.run_list_expansion
-
- chef_http.should_receive(:post).with(cookbook_resolve_url, cookbook_resolve_post_data).and_return(cookbook_hash)
- Chef::CookbookSynchronizer.should_receive(:new).with(cookbook_hash, events).and_return(cookbook_synchronizer)
- cookbook_synchronizer.should_receive(:sync_cookbooks)
-
- Chef::RunContext.any_instance.should_receive(:load).with(run_list_expansion)
-
- policy_builder.setup_run_context
- end
-
- it "configures FileVendor to fetch files remotely" do
- manifest = double("cookbook manifest")
- Chef::Cookbook::RemoteFileVendor.should_receive(:new).with(manifest, chef_http)
- Chef::Cookbook::FileVendor.create_from_manifest(manifest)
- end
-
- it "triggers cookbook compilation in the run_context" do
- # Test condition already covered by `Chef::RunContext.any_instance.should_receive(:load).with(run_list_expansion)`
- end
-
- end
-
-end
-