3
require File.dirname(__FILE__) + '/../../../spec_helper'
5
describe Puppet::Parser::AST::Node 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::Node, "when evaluating" do
18
@top = @parser.newnode("top").shift
19
@middle = @parser.newnode("middle", :parent => "top").shift
22
it "should create a resource that references itself" do
25
@compiler.catalog.resource(:node, "top").should be_an_instance_of(Puppet::Parser::Resource)
28
it "should evaluate the parent class if one exists" do
29
@middle.evaluate(@scope)
31
@compiler.catalog.resource(:node, "top").should be_an_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.newnode("something", :parent => "yay").shift
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(:node, "top").returns("something")
41
@compiler.catalog.expects(:add_resource).never
45
it "should not create a new parent resource if one already exists and it has a parent class" do
48
top_resource = @compiler.catalog.resource(:node, "top")
50
@middle.evaluate(@scope)
52
@compiler.catalog.resource(:node, "top").should equal(top_resource)
55
# #795 - tag before evaluation.
56
it "should tag the catalog with the resource tags when it is evaluated" do
57
@middle.evaluate(@scope)
59
@compiler.catalog.should be_tagged("middle")
62
it "should tag the catalog with the parent class tags when it is evaluated" do
63
@middle.evaluate(@scope)
65
@compiler.catalog.should be_tagged("top")
69
describe Puppet::Parser::AST::Node, "when evaluating code" do
72
@top_resource = stub "top_resource"
73
@top = @parser.newnode("top", :code => @top_resource).shift
75
@middle_resource = stub "middle_resource"
76
@middle = @parser.newnode("middle", :parent => "top", :code => @middle_resource).shift
79
it "should evaluate the code referred to by the class" do
80
@top_resource.expects(:safeevaluate)
82
resource = @top.evaluate(@scope)
84
@top.evaluate_code(resource)
87
it "should evaluate the parent class's code if it has a parent" do
88
@top_resource.expects(:safeevaluate)
89
@middle_resource.expects(:safeevaluate)
91
resource = @middle.evaluate(@scope)
93
@middle.evaluate_code(resource)
96
it "should not evaluate the parent class's code if the parent has already been evaluated" do
97
@top_resource.stubs(:safeevaluate)
98
resource = @top.evaluate(@scope)
99
@top.evaluate_code(resource)
101
@top_resource.expects(:safeevaluate).never
102
@middle_resource.stubs(:safeevaluate)
103
resource = @middle.evaluate(@scope)
104
@middle.evaluate_code(resource)
107
it "should use the parent class's scope as its parent scope" do
108
@top_resource.stubs(:safeevaluate)
109
@middle_resource.stubs(:safeevaluate)
110
resource = @middle.evaluate(@scope)
111
@middle.evaluate_code(resource)
113
@compiler.class_scope(@middle).parent.should equal(@compiler.class_scope(@top))
116
it "should add the parent class's namespace to its namespace search path" do
117
@top_resource.stubs(:safeevaluate)
118
@middle_resource.stubs(:safeevaluate)
119
resource = @middle.evaluate(@scope)
120
@middle.evaluate_code(resource)
122
@compiler.class_scope(@middle).namespaces.should be_include(@top.namespace)