summaryrefslogtreecommitdiffstats
path: root/spec/unit
diff options
context:
space:
mode:
authorLuke Kanies <luke@madstop.com>2009-03-13 01:38:47 -0500
committerJames Turnbull <james@lovedthanlost.net>2009-03-20 18:27:07 +1100
commit8b13390819f9aec9f344a72b3c0b3b6609f6209d (patch)
tree6861f1f6648076cffd0a0b0f30e3d00e83e96667 /spec/unit
parentedf00dba76b65108b443af8d0636073cb3d9d975 (diff)
downloadpuppet-8b13390819f9aec9f344a72b3c0b3b6609f6209d.tar.gz
puppet-8b13390819f9aec9f344a72b3c0b3b6609f6209d.tar.xz
puppet-8b13390819f9aec9f344a72b3c0b3b6609f6209d.zip
Adding REST::Handler methods for converting between indirection and uris
This is the first main phase to having a common module for handling the REST api - this Handler module will be included by all of the web server REST modules and the Indirector Request class, so there's a common place that understands how the URI consists. Signed-off-by: Luke Kanies <luke@madstop.com>
Diffstat (limited to 'spec/unit')
-rwxr-xr-xspec/unit/network/http/handler.rb101
-rwxr-xr-xspec/unit/node/environment.rb4
2 files changed, 105 insertions, 0 deletions
diff --git a/spec/unit/network/http/handler.rb b/spec/unit/network/http/handler.rb
index 6f1a57b8b..fc73cc131 100755
--- a/spec/unit/network/http/handler.rb
+++ b/spec/unit/network/http/handler.rb
@@ -12,6 +12,107 @@ describe Puppet::Network::HTTP::Handler do
@handler = HttpHandled.new
end
+ it "should be able to convert a URI into a request" do
+ @handler.should respond_to(:uri2indirection)
+ end
+
+ it "should be able to convert a request into a URI" do
+ @handler.should respond_to(:indirection2uri)
+ end
+
+ describe "when converting a URI into a request" do
+ before do
+ @handler.stubs(:handler).returns "foo"
+ end
+
+ it "should require the http method, the URI, and the query parameters" do
+ # Not a terribly useful test, but an important statement for the spec
+ lambda { @handler.uri2indirection("/foo") }.should raise_error(ArgumentError)
+ end
+
+ it "should use the first field of the URI as the environment" do
+ @handler.uri2indirection("GET", "/env/foo/bar", {}).environment.should == Puppet::Node::Environment.new("env")
+ end
+
+ it "should fail if the environment is not alphanumeric" do
+ lambda { @handler.uri2indirection("GET", "/env ness/foo/bar", {}) }.should raise_error(ArgumentError)
+ end
+
+ it "should use the environment from the URI even if one is specified in the parameters" do
+ @handler.uri2indirection("GET", "/env/foo/bar", {:environment => "otherenv"}).environment.should == Puppet::Node::Environment.new("env")
+ end
+
+ it "should use the second field of the URI as the indirection name" do
+ @handler.uri2indirection("GET", "/env/foo/bar", {}).indirection_name.should == :foo
+ end
+
+ it "should fail if the indirection name is not alphanumeric" do
+ lambda { @handler.uri2indirection("GET", "/env/foo ness/bar", {}) }.should raise_error(ArgumentError)
+ end
+
+ it "should use the remainder of the URI as the indirection key" do
+ @handler.uri2indirection("GET", "/env/foo/bar", {}).key.should == "bar"
+ end
+
+ it "should support the indirection key being a /-separated file path" do
+ @handler.uri2indirection("GET", "/env/foo/bee/baz/bomb", {}).key.should == "bee/baz/bomb"
+ end
+
+ it "should choose 'find' as the indirection method if the http method is a GET and the indirection name is singular" do
+ @handler.uri2indirection("GET", "/env/foo/bar", {}).method.should == :find
+ end
+
+ it "should choose 'search' as the indirection method if the http method is a GET and the indirection name is plural" do
+ @handler.uri2indirection("GET", "/env/foos/bar", {}).method.should == :search
+ end
+
+ it "should choose 'delete' as the indirection method if the http method is a DELETE and the indirection name is singular" do
+ @handler.uri2indirection("DELETE", "/env/foo/bar", {}).method.should == :destroy
+ end
+
+ it "should choose 'save' as the indirection method if the http method is a PUT and the indirection name is singular" do
+ @handler.uri2indirection("PUT", "/env/foo/bar", {}).method.should == :save
+ end
+
+ it "should fail if an indirection method cannot be picked" do
+ lambda { @handler.uri2indirection("UPDATE", "/env/foo/bar", {}) }.should raise_error(ArgumentError)
+ end
+
+ it "should URI unescape the indirection key" do
+ escaped = URI.escape("foo bar")
+ @handler.uri2indirection("GET", "/env/foo/#{escaped}", {}).key.should == "foo bar"
+ end
+ end
+
+ describe "when converting a request into a URI" do
+ before do
+ @request = Puppet::Indirector::Request.new(:foo, :find, "with spaces", :foo => :bar, :environment => "myenv")
+ end
+
+ it "should use the environment as the first field of the URI" do
+ @handler.indirection2uri(@request).split("/")[1].should == "myenv"
+ end
+
+ it "should use the indirection as the second field of the URI" do
+ @handler.indirection2uri(@request).split("/")[2].should == "foo"
+ end
+
+ it "should pluralize the indirection name if the method is 'search'" do
+ @request.stubs(:method).returns :search
+ @handler.indirection2uri(@request).split("/")[2].should == "foos"
+ end
+
+ it "should use the escaped key as the remainder of the URI" do
+ escaped = URI.escape("with spaces")
+ @handler.indirection2uri(@request).split("/")[3].sub(/\?.+/, '').should == escaped
+ end
+
+ it "should add the query string to the URI" do
+ @request.expects(:query_string).returns "?query"
+ @handler.indirection2uri(@request).should =~ /\?query$/
+ end
+ end
+
it "should have a method for initializing" do
@handler.should respond_to(:initialize_for_puppet)
end
diff --git a/spec/unit/node/environment.rb b/spec/unit/node/environment.rb
index 20889f071..dd6745f1e 100755
--- a/spec/unit/node/environment.rb
+++ b/spec/unit/node/environment.rb
@@ -19,6 +19,10 @@ describe Puppet::Node::Environment do
Puppet::Node::Environment.new(:one).should equal(Puppet::Node::Environment.new("one"))
end
+ it "should return its name when converted to a string" do
+ Puppet::Node::Environment.new(:one).to_s.should == "one"
+ end
+
it "should consider its module path to be the environment-specific modulepath setting" do
FileTest.stubs(:directory?).returns true
env = Puppet::Node::Environment.new("testing")