diff options
Diffstat (limited to 'spec/unit/other/transbucket_spec_spec.rb')
-rwxr-xr-x | spec/unit/other/transbucket_spec_spec.rb | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/spec/unit/other/transbucket_spec_spec.rb b/spec/unit/other/transbucket_spec_spec.rb new file mode 100755 index 000000000..a76195120 --- /dev/null +++ b/spec/unit/other/transbucket_spec_spec.rb @@ -0,0 +1,188 @@ +#!/usr/bin/env ruby + +require File.dirname(__FILE__) + '/../../spec_helper' + +describe Puppet::TransBucket do + before do + @bucket = Puppet::TransBucket.new + end + + it "should be able to produce a RAL component" do + @bucket.name = "luke" + @bucket.type = "foo" + + resource = nil + proc { resource = @bucket.to_ral }.should_not raise_error + resource.should be_instance_of(Puppet::Type::Component) + resource.title.should == "Foo[luke]" + end + + it "should accept TransObjects into its children list" do + object = Puppet::TransObject.new("luke", "user") + proc { @bucket.push(object) }.should_not raise_error + @bucket.each do |o| + o.should equal(object) + end + end + + it "should accept TransBuckets into its children list" do + object = Puppet::TransBucket.new() + proc { @bucket.push(object) }.should_not raise_error + @bucket.each do |o| + o.should equal(object) + end + end + + it "should refuse to accept any children that are not TransObjects or TransBuckets" do + proc { @bucket.push "a test" }.should raise_error + end + + it "should return use 'node' as the type and the provided name as the title if only a type is provided" do + @bucket.type = "mystuff" + @bucket.to_ref.should == "Node[mystuff]" + end + + it "should return use 'component' as the type and the provided type as the title if only a name is provided" do + @bucket.name = "mystuff" + @bucket.to_ref.should == "Class[Mystuff]" + end + + it "should return nil as its reference when type and name are missing" do + @bucket.to_ref.should be_nil + end + + it "should return the title as its reference" do + @bucket.name = "luke" + @bucket.type = "user" + @bucket.to_ref.should == "User[luke]" + end + + it "should canonize resource references when the type is 'component'" do + @bucket.name = 'something' + @bucket.type = 'foo::bar' + + @bucket.to_ref.should == "Foo::Bar[something]" + end +end + +describe Puppet::TransBucket, " when generating a catalog" do + before do + @bottom = Puppet::TransBucket.new + @bottom.type = "fake" + @bottom.name = "bottom" + @bottomobj = Puppet::TransObject.new("bottom", "notify") + @bottom.push @bottomobj + + @middle = Puppet::TransBucket.new + @middle.type = "fake" + @middle.name = "middle" + @middleobj = Puppet::TransObject.new("middle", "notify") + @middle.push(@middleobj) + @middle.push(@bottom) + + @top = Puppet::TransBucket.new + @top.type = "fake" + @top.name = "top" + @topobj = Puppet::TransObject.new("top", "notify") + @top.push(@topobj) + @top.push(@middle) + + @users = %w{top middle bottom} + @fakes = %w{Fake[bottom] Fake[middle] Fake[top]} + end + + it "should convert all transportable objects to RAL resources" do + @catalog = @top.to_catalog + @users.each do |name| + @catalog.vertices.find { |r| r.class.name == :notify and r.title == name }.should be_instance_of(Puppet::Type.type(:notify)) + end + end + + it "should fail if any transportable resources fail to convert to RAL resources" do + @bottomobj.expects(:to_ral).raises ArgumentError + lambda { @bottom.to_catalog }.should raise_error(ArgumentError) + end + + it "should convert all transportable buckets to RAL components" do + @catalog = @top.to_catalog + @fakes.each do |name| + @catalog.vertices.find { |r| r.class.name == :component and r.title == name }.should be_instance_of(Puppet::Type.type(:component)) + end + end + + it "should add all resources to the graph's resource table" do + @catalog = @top.to_catalog + @catalog.resource("fake[top]").should equal(@top) + end + + it "should finalize all resources" do + @catalog = @top.to_catalog + @catalog.vertices.each do |vertex| vertex.should be_finalized end + end + + it "should only call to_ral on each resource once" do + # We just raise exceptions here because we're not interested in + # what happens with the result, only that the method only + # gets called once. + resource = @topobj.to_ral + @topobj.expects(:to_ral).once.returns resource + @top.to_catalog + end + + it "should set each TransObject's catalog before converting to a RAL resource" do + @middleobj.expects(:catalog=).with { |c| c.is_a?(Puppet::Resource::Catalog) } + @top.to_catalog + end + + it "should set each TransBucket's catalog before converting to a RAL resource" do + # each bucket is seen twice in the loop, so we have to handle the case where the config + # is set twice + @bottom.expects(:catalog=).with { |c| c.is_a?(Puppet::Resource::Catalog) }.at_least_once + @top.to_catalog + end +end + +describe Puppet::TransBucket, " when serializing" do + before do + @bucket = Puppet::TransBucket.new(%w{one two}) + @bucket.name = "one" + @bucket.type = "two" + end + + it "should be able to be dumped to yaml" do + proc { YAML.dump(@bucket) }.should_not raise_error + end + + it "should dump YAML that produces an equivalent object" do + result = YAML.dump(@bucket) + + newobj = YAML.load(result) + newobj.name.should == "one" + newobj.type.should == "two" + children = [] + newobj.each do |o| + children << o + end + children.should == %w{one two} + end +end + +describe Puppet::TransBucket, " when converting to a Puppet::Resource" do + before do + @trans = Puppet::TransBucket.new + @trans.name = "foo" + @trans.type = "bar" + @trans.param(:noop, true) + end + + it "should create a resource with the correct type and title" do + result = @trans.to_resource + result.type.should == "Bar" + result.title.should == "foo" + end + + it "should add all of its parameters to the created resource" do + @trans.param(:noop, true) + @trans.to_resource[:noop].should be_true + end +end |