summaryrefslogtreecommitdiff
path: root/spec/unit/lwrp_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/unit/lwrp_spec.rb')
-rw-r--r--spec/unit/lwrp_spec.rb231
1 files changed, 231 insertions, 0 deletions
diff --git a/spec/unit/lwrp_spec.rb b/spec/unit/lwrp_spec.rb
new file mode 100644
index 0000000000..da2278e547
--- /dev/null
+++ b/spec/unit/lwrp_spec.rb
@@ -0,0 +1,231 @@
+#
+# Author:: Christopher Walters (<cw@opscode.com>)
+# Copyright:: Copyright (c) 2009 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'
+
+describe "override logging" do
+ before :each do
+ $stderr.stub!(:write)
+ end
+
+ it "should log if attempting to load resource of same name" do
+ Dir[File.expand_path(File.join(File.dirname(__FILE__), "..", "data", "lwrp", "resources", "*"))].each do |file|
+ Chef::Resource.build_from_file("lwrp", file, nil)
+ end
+
+ Dir[File.expand_path(File.join(File.dirname(__FILE__), "..", "data", "lwrp_override", "resources", "*"))].each do |file|
+ Chef::Log.should_receive(:info).with(/overriding/)
+ Chef::Resource.build_from_file("lwrp", file, nil)
+ end
+ end
+
+ it "should log if attempting to load provider of same name" do
+ Dir[File.expand_path(File.join(File.dirname(__FILE__), "..", "data", "lwrp", "providers", "*"))].each do |file|
+ Chef::Provider.build_from_file("lwrp", file, nil)
+ end
+
+ Dir[File.expand_path(File.join(File.dirname(__FILE__), "..", "data", "lwrp_override", "providers", "*"))].each do |file|
+ Chef::Log.should_receive(:info).with(/overriding/)
+ Chef::Provider.build_from_file("lwrp", file, nil)
+ end
+ end
+
+end
+
+describe "LWRP" do
+ before do
+ @original_VERBOSE = $VERBOSE
+ $VERBOSE = nil
+ end
+
+ after do
+ $VERBOSE = @original_VERBOSE
+ end
+
+ describe "Lightweight Chef::Resource" do
+
+ before do
+ Dir[File.expand_path(File.join(File.dirname(__FILE__), "..", "data", "lwrp", "resources", "*"))].each do |file|
+ Chef::Resource.build_from_file("lwrp", file, nil)
+ end
+
+ Dir[File.expand_path(File.join(File.dirname(__FILE__), "..", "data", "lwrp_override", "resources", "*"))].each do |file|
+ Chef::Resource.build_from_file("lwrp", file, nil)
+ end
+ end
+
+ it "should load the resource into a properly-named class" do
+ Chef::Resource.const_get("LwrpFoo").should be_kind_of(Class)
+ end
+
+ it "should set resource_name" do
+ Chef::Resource::LwrpFoo.new("blah").resource_name.should eql(:lwrp_foo)
+ end
+
+ it "should add the specified actions to the allowed_actions array" do
+ Chef::Resource::LwrpFoo.new("blah").allowed_actions.should include(:pass_buck, :twiddle_thumbs)
+ end
+
+ it "should set the specified action as the default action" do
+ Chef::Resource::LwrpFoo.new("blah").action.should == :pass_buck
+ end
+
+ it "should create a method for each attribute" do
+ Chef::Resource::LwrpFoo.new("blah").methods.map{ |m| m.to_sym}.should include(:monkey)
+ end
+
+ it "should build attribute methods that respect validation rules" do
+ lambda { Chef::Resource::LwrpFoo.new("blah").monkey(42) }.should raise_error(ArgumentError)
+ end
+
+ it "should have access to the run context and node during class definition" do
+ node = Chef::Node.new
+ node.normal[:penguin_name] = "jackass"
+ run_context = Chef::RunContext.new(node, Chef::CookbookCollection.new, @events)
+
+ Dir[File.expand_path(File.join(File.dirname(__FILE__), "..", "data", "lwrp", "resources_with_default_attributes", "*"))].each do |file|
+ Chef::Resource.build_from_file("lwrp", file, run_context)
+ end
+
+ cls = Chef::Resource.const_get("LwrpNodeattr")
+ cls.node.should be_kind_of(Chef::Node)
+ cls.run_context.should be_kind_of(Chef::RunContext)
+ cls.node[:penguin_name].should eql("jackass")
+ end
+
+ end
+
+ describe "Lightweight Chef::Provider" do
+ before do
+ @node = Chef::Node.new
+ @node.automatic[:platform] = :ubuntu
+ @node.automatic[:platform_version] = '8.10'
+ @events = Chef::EventDispatch::Dispatcher.new
+ @run_context = Chef::RunContext.new(@node, Chef::CookbookCollection.new({}), @events)
+ @runner = Chef::Runner.new(@run_context)
+ end
+
+ before(:each) do
+ Dir[File.expand_path(File.join(File.dirname(__FILE__), "..", "data", "lwrp", "resources", "*"))].each do |file|
+ Chef::Resource.build_from_file("lwrp", file, @run_context)
+ end
+
+ Dir[File.expand_path(File.join(File.dirname(__FILE__), "..", "data", "lwrp_override", "resources", "*"))].each do |file|
+ Chef::Resource.build_from_file("lwrp", file, @run_context)
+ end
+
+ Dir[File.expand_path(File.join(File.dirname(__FILE__), "..", "data", "lwrp", "providers", "*"))].each do |file|
+ Chef::Provider.build_from_file("lwrp", file, @run_context)
+ end
+
+ Dir[File.expand_path(File.join(File.dirname(__FILE__), "..", "data", "lwrp_override", "providers", "*"))].each do |file|
+ Chef::Provider.build_from_file("lwrp", file, @run_context)
+ end
+
+ end
+
+ it "should properly handle a new_resource reference" do
+ resource = Chef::Resource::LwrpFoo.new("morpheus")
+ resource.monkey("bob")
+ resource.provider(:lwrp_monkey_name_printer)
+ resource.run_context = @run_context
+
+ provider = Chef::Platform.provider_for_resource(resource, :twiddle_thumbs)
+ provider.action_twiddle_thumbs
+ end
+
+ it "should load the provider into a properly-named class" do
+ Chef::Provider.const_get("LwrpBuckPasser").should be_kind_of(Class)
+ end
+
+ it "should create a method for each attribute" do
+ new_resource = mock("new resource", :null_object=>true)
+ Chef::Provider::LwrpBuckPasser.new(nil, new_resource).methods.map{|m|m.to_sym}.should include(:action_pass_buck)
+ Chef::Provider::LwrpThumbTwiddler.new(nil, new_resource).methods.map{|m|m.to_sym}.should include(:action_twiddle_thumbs)
+ end
+
+ it "should insert resources embedded in the provider into the middle of the resource collection" do
+ injector = Chef::Resource::LwrpFoo.new("morpheus", @run_context)
+ injector.action(:pass_buck)
+ injector.provider(:lwrp_buck_passer)
+ dummy = Chef::Resource::ZenMaster.new("keanu reeves", @run_context)
+ dummy.provider(Chef::Provider::Easy)
+ @run_context.resource_collection.insert(injector)
+ @run_context.resource_collection.insert(dummy)
+
+ Chef::Runner.new(@run_context).converge
+
+ @run_context.resource_collection[0].should eql(injector)
+ @run_context.resource_collection[1].name.should eql(:prepared_thumbs)
+ @run_context.resource_collection[2].name.should eql(:twiddled_thumbs)
+ @run_context.resource_collection[3].should eql(dummy)
+ end
+
+ it "should insert embedded resources from multiple providers, including from the last position, properly into the resource collection" do
+ injector = Chef::Resource::LwrpFoo.new("morpheus", @run_context)
+ injector.action(:pass_buck)
+ injector.provider(:lwrp_buck_passer)
+
+ injector2 = Chef::Resource::LwrpBar.new("tank", @run_context)
+ injector2.action(:pass_buck)
+ injector2.provider(:lwrp_buck_passer_2)
+
+ dummy = Chef::Resource::ZenMaster.new("keanu reeves", @run_context)
+ dummy.provider(Chef::Provider::Easy)
+
+ @run_context.resource_collection.insert(injector)
+ @run_context.resource_collection.insert(dummy)
+ @run_context.resource_collection.insert(injector2)
+
+ Chef::Runner.new(@run_context).converge
+
+ @run_context.resource_collection[0].should eql(injector)
+ @run_context.resource_collection[1].name.should eql(:prepared_thumbs)
+ @run_context.resource_collection[2].name.should eql(:twiddled_thumbs)
+ @run_context.resource_collection[3].should eql(dummy)
+ @run_context.resource_collection[4].should eql(injector2)
+ @run_context.resource_collection[5].name.should eql(:prepared_eyes)
+ @run_context.resource_collection[6].name.should eql(:dried_paint_watched)
+ end
+
+ it "should properly handle a new_resource reference" do
+ resource = Chef::Resource::LwrpFoo.new("morpheus", @run_context)
+ resource.monkey("bob")
+ resource.provider(:lwrp_monkey_name_printer)
+
+ provider = Chef::Platform.provider_for_resource(resource, :twiddle_thumbs)
+ provider.action_twiddle_thumbs
+
+ provider.monkey_name.should == "my monkey's name is 'bob'"
+ end
+
+ it "should properly handle an embedded Resource accessing the enclosing Provider's scope" do
+ resource = Chef::Resource::LwrpFoo.new("morpheus", @run_context)
+ resource.monkey("bob")
+ resource.provider(:lwrp_embedded_resource_accesses_providers_scope)
+
+ provider = Chef::Platform.provider_for_resource(resource, :twiddle_thumbs)
+ #provider = @runner.build_provider(resource)
+ provider.action_twiddle_thumbs
+
+ provider.enclosed_resource.monkey.should == 'bob, the monkey'
+ end
+
+ end
+
+end