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
126
127
128
129
|
#!/usr/bin/env rspec
require 'spec_helper'
require 'matchers/json'
require 'puppet/node/facts'
describe Puppet::Node::Facts, "when indirecting" do
before do
@facts = Puppet::Node::Facts.new("me")
end
it "should be able to convert all fact values to strings" do
@facts.values["one"] = 1
@facts.stringify
@facts.values["one"].should == "1"
end
it "should add the node's certificate name as the 'clientcert' fact when adding local facts" do
@facts.add_local_facts
@facts.values["clientcert"].should == Puppet.settings[:certname]
end
it "should add the Puppet version as a 'clientversion' fact when adding local facts" do
@facts.add_local_facts
@facts.values["clientversion"].should == Puppet.version.to_s
end
it "should add the current environment as a fact if one is not set when adding local facts" do
@facts.add_local_facts
@facts.values["environment"].should == Puppet[:environment]
end
it "should not replace any existing environment fact when adding local facts" do
@facts.values["environment"] = "foo"
@facts.add_local_facts
@facts.values["environment"].should == "foo"
end
it "should be able to downcase fact values" do
Puppet.settings.stubs(:value).returns "eh"
Puppet.settings.expects(:value).with(:downcasefacts).returns true
@facts.values["one"] = "Two"
@facts.downcase_if_necessary
@facts.values["one"].should == "two"
end
it "should only try to downcase strings" do
Puppet.settings.stubs(:value).returns "eh"
Puppet.settings.expects(:value).with(:downcasefacts).returns true
@facts.values["now"] = Time.now
@facts.downcase_if_necessary
@facts.values["now"].should be_instance_of(Time)
end
it "should not downcase facts if not configured to do so" do
Puppet.settings.stubs(:value).returns "eh"
Puppet.settings.expects(:value).with(:downcasefacts).returns false
@facts.values["one"] = "Two"
@facts.downcase_if_necessary
@facts.values["one"].should == "Two"
end
describe "when indirecting" do
before do
@indirection = stub 'indirection', :request => mock('request'), :name => :facts
@facts = Puppet::Node::Facts.new("me", "one" => "two")
end
it "should redirect to the specified fact store for storage" do
Puppet::Node::Facts.stubs(:indirection).returns(@indirection)
@indirection.expects(:save)
Puppet::Node::Facts.indirection.save(@facts)
end
describe "when the Puppet application is 'master'" do
it "should default to the 'yaml' terminus" do
pending "Cannot test the behavior of defaults in defaults.rb"
# Puppet::Node::Facts.indirection.terminus_class.should == :yaml
end
end
describe "when the Puppet application is not 'master'" do
it "should default to the 'facter' terminus" do
pending "Cannot test the behavior of defaults in defaults.rb"
# Puppet::Node::Facts.indirection.terminus_class.should == :facter
end
end
end
describe "when storing and retrieving" do
it "should add metadata to the facts" do
facts = Puppet::Node::Facts.new("me", "one" => "two", "three" => "four")
facts.values[:_timestamp].should be_instance_of(Time)
end
describe "using pson" do
before :each do
@timestamp = Time.parse("Thu Oct 28 11:16:31 -0700 2010")
@expiration = Time.parse("Thu Oct 28 11:21:31 -0700 2010")
end
it "should accept properly formatted pson" do
pson = %Q({"name": "foo", "expiration": "#{@expiration}", "timestamp": "#{@timestamp}", "values": {"a": "1", "b": "2", "c": "3"}})
format = Puppet::Network::FormatHandler.format('pson')
facts = format.intern(Puppet::Node::Facts,pson)
facts.name.should == 'foo'
facts.expiration.should == @expiration
facts.values.should == {'a' => '1', 'b' => '2', 'c' => '3', :_timestamp => @timestamp}
end
it "should generate properly formatted pson" do
Time.stubs(:now).returns(@timestamp)
facts = Puppet::Node::Facts.new("foo", {'a' => 1, 'b' => 2, 'c' => 3})
facts.expiration = @expiration
result = PSON.parse(facts.to_pson)
result['name'].should == facts.name
result['values'].should == facts.values.reject { |key, value| key.to_s =~ /_/ }
result['timestamp'].should == facts.timestamp.to_s
result['expiration'].should == facts.expiration.to_s
end
end
end
end
|