3
require File.dirname(__FILE__) + '/../../../spec_helper'
5
describe Puppet::Parser::AST::HostClass do
7
@node = Puppet::Node.new "testnode"
8
@parser = Puppet::Parser::Parser.new :environment => "development"
9
@scope_resource = stub 'scope_resource', :builtin? => true
10
@compiler = Puppet::Parser::Compiler.new(@node, @parser)
12
@scope = @compiler.topscope
15
describe Puppet::Parser::AST::HostClass, "when evaluating" do
18
@top = @parser.newclass "top"
19
@middle = @parser.newclass "middle", :parent => "top"
22
it "should create a resource that references itself" do
25
@compiler.catalog.resource(:class, "top").should be_instance_of(Puppet::Parser::Resource)
28
it "should evaluate the parent class if one exists" do
29
@middle.evaluate(@scope)
31
@compiler.catalog.resource(:class, "top").should be_instance_of(Puppet::Parser::Resource)
34
it "should fail to evaluate if a parent class is defined but cannot be found" do
35
othertop = @parser.newclass "something", :parent => "yay"
36
lambda { othertop.evaluate(@scope) }.should raise_error(Puppet::ParseError)
39
it "should not create a new resource if one already exists" do
40
@compiler.catalog.expects(:resource).with(:class, "top").returns("something")
41
@compiler.catalog.expects(:add_resource).never
45
it "should return the existing resource when not creating a new one" do
46
@compiler.catalog.expects(:resource).with(:class, "top").returns("something")
47
@compiler.catalog.expects(:add_resource).never
48
@top.evaluate(@scope).should == "something"
51
it "should not create a new parent resource if one already exists and it has a parent class" do
54
top_resource = @compiler.catalog.resource(:class, "top")
56
@middle.evaluate(@scope)
58
@compiler.catalog.resource(:class, "top").should equal(top_resource)
61
# #795 - tag before evaluation.
62
it "should tag the catalog with the resource tags when it is evaluated" do
63
@middle.evaluate(@scope)
65
@compiler.catalog.should be_tagged("middle")
68
it "should tag the catalog with the parent class tags when it is evaluated" do
69
@middle.evaluate(@scope)
71
@compiler.catalog.should be_tagged("top")
75
describe Puppet::Parser::AST::HostClass, "when evaluating code" do
78
@top_resource = stub "top_resource"
79
@top = @parser.newclass "top", :code => @top_resource
81
@middle_resource = stub "middle_resource"
82
@middle = @parser.newclass "top::middle", :parent => "top", :code => @middle_resource
85
it "should set its namespace to its fully qualified name" do
86
@middle.namespace.should == "top::middle"
89
it "should evaluate the code referred to by the class" do
90
@top_resource.expects(:safeevaluate)
92
resource = @top.evaluate(@scope)
94
@top.evaluate_code(resource)
97
it "should evaluate the parent class's code if it has a parent" do
98
@top_resource.expects(:safeevaluate)
99
@middle_resource.expects(:safeevaluate)
101
resource = @middle.evaluate(@scope)
103
@middle.evaluate_code(resource)
106
it "should not evaluate the parent class's code if the parent has already been evaluated" do
107
@top_resource.stubs(:safeevaluate)
108
resource = @top.evaluate(@scope)
109
@top.evaluate_code(resource)
111
@top_resource.expects(:safeevaluate).never
112
@middle_resource.stubs(:safeevaluate)
113
resource = @middle.evaluate(@scope)
114
@middle.evaluate_code(resource)
117
it "should use the parent class's scope as its parent scope" do
118
@top_resource.stubs(:safeevaluate)
119
@middle_resource.stubs(:safeevaluate)
120
resource = @middle.evaluate(@scope)
121
@middle.evaluate_code(resource)
123
@compiler.class_scope(@middle).parent.should equal(@compiler.class_scope(@top))
126
it "should add the parent class's namespace to its namespace search path" do
127
@top_resource.stubs(:safeevaluate)
128
@middle_resource.stubs(:safeevaluate)
129
resource = @middle.evaluate(@scope)
130
@middle.evaluate_code(resource)
132
@compiler.class_scope(@middle).namespaces.should be_include(@top.namespace)