1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
#!/usr/bin/env ruby
require File.dirname(__FILE__) + '/../../../spec_helper'
describe Puppet::Parser::AST::Node do
before :each do
@node = Puppet::Node.new "testnode"
@parser = Puppet::Parser::Parser.new :environment => "development"
@scope_resource = stub 'scope_resource', :builtin? => true
@compiler = Puppet::Parser::Compiler.new(@node, @parser)
@scope = @compiler.topscope
end
describe Puppet::Parser::AST::Node, "when evaluating" do
before do
@top = @parser.newnode("top").shift
@middle = @parser.newnode("middle", :parent => "top").shift
end
it "should create a resource that references itself" do
@top.evaluate(@scope)
@compiler.catalog.resource(:node, "top").should be_an_instance_of(Puppet::Parser::Resource)
end
it "should evaluate the parent class if one exists" do
@middle.evaluate(@scope)
@compiler.catalog.resource(:node, "top").should be_an_instance_of(Puppet::Parser::Resource)
end
it "should fail to evaluate if a parent class is defined but cannot be found" do
othertop = @parser.newnode("something", :parent => "yay").shift
lambda { othertop.evaluate(@scope) }.should raise_error(Puppet::ParseError)
end
it "should not create a new resource if one already exists" do
@compiler.catalog.expects(:resource).with(:node, "top").returns("something")
@compiler.catalog.expects(:add_resource).never
@top.evaluate(@scope)
end
it "should not create a new parent resource if one already exists and it has a parent class" do
@top.evaluate(@scope)
top_resource = @compiler.catalog.resource(:node, "top")
@middle.evaluate(@scope)
@compiler.catalog.resource(:node, "top").should equal(top_resource)
end
# #795 - tag before evaluation.
it "should tag the catalog with the resource tags when it is evaluated" do
@middle.evaluate(@scope)
@compiler.catalog.should be_tagged("middle")
end
it "should tag the catalog with the parent class tags when it is evaluated" do
@middle.evaluate(@scope)
@compiler.catalog.should be_tagged("top")
end
end
describe Puppet::Parser::AST::Node, "when evaluating code" do
before do
@top_resource = stub "top_resource"
@top = @parser.newnode("top", :code => @top_resource).shift
@middle_resource = stub "middle_resource"
@middle = @parser.newnode("middle", :parent => "top", :code => @middle_resource).shift
end
it "should evaluate the code referred to by the class" do
@top_resource.expects(:safeevaluate)
resource = @top.evaluate(@scope)
@top.evaluate_code(resource)
end
it "should evaluate the parent class's code if it has a parent" do
@top_resource.expects(:safeevaluate)
@middle_resource.expects(:safeevaluate)
resource = @middle.evaluate(@scope)
@middle.evaluate_code(resource)
end
it "should not evaluate the parent class's code if the parent has already been evaluated" do
@top_resource.stubs(:safeevaluate)
resource = @top.evaluate(@scope)
@top.evaluate_code(resource)
@top_resource.expects(:safeevaluate).never
@middle_resource.stubs(:safeevaluate)
resource = @middle.evaluate(@scope)
@middle.evaluate_code(resource)
end
it "should use the parent class's scope as its parent scope" do
@top_resource.stubs(:safeevaluate)
@middle_resource.stubs(:safeevaluate)
resource = @middle.evaluate(@scope)
@middle.evaluate_code(resource)
@compiler.class_scope(@middle).parent.should equal(@compiler.class_scope(@top))
end
it "should add the parent class's namespace to its namespace search path" do
@top_resource.stubs(:safeevaluate)
@middle_resource.stubs(:safeevaluate)
resource = @middle.evaluate(@scope)
@middle.evaluate_code(resource)
@compiler.class_scope(@middle).namespaces.should be_include(@top.namespace)
end
end
end
|