summaryrefslogtreecommitdiffstats
path: root/spec/unit/indirector/indirection.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/unit/indirector/indirection.rb')
-rwxr-xr-xspec/unit/indirector/indirection.rb122
1 files changed, 102 insertions, 20 deletions
diff --git a/spec/unit/indirector/indirection.rb b/spec/unit/indirector/indirection.rb
index e9b10c8c7..2aead4abf 100755
--- a/spec/unit/indirector/indirection.rb
+++ b/spec/unit/indirector/indirection.rb
@@ -10,44 +10,93 @@ describe Puppet::Indirector::Indirection, " when initializing" do
@indirection.name.should == :myind
end
- it "should set any passed options" do
- @indirection = Puppet::Indirector::Indirection.new(:myind, :to => :node_source)
- @indirection.to.should == :node_source
+ it "should require indirections to have unique names" do
+ @indirection = Puppet::Indirector::Indirection.new(:test)
+ proc { Puppet::Indirector::Indirection.new(:test) }.should raise_error(ArgumentError)
end
- it "should only allow valid configuration parameters to be specified as :to targets" do
- proc { Puppet::Indirector::Indirection.new(:myind, :to => :no_such_variable) }.should raise_error(ArgumentError)
+ after do
+ @indirection.delete if defined? @indirection
+ end
+end
+
+describe Puppet::Indirector::Indirection, " when choosing terminus types" do
+ before do
+ @indirection = Puppet::Indirector::Indirection.new(:test)
+ @terminus = mock 'terminus'
+ @terminus_class = stub 'terminus class', :new => @terminus
+ end
+
+ 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.expects(:terminus).with(:test, :foo).returns(@terminus_class)
+ @indirection.terminus.should equal(@terminus)
+ end
+
+ it "should use a default system-wide configuration parameter parameter to determine the terminus class when no
+ 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.expects(:terminus).with(:test, :foo).returns(@terminus_class)
+ @indirection.terminus.should equal(@terminus)
+ end
+
+ it "should select the specified terminus class if a name is provided" do
+ Puppet::Indirector.expects(:terminus).with(:test, :foo).returns(@terminus_class)
+ @indirection.terminus(:foo).should equal(@terminus)
+ end
+
+ it "should fail when the terminus class name is an empty string" do
+ proc { @indirection.terminus("") }.should raise_error(ArgumentError)
+ end
+
+ it "should fail when the terminus class name is nil" do
+ proc { @indirection.terminus(nil) }.should raise_error(ArgumentError)
+ end
+
+ it "should fail when the specified terminus class cannot be found" do
+ Puppet::Indirector.expects(:terminus).with(:test, :foo).returns(nil)
+ proc { @indirection.terminus(:foo) }.should raise_error(ArgumentError)
end
after do
- if defined? @indirection
- @indirection.delete
- end
+ @indirection.delete if defined? @indirection
end
end
-describe Puppet::Indirector, " when managing termini" do
+describe Puppet::Indirector::Indirection, " when managing terminus instances" do
before do
- @indirection = Puppet::Indirector::Indirection.new(:node, :to => :node_source)
+ @indirection = Puppet::Indirector::Indirection.new(:test)
+ @terminus = mock 'terminus'
+ @terminus_class = mock 'terminus class'
+ Puppet::Indirector.stubs(:terminus).with(:test, :foo).returns(@terminus_class)
+ end
+
+ it "should create an instance of the chosen terminus class" do
+ @terminus_class.stubs(:new).returns(@terminus)
+ @indirection.terminus(:foo).should equal(@terminus)
end
- it "should allow the clearance of cached termini" do
+ it "should allow the clearance of cached terminus instances" do
terminus1 = mock 'terminus1'
terminus2 = mock 'terminus2'
- Puppet::Indirector.terminus(:node, Puppet[:node_source]).stubs(:new).returns(terminus1, terminus2, ArgumentError)
- @indirection.terminus.should equal(terminus1)
+ @terminus_class.stubs(:new).returns(terminus1, terminus2, ArgumentError)
+ @indirection.terminus(:foo).should equal(terminus1)
@indirection.class.clear_cache
- @indirection.terminus.should equal(terminus2)
+ @indirection.terminus(:foo).should equal(terminus2)
end
# Make sure it caches the terminus.
- it "should return the same terminus each time" do
- @indirection = Puppet::Indirector::Indirection.new(:node, :to => :node_source)
- @terminus = mock 'new'
- Puppet::Indirector.terminus(:node, Puppet[:node_source]).expects(:new).returns(@terminus)
+ it "should return the same terminus instance each time for a given name" do
+ @terminus_class.stubs(:new).returns(@terminus)
+ @indirection.terminus(:foo).should equal(@terminus)
+ @indirection.terminus(:foo).should equal(@terminus)
+ end
- @indirection.terminus.should equal(@terminus)
- @indirection.terminus.should equal(@terminus)
+ it "should not create a terminus instance until one is actually needed" do
+ Puppet::Indirector.expects(:terminus).never
+ indirection = Puppet::Indirector::Indirection.new(:lazytest)
end
after do
@@ -55,3 +104,36 @@ describe Puppet::Indirector, " when managing termini" do
Puppet::Indirector::Indirection.clear_cache
end
end
+
+describe Puppet::Indirector::Indirection do
+ before do
+ @indirection = Puppet::Indirector::Indirection.new(:test)
+ @terminus = mock 'terminus'
+ @indirection.stubs(:terminus).returns(@terminus)
+ end
+
+ it "should handle lookups of a model instance by letting the appropriate terminus perform the lookup" do
+ @terminus.expects(:find).with(:mything).returns(:whev)
+ @indirection.find(:mything).should == :whev
+ end
+
+ it "should handle removing model instances from a terminus letting the appropriate terminus remove the instance" do
+ @terminus.expects(:destroy).with(:mything).returns(:whev)
+ @indirection.destroy(:mything).should == :whev
+ end
+
+ it "should handle searching for model instances by letting the appropriate terminus find the matching instances" do
+ @terminus.expects(:search).with(:mything).returns(:whev)
+ @indirection.search(:mything).should == :whev
+ end
+
+ it "should handle storing a model instance by letting the appropriate terminus store the instance" do
+ @terminus.expects(:save).with(:mything).returns(:whev)
+ @indirection.save(:mything).should == :whev
+ end
+
+ after do
+ @indirection.delete
+ Puppet::Indirector::Indirection.clear_cache
+ end
+end