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.rb398
1 files changed, 0 insertions, 398 deletions
diff --git a/spec/unit/lwrp_spec.rb b/spec/unit/lwrp_spec.rb
deleted file mode 100644
index 960aff3c36..0000000000
--- a/spec/unit/lwrp_spec.rb
+++ /dev/null
@@ -1,398 +0,0 @@
-#
-# 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'
-
-module LwrpConstScopingConflict
-end
-
-describe "LWRP" do
- before do
- @original_VERBOSE = $VERBOSE
- $VERBOSE = nil
- end
-
- after do
- $VERBOSE = @original_VERBOSE
- end
-
- describe "when overriding an existing class" do
- before :each do
- $stderr.stub(:write)
- end
-
- it "should log if attempting to load resource of same name" do
- Dir[File.expand_path( "lwrp/resources/*", CHEF_SPEC_DATA)].each do |file|
- Chef::Resource::LWRPBase.build_from_file("lwrp", file, nil)
- end
-
- Dir[File.expand_path( "lwrp/resources/*", CHEF_SPEC_DATA)].each do |file|
- Chef::Log.should_receive(:info).with(/overriding/)
- Chef::Resource::LWRPBase.build_from_file("lwrp", file, nil)
- end
- end
-
- it "should log if attempting to load provider of same name" do
- Dir[File.expand_path( "lwrp/providers/*", CHEF_SPEC_DATA)].each do |file|
- Chef::Provider::LWRPBase.build_from_file("lwrp", file, nil)
- end
-
- Dir[File.expand_path( "lwrp/providers/*", CHEF_SPEC_DATA)].each do |file|
- Chef::Log.should_receive(:info).with(/overriding/)
- Chef::Provider::LWRPBase.build_from_file("lwrp", file, nil)
- end
- end
-
- it "removes the old LRWP resource class from the list of resource subclasses [CHEF-3432]" do
- # CHEF-3432 regression test:
- # Chef::Resource keeps a list of all subclasses to assist class inflation
- # for json parsing (see Chef::JSONCompat). When replacing LWRP resources,
- # we need to ensure the old resource class is remove from that list.
- Dir[File.expand_path( "lwrp/resources/*", CHEF_SPEC_DATA)].each do |file|
- Chef::Resource::LWRPBase.build_from_file("lwrp", file, nil)
- end
- first_lwr_foo_class = Chef::Resource::LwrpFoo
- Chef::Resource.resource_classes.should include(first_lwr_foo_class)
- Dir[File.expand_path( "lwrp/resources/*", CHEF_SPEC_DATA)].each do |file|
- Chef::Resource::LWRPBase.build_from_file("lwrp", file, nil)
- end
- Chef::Resource.resource_classes.should_not include(first_lwr_foo_class)
- end
-
- it "does not attempt to remove classes from higher up namespaces [CHEF-4117]" do
- conflicting_lwrp_file = File.expand_path( "lwrp_const_scoping/resources/conflict.rb", CHEF_SPEC_DATA)
- # The test is that this should not raise an error:
- Chef::Resource::LWRPBase.build_from_file("lwrp_const_scoping", conflicting_lwrp_file, nil)
- end
-
- 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::LWRPBase.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::LWRPBase.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::LWRPBase.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
-
- context "resource_name" do
- let(:klass) { Class.new(Chef::Resource::LWRPBase) }
-
- it "returns nil when the resource_name is not set" do
- expect(klass.resource_name).to be_nil
- end
-
- it "allows to user to user the resource_name" do
- expect {
- klass.resource_name(:foo)
- }.to_not raise_error
- end
-
- it "returns the set value for the resource" do
- klass.resource_name(:foo)
- expect(klass.resource_name).to eq(:foo)
- end
-
- context "when creating a new instance" do
- it "raises an exception if resource_name is nil" do
- expect {
- klass.new('blah')
- }.to raise_error(Chef::Exceptions::InvalidResourceSpecification)
- end
- end
-
- context "lazy default values" do
- let(:klass) do
- Class.new(Chef::Resource::LWRPBase) do
- self.resource_name = :sample_resource
- attribute :food, :default => lazy { 'BACON!'*3 }
- attribute :drink, :default => lazy { |r| "Drink after #{r.food}!"}
- end
- end
-
- let(:instance) { klass.new('kitchen') }
-
- it "evaluates the default value when requested" do
- expect(instance.food).to eq('BACON!BACON!BACON!')
- end
-
- it "evaluates yields self to the block" do
- expect(instance.drink).to eq('Drink after BACON!BACON!BACON!!')
- end
- end
- end
-
- describe "when #default_action is an array" do
- let(:lwrp) do
- Class.new(Chef::Resource::LWRPBase) do
- actions :eat, :sleep
- default_action [:eat, :sleep]
- end
- end
-
- it "returns the array of default actions" do
- expect(lwrp.default_action).to eq([:eat, :sleep])
- end
- end
-
- describe "when inheriting from LWRPBase" do
- let(:parent) do
- Class.new(Chef::Resource::LWRPBase) do
- actions :eat, :sleep
- default_action :eat
- end
- end
-
- context "when the child does not defined the methods" do
- let(:child) do
- Class.new(parent)
- end
-
- it "delegates #actions to the parent" do
- expect(child.actions).to eq([:eat, :sleep])
- end
-
- it "delegates #default_action to the parent" do
- expect(child.default_action).to eq(:eat)
- end
- end
-
- context "when the child does define the methods" do
- let(:child) do
- Class.new(parent) do
- actions :dont_eat, :dont_sleep
- default_action :dont_eat
- end
- end
-
- it "does not delegate #actions to the parent" do
- expect(child.actions).to eq([:dont_eat, :dont_sleep])
- end
-
- it "does not delegate #default_action to the parent" do
- expect(child.default_action).to eq(:dont_eat)
- end
- end
- 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::LWRPBase.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::LWRPBase.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::LWRPBase.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::LWRPBase.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 = double("new resource").as_null_object
- 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
-
- describe "when using inline compilation" do
- before do
- # Behavior in these examples depends on implementation of fixture provider.
- # See spec/data/lwrp/providers/inline_compiler
-
- # Side effect of lwrp_inline_compiler provider for testing notifications.
- $interior_ruby_block_2 = nil
- # resource type doesn't matter, so make an existing resource type work with provider.
- @resource = Chef::Resource::LwrpFoo.new("morpheus", @run_context)
- @resource.allowed_actions << :test
- @resource.action(:test)
- @resource.provider(:lwrp_inline_compiler)
- end
-
- it "does not add interior resources to the exterior resource collection" do
- @resource.run_action(:test)
- @run_context.resource_collection.should be_empty
- end
-
- context "when interior resources are updated" do
- it "processes notifications within the LWRP provider's action" do
- @resource.run_action(:test)
- $interior_ruby_block_2.should == "executed"
- end
-
- it "marks the parent resource updated" do
- @resource.run_action(:test)
- @resource.should be_updated
- @resource.should be_updated_by_last_action
- end
- end
-
- context "when interior resources are not updated" do
- it "does not mark the parent resource updated" do
- @resource.run_action(:no_updates)
- @resource.should_not be_updated
- @resource.should_not be_updated_by_last_action
- end
- end
-
- end
-
- end
-
-end