summaryrefslogtreecommitdiffstats
path: root/spec/unit
diff options
context:
space:
mode:
authorLuke Kanies <luke@madstop.com>2007-09-22 15:04:34 -0500
committerLuke Kanies <luke@madstop.com>2007-09-22 15:04:34 -0500
commitd6e91ae78698bdbec818d383574f4c279735e172 (patch)
tree7072c2a71ef1c05c6a46b6050f52bf3d01ae2843 /spec/unit
parenta66699596452f88d2bc467af4cff3f9a1aec3d1e (diff)
parent86dde63473d29c45d8698ce4edd53c820a621362 (diff)
Merge branch 'configurations' into indirection
Conflicts: lib/puppet/defaults.rb lib/puppet/indirector/facts/yaml.rb spec/unit/indirector/indirection.rb spec/unit/indirector/indirector.rb
Diffstat (limited to 'spec/unit')
-rwxr-xr-xspec/unit/indirector/indirection.rb10
-rwxr-xr-xspec/unit/node/configuration.rb334
-rwxr-xr-xspec/unit/node/node.rb4
-rwxr-xr-xspec/unit/other/modules.rb4
-rwxr-xr-xspec/unit/other/transaction.rb26
-rwxr-xr-xspec/unit/other/transbucket.rb20
-rwxr-xr-xspec/unit/ral/type.rb25
-rwxr-xr-xspec/unit/util/config.rb131
8 files changed, 521 insertions, 33 deletions
diff --git a/spec/unit/indirector/indirection.rb b/spec/unit/indirector/indirection.rb
index e57f12072..b2320e0da 100755
--- a/spec/unit/indirector/indirection.rb
+++ b/spec/unit/indirector/indirection.rb
@@ -51,7 +51,7 @@ describe Puppet::Indirector::Indirection, " when choosing terminus types" do
it "should follow a convention on using per-model configuration parameters to determine the terminus class" do
Puppet.config.expects(:valid?).with('test_terminus').returns(true)
Puppet.config.expects(:value).with('test_terminus').returns(:foo)
- Puppet::Indirector::Terminus.expects(:terminus_class).with(:test, :foo).returns(@terminus_class)
+ Puppet::Indirector::Terminus.expects(:terminus_class).with(:foo, :test).returns(@terminus_class)
@indirection.terminus.should equal(@terminus)
end
@@ -59,12 +59,12 @@ describe Puppet::Indirector::Indirection, " when choosing terminus types" do
per-model configuration parameter is available" do
Puppet.config.expects(:valid?).with('test_terminus').returns(false)
Puppet.config.expects(:value).with(:default_terminus).returns(:foo)
- Puppet::Indirector::Terminus.expects(:terminus_class).with(:test, :foo).returns(@terminus_class)
+ Puppet::Indirector::Terminus.expects(:terminus_class).with(:foo, :test).returns(@terminus_class)
@indirection.terminus.should equal(@terminus)
end
it "should select the specified terminus class if a name is provided" do
- Puppet::Indirector::Terminus.expects(:terminus_class).with(:test, :foo).returns(@terminus_class)
+ Puppet::Indirector::Terminus.expects(:terminus_class).with(:foo, :test).returns(@terminus_class)
@indirection.terminus(:foo).should equal(@terminus)
end
@@ -77,7 +77,7 @@ describe Puppet::Indirector::Indirection, " when choosing terminus types" do
end
it "should fail when the specified terminus class cannot be found" do
- Puppet::Indirector::Terminus.expects(:terminus_class).with(:test, :foo).returns(nil)
+ Puppet::Indirector::Terminus.expects(:terminus_class).with(:foo, :test).returns(nil)
proc { @indirection.terminus(:foo) }.should raise_error(ArgumentError)
end
@@ -91,7 +91,7 @@ describe Puppet::Indirector::Indirection, " when managing terminus instances" do
@indirection = Puppet::Indirector::Indirection.new(mock('model'), :test)
@terminus = mock 'terminus'
@terminus_class = mock 'terminus class'
- Puppet::Indirector::Terminus.stubs(:terminus_class).with(:test, :foo).returns(@terminus_class)
+ Puppet::Indirector::Terminus.stubs(:terminus_class).with(:foo, :test).returns(@terminus_class)
end
it "should create an instance of the chosen terminus class" do
diff --git a/spec/unit/node/configuration.rb b/spec/unit/node/configuration.rb
index 774a1550f..b37cc754d 100755
--- a/spec/unit/node/configuration.rb
+++ b/spec/unit/node/configuration.rb
@@ -134,25 +134,339 @@ describe Puppet::Node::Configuration, " when extracting transobjects" do
end
end
-describe Puppet::Node::Configuration, " functioning as a resource container" do
+describe Puppet::Node::Configuration, " when functioning as a resource container" do
before do
- @graph = Puppet::Node::Configuration.new("host")
- @one = stub 'resource1', :ref => "Me[you]"
- @two = stub 'resource2', :ref => "Me[him]"
- @dupe = stub 'resource3', :ref => "Me[you]"
+ @config = Puppet::Node::Configuration.new("host")
+ @one = stub 'resource1', :ref => "Me[you]", :configuration= => nil
+ @two = stub 'resource2', :ref => "Me[him]", :configuration= => nil
+ @dupe = stub 'resource3', :ref => "Me[you]", :configuration= => nil
+ end
+
+ it "should provide a method to add one or more resources" do
+ @config.add_resource @one, @two
+ @config.resource(@one.ref).should equal(@one)
+ @config.resource(@two.ref).should equal(@two)
end
it "should make all vertices available by resource reference" do
- @graph.add_resource(@one)
- @graph.resource(@one.ref).should equal(@one)
+ @config.add_resource(@one)
+ @config.resource(@one.ref).should equal(@one)
+ @config.vertices.find { |r| r.ref == @one.ref }.should equal(@one)
end
it "should not allow two resources with the same resource reference" do
- @graph.add_resource(@one)
- proc { @graph.add_resource(@dupe) }.should raise_error(ArgumentError)
+ @config.add_resource(@one)
+ proc { @config.add_resource(@dupe) }.should raise_error(ArgumentError)
end
it "should not store objects that do not respond to :ref" do
- proc { @graph.add_resource("thing") }.should raise_error(ArgumentError)
+ proc { @config.add_resource("thing") }.should raise_error(ArgumentError)
+ end
+
+ it "should remove all resources when asked" do
+ @config.add_resource @one
+ @config.add_resource @two
+ @one.expects :remove
+ @two.expects :remove
+ @config.clear(true)
+ end
+
+ it "should support a mechanism for finishing resources" do
+ @one.expects :finish
+ @two.expects :finish
+ @config.add_resource @one
+ @config.add_resource @two
+
+ @config.finalize
+ end
+
+ it "should optionally support an initialization block and should finalize after such blocks" do
+ @one.expects :finish
+ @two.expects :finish
+ config = Puppet::Node::Configuration.new("host") do |conf|
+ conf.add_resource @one
+ conf.add_resource @two
+ end
+ end
+
+ it "should inform the resource that it is the resource's configuration" do
+ @one.expects(:configuration=).with(@config)
+ @config.add_resource @one
+ end
+
+ it "should be able to find resources by reference" do
+ @config.add_resource @one
+ @config.resource(@one.ref).should equal(@one)
+ end
+
+ it "should be able to find resources by reference or by type/title tuple" do
+ @config.add_resource @one
+ @config.resource("me", "you").should equal(@one)
+ end
+
+ it "should have a mechanism for removing resources" do
+ @config.add_resource @one
+ @one.expects :remove
+ @config.remove_resource(@one)
+ @config.resource(@one.ref).should be_nil
+ @config.vertex?(@one).should be_false
+ end
+end
+
+module ApplyingConfigurations
+ def setup
+ @config = Puppet::Node::Configuration.new("host")
+
+ @config.retrieval_duration = Time.now
+ @transaction = mock 'transaction'
+ Puppet::Transaction.stubs(:new).returns(@transaction)
+ @transaction.stubs(:evaluate)
+ @transaction.stubs(:cleanup)
+ @transaction.stubs(:addtimes)
+ end
+end
+
+describe Puppet::Node::Configuration, " when applying" do
+ include ApplyingConfigurations
+
+ it "should create and evaluate a transaction" do
+ @transaction.expects(:evaluate)
+ @config.apply
+ end
+
+ it "should provide the configuration time to the transaction" do
+ @transaction.expects(:addtimes).with do |arg|
+ arg[:config_retrieval].should be_instance_of(Time)
+ true
+ end
+ @config.apply
+ end
+
+ it "should clean up the transaction" do
+ @transaction.expects :cleanup
+ @config.apply
+ end
+
+ it "should return the transaction" do
+ @config.apply.should equal(@transaction)
+ end
+
+ it "should yield the transaction if a block is provided" do
+ @config.apply do |trans|
+ trans.should equal(@transaction)
+ end
+ end
+
+ it "should default to not being a host configuration" do
+ @config.host_config.should be_nil
+ end
+
+ it "should pass supplied tags on to the transaction" do
+ @transaction.expects(:tags=).with(%w{one two})
+ @config.apply(:tags => %w{one two})
+ end
+
+ it "should set ignoreschedules on the transaction if specified in apply()" do
+ @transaction.expects(:ignoreschedules=).with(true)
+ @config.apply(:ignoreschedules => true)
+ end
+end
+
+describe Puppet::Node::Configuration, " when applying host configurations" do
+ include ApplyingConfigurations
+
+ # super() doesn't work in the setup method for some reason
+ before do
+ @config.host_config = true
+ end
+
+ it "should send a report if reporting is enabled" do
+ Puppet[:report] = true
+ @transaction.expects :send_report
+ @config.apply
+ end
+
+ it "should send a report if report summaries are enabled" do
+ Puppet[:summarize] = true
+ @transaction.expects :send_report
+ @config.apply
+ end
+
+ it "should initialize the state database before applying a configuration" do
+ Puppet::Util::Storage.expects(:load)
+
+ # Short-circuit the apply, so we know we're loading before the transaction
+ Puppet::Transaction.expects(:new).raises ArgumentError
+ proc { @config.apply }.should raise_error(ArgumentError)
+ end
+
+ it "should sync the state database after applying" do
+ Puppet::Util::Storage.expects(:store)
+ @config.apply
+ end
+
+ after { Puppet.config.clear }
+end
+
+describe Puppet::Node::Configuration, " when applying non-host configurations" do
+ include ApplyingConfigurations
+
+ before do
+ @config.host_config = false
+ end
+
+ it "should never send reports" do
+ Puppet[:report] = true
+ Puppet[:summarize] = true
+ @transaction.expects(:send_report).never
+ @config.apply
+ end
+
+ it "should never modify the state database" do
+ Puppet::Util::Storage.expects(:load).never
+ Puppet::Util::Storage.expects(:store).never
+ @config.apply
+ end
+
+ after { Puppet.config.clear }
+end
+
+describe Puppet::Node::Configuration, " when creating a relationship graph" do
+ before do
+ @config = Puppet::Node::Configuration.new("host")
+ @compone = Puppet::Type::Component.create :name => "one"
+ @comptwo = Puppet::Type::Component.create :name => "two", :require => ["class", "one"]
+ @file = Puppet::Type.type(:file)
+ @one = @file.create :path => "/one"
+ @two = @file.create :path => "/two"
+ @config.add_edge! @compone, @one
+ @config.add_edge! @comptwo, @two
+
+ @three = @file.create :path => "/three"
+ @four = @file.create :path => "/four", :require => ["file", "/three"]
+ @five = @file.create :path => "/five"
+ @config.add_resource @compone, @comptwo, @one, @two, @three, @four, @five
+ @relationships = @config.relationship_graph
+ end
+
+ it "should be able to create a relationship graph" do
+ @relationships.should be_instance_of(Puppet::Node::Configuration)
+ end
+
+ it "should copy its host_config setting to the relationship graph" do
+ config = Puppet::Node::Configuration.new
+ config.host_config = true
+ config.relationship_graph.host_config.should be_true
+ end
+
+ it "should not have any components" do
+ @relationships.vertices.find { |r| r.instance_of?(Puppet::Type::Component) }.should be_nil
+ end
+
+ it "should have all non-component resources from the configuration" do
+ # The failures print out too much info, so i just do a class comparison
+ @relationships.vertex?(@five).should be_true
+ end
+
+ it "should have all resource relationships set as edges" do
+ @relationships.edge?(@three, @four).should be_true
+ end
+
+ it "should copy component relationships to all contained resources" do
+ @relationships.edge?(@one, @two).should be_true
+ end
+
+ it "should get removed when the configuration is cleaned up" do
+ @relationships.expects(:clear).with(false)
+ @config.clear
+ @config.instance_variable_get("@relationship_graph").should be_nil
+ end
+
+ it "should create a new relationship graph after clearing the old one" do
+ @relationships.expects(:clear).with(false)
+ @config.clear
+ @config.relationship_graph.should be_instance_of(Puppet::Node::Configuration)
+ end
+
+ it "should look up resources in the relationship graph if not found in the main configuration" do
+ five = stub 'five', :ref => "File[five]", :configuration= => nil
+ @relationships.add_resource five
+ @config.resource(five.ref).should equal(five)
+ end
+
+ it "should provide a method to create additional resources that also registers the resource" do
+ args = {:name => "/yay", :ensure => :file}
+ resource = stub 'file', :ref => "File[/yay]", :configuration= => @config
+ Puppet::Type.type(:file).expects(:create).with(args).returns(resource)
+ @config.create_resource :file, args
+ @config.resource("File[/yay]").should equal(resource)
+ end
+
+ it "should provide a mechanism for creating implicit resources" do
+ args = {:name => "/yay", :ensure => :file}
+ resource = stub 'file', :ref => "File[/yay]", :configuration= => @config
+ Puppet::Type.type(:file).expects(:create).with(args).returns(resource)
+ resource.expects(:implicit=).with(true)
+ @config.create_implicit_resource :file, args
+ @config.resource("File[/yay]").should equal(resource)
+ end
+
+ it "should remove resources created mid-transaction" do
+ args = {:name => "/yay", :ensure => :file}
+ resource = stub 'file', :ref => "File[/yay]", :configuration= => @config
+ @transaction = mock 'transaction'
+ Puppet::Transaction.stubs(:new).returns(@transaction)
+ @transaction.stubs(:evaluate)
+ @transaction.stubs(:cleanup)
+ @transaction.stubs(:addtimes)
+ Puppet::Type.type(:file).expects(:create).with(args).returns(resource)
+ resource.expects :remove
+ @config.apply do |trans|
+ @config.create_resource :file, args
+ @config.resource("File[/yay]").should equal(resource)
+ end
+ @config.resource("File[/yay]").should be_nil
+ end
+
+ it "should remove resources from the relationship graph if it exists" do
+ @config.remove_resource(@one)
+ @config.relationship_graph.vertex?(@one).should be_false
+ end
+
+ after do
+ Puppet::Type.allclear
+ end
+end
+
+describe Puppet::Node::Configuration, " when writing dot files" do
+ before do
+ @config = Puppet::Node::Configuration.new("host")
+ @name = :test
+ @file = File.join(Puppet[:graphdir], @name.to_s + ".dot")
+ end
+ it "should only write when it is a host configuration" do
+ File.expects(:open).with(@file).never
+ @config.host_config = false
+ Puppet[:graph] = true
+ @config.write_graph(@name)
+ end
+
+ it "should only write when graphing is enabled" do
+ File.expects(:open).with(@file).never
+ @config.host_config = true
+ Puppet[:graph] = false
+ @config.write_graph(@name)
+ end
+
+ it "should write a dot file based on the passed name" do
+ File.expects(:open).with(@file, "w").yields(stub("file", :puts => nil))
+ @config.expects(:to_dot).with("name" => @name.to_s.capitalize)
+ @config.host_config = true
+ Puppet[:graph] = true
+ @config.write_graph(@name)
+ end
+
+ after do
+ Puppet.config.clear
end
end
diff --git a/spec/unit/node/node.rb b/spec/unit/node/node.rb
index 899d81ac7..53f362da6 100755
--- a/spec/unit/node/node.rb
+++ b/spec/unit/node/node.rb
@@ -11,6 +11,10 @@ describe Puppet::Node, " when initializing" do
@node.name.should == "testnode"
end
+ it "should not allow nil node names" do
+ proc { Puppet::Node.new(nil) }.should raise_error(ArgumentError)
+ end
+
it "should default to an empty parameter hash" do
@node.parameters.should == {}
end
diff --git a/spec/unit/other/modules.rb b/spec/unit/other/modules.rb
index 0ab37aa9e..dbd091d9a 100755
--- a/spec/unit/other/modules.rb
+++ b/spec/unit/other/modules.rb
@@ -5,10 +5,10 @@ require File.dirname(__FILE__) + '/../../spec_helper'
describe Puppet::Module, " when building its search path" do
include PuppetTest
- it "should ignore unqualified paths in the search path" do
+ it "should fully qualify unqualified paths in the search path" do
Puppet[:modulepath] = "something:/my/something"
File.stubs(:directory?).returns(true)
- Puppet::Module.modulepath.should == %w{/my/something}
+ Puppet::Module.modulepath.should == [File.join(Dir.getwd, 'something'), "/my/something"]
end
it "should ignore paths that do not exist" do
diff --git a/spec/unit/other/transaction.rb b/spec/unit/other/transaction.rb
new file mode 100755
index 000000000..7990d2eef
--- /dev/null
+++ b/spec/unit/other/transaction.rb
@@ -0,0 +1,26 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+describe Puppet::Transaction, " when determining tags" do
+ before do
+ @config = Puppet::Node::Configuration.new
+ @transaction = Puppet::Transaction.new(@config)
+ end
+
+ it "should default to the tags specified in the :tags setting" do
+ Puppet.expects(:[]).with(:tags).returns("one")
+ @transaction.tags.should == %w{one}
+ end
+
+ it "should split tags based on ','" do
+ Puppet.expects(:[]).with(:tags).returns("one,two")
+ @transaction.tags.should == %w{one two}
+ end
+
+ it "should use any tags set after creation" do
+ Puppet.expects(:[]).with(:tags).never
+ @transaction.tags = %w{one two}
+ @transaction.tags.should == %w{one two}
+ end
+end
diff --git a/spec/unit/other/transbucket.rb b/spec/unit/other/transbucket.rb
index c013973ee..8cb9abaa4 100755
--- a/spec/unit/other/transbucket.rb
+++ b/spec/unit/other/transbucket.rb
@@ -48,7 +48,7 @@ describe Puppet::TransBucket do
end
end
-describe Puppet::TransBucket, " when generating a resource graph" do
+describe Puppet::TransBucket, " when generating a configuration" do
before do
@bottom = Puppet::TransBucket.new
@bottom.type = "fake"
@@ -70,7 +70,7 @@ describe Puppet::TransBucket, " when generating a resource graph" do
@top.push(@topobj)
@top.push(@middle)
- @graph = @top.to_graph
+ @config = @top.to_configuration
@users = %w{top middle bottom}
@fakes = %w{fake[bottom] fake[middle] fake[top]}
@@ -78,18 +78,28 @@ describe Puppet::TransBucket, " when generating a resource graph" do
it "should convert all transportable objects to RAL resources" do
@users.each do |name|
- @graph.vertices.find { |r| r.class.name == :user and r.title == name }.should be_instance_of(Puppet::Type.type(:user))
+ @config.vertices.find { |r| r.class.name == :user and r.title == name }.should be_instance_of(Puppet::Type.type(:user))
end
end
it "should convert all transportable buckets to RAL components" do
@fakes.each do |name|
- @graph.vertices.find { |r| r.class.name == :component and r.title == name }.should be_instance_of(Puppet::Type.type(:component))
+ @config.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
- @graph.resource("fake[top]").should equal(@top)
+ @config.resource("fake[top]").should equal(@top)
+ end
+
+ it "should finalize all resources" do
+ @config.vertices.each do |vertex| vertex.should be_finalized end
+ end
+
+ it "should only call to_type on each resource once" do
+ @topobj.expects(:to_type)
+ @bottomobj.expects(:to_type)
+ @top.to_configuration
end
after do
diff --git a/spec/unit/ral/type.rb b/spec/unit/ral/type.rb
new file mode 100755
index 000000000..c8bf8c9b4
--- /dev/null
+++ b/spec/unit/ral/type.rb
@@ -0,0 +1,25 @@
+#!/usr/bin/env ruby
+
+require File.dirname(__FILE__) + '/../../spec_helper'
+
+describe Puppet::Type, " when in a configuration" do
+ before do
+ @configuration = Puppet::Node::Configuration.new
+ @container = Puppet::Type.type(:component).create(:name => "container")
+ @one = Puppet::Type.type(:file).create(:path => "/file/one")
+ @two = Puppet::Type.type(:file).create(:path => "/file/two")
+ @configuration.add_resource @container
+ @configuration.add_resource @one
+ @configuration.add_resource @two
+ @configuration.add_edge! @container, @one
+ @configuration.add_edge! @container, @two
+ end
+
+ it "should have no parent if there is no in edge" do
+ @container.parent.should be_nil
+ end
+
+ it "should set its parent to its in edge" do
+ @one.parent.ref.should equal(@container.ref)
+ end
+end
diff --git a/spec/unit/util/config.rb b/spec/unit/util/config.rb
index 28ccb04d7..8114acb8e 100755
--- a/spec/unit/util/config.rb
+++ b/spec/unit/util/config.rb
@@ -299,7 +299,7 @@ describe Puppet::Util::Config, " when parsing its configuration" do
end
it "should support specifying file all metadata (owner, group, mode) in the configuration file" do
- @config.setdefaults :section, :myfile => ["/my/file", "a"]
+ @config.setdefaults :section, :myfile => ["/myfile", "a"]
text = "[main]
myfile = /other/file {owner = luke, group = luke, mode = 644}
@@ -312,7 +312,7 @@ describe Puppet::Util::Config, " when parsing its configuration" do
end
it "should support specifying file a single piece of metadata (owner, group, or mode) in the configuration file" do
- @config.setdefaults :section, :myfile => ["/my/file", "a"]
+ @config.setdefaults :section, :myfile => ["/myfile", "a"]
text = "[main]
myfile = /other/file {owner = luke}
@@ -388,16 +388,34 @@ describe Puppet::Util::Config, " when reparsing its configuration" do
end
describe Puppet::Util::Config, " when being used to manage the host machine" do
+ before do
+ @config = Puppet::Util::Config.new
+ @config.setdefaults :main, :maindir => ["/maindir", "a"], :seconddir => ["/seconddir", "a"]
+ @config.setdefaults :other, :otherdir => {:default => "/otherdir", :desc => "a", :owner => "luke", :group => "johnny", :mode => 0755}
+ @config.setdefaults :files, :myfile => {:default => "/myfile", :desc => "a", :mode => 0755}
+ end
+
it "should provide a method that writes files with the correct modes" do
pending "Not converted from test/unit yet"
end
it "should provide a method that creates directories with the correct modes" do
- pending "Not converted from test/unit yet"
+ Puppet::Util::SUIDManager.expects(:asuser).with("luke", "johnny").yields
+ Dir.expects(:mkdir).with("/otherdir", 0755)
+ @config.mkdir(:otherdir)
end
- it "should provide a method to declare what directories should exist" do
- pending "Not converted from test/unit yet"
+ it "should be able to create needed directories in a single section" do
+ Dir.expects(:mkdir).with("/maindir")
+ Dir.expects(:mkdir).with("/seconddir")
+ @config.use(:main)
+ end
+
+ it "should be able to create needed directories in multiple sections" do
+ Dir.expects(:mkdir).with("/maindir")
+ Dir.expects(:mkdir).with("/otherdir", 0755)
+ Dir.expects(:mkdir).with("/seconddir")
+ @config.use(:main, :other)
end
it "should provide a method to trigger enforcing of file modes on existing files and directories" do
@@ -408,19 +426,110 @@ describe Puppet::Util::Config, " when being used to manage the host machine" do
pending "Not converted from test/unit yet"
end
- it "should provide an option to create needed users and groups" do
+ it "should create files when configured to do so with the :create parameter"
+
+ it "should provide a method to convert the file mode enforcement into transportable resources" do
+ # Make it think we're root so it tries to manage user and group.
+ Puppet.features.stubs(:root?).returns(true)
+ File.stubs(:exist?).with("/myfile").returns(true)
+ trans = nil
+ trans = @config.to_transportable
+ resources = []
+ trans.delve { |obj| resources << obj if obj.is_a? Puppet::TransObject }
+ %w{/maindir /seconddir /otherdir /myfile}.each do |path|
+ obj = resources.find { |r| r.type == "file" and r.name == path }
+ if path.include?("dir")
+ obj[:ensure].should == :directory
+ else
+ # Do not create the file, just manage mode
+ obj[:ensure].should be_nil
+ end
+ obj.should be_instance_of(Puppet::TransObject)
+ case path
+ when "/otherdir":
+ obj[:owner].should == "luke"
+ obj[:group].should == "johnny"
+ obj[:mode].should == 0755
+ when "/myfile":
+ obj[:mode].should == 0755
+ end
+ end
+ end
+
+ it "should not try to manage user or group when not running as root" do
+ Puppet.features.stubs(:root?).returns(false)
+ trans = nil
+ trans = @config.to_transportable(:other)
+ trans.delve do |obj|
+ next unless obj.is_a?(Puppet::TransObject)
+ obj[:owner].should be_nil
+ obj[:group].should be_nil
+ end
+ end
+
+ it "should add needed users and groups to the manifest when asked" do
+ # This is how we enable user/group management
+ @config.setdefaults :main, :mkusers => [true, "w"]
+ Puppet.features.stubs(:root?).returns(false)
+ trans = nil
+ trans = @config.to_transportable(:other)
+ resources = []
+ trans.delve { |obj| resources << obj if obj.is_a? Puppet::TransObject and obj.type != "file" }
+
+ user = resources.find { |r| r.type == "user" }
+ user.should be_instance_of(Puppet::TransObject)
+ user.name.should == "luke"
+ user[:ensure].should == :present
+
+ # This should maybe be a separate test, but...
+ group = resources.find { |r| r.type == "group" }
+ group.should be_instance_of(Puppet::TransObject)
+ group.name.should == "johnny"
+ group[:ensure].should == :present
+ end
+
+ it "should ignore tags and schedules when creating files and directories"
+
+ it "should apply all resources in debug mode to reduce logging"
+
+ it "should not try to manage absent files" do
+ # Make it think we're root so it tries to manage user and group.
+ Puppet.features.stubs(:root?).returns(true)
+ trans = nil
+ trans = @config.to_transportable
+ file = nil
+ trans.delve { |obj| file = obj if obj.name == "/myfile" }
+ file.should be_nil
+ end
+
+ it "should be able to turn the current configuration into a parseable manifest"
+
+ it "should convert octal numbers correctly when producing a manifest"
+
+ it "should be able to provide all of its parameters in a format compatible with GetOpt::Long" do
pending "Not converted from test/unit yet"
end
- it "should provide a method to print out the current configuration" do
+ it "should not attempt to manage files within /dev" do
pending "Not converted from test/unit yet"
end
- it "should be able to provide all of its parameters in a format compatible with GetOpt::Long" do
- pending "Not converted from test/unit yet"
+ it "should not modify the stored state database when managing resources" do
+ Puppet::Util::Storage.expects(:store).never
+ Puppet::Util::Storage.expects(:load).never
+ Dir.expects(:mkdir).with("/maindir")
+ @config.use(:main)
end
- it "should not attempt to manage files within /dev" do
- pending "Not converted from test/unit yet"
+ it "should convert all relative paths to fully-qualified paths (#795)" do
+ @config[:myfile] = "unqualified"
+ dir = Dir.getwd
+ @config[:myfile].should == File.join(dir, "unqualified")
+ end
+
+ it "should support a method for re-using all currently used sections" do
+ Dir.expects(:mkdir).with(@config[:otherdir], 0755).times(2)
+ @config.use(:other)
+ @config.reuse
end
end