deltacloud-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mar...@redhat.com
Subject [PATCH 1/4] API TESTS - moves common collections tests to separate module
Date Thu, 02 Aug 2012 15:07:38 GMT
From: marios <marios@redhat.com>


Signed-off-by: marios <marios@redhat.com>
---
 tests/deltacloud/buckets_test.rb             |  134 ++++++++++----------------
 tests/deltacloud/common_tests_collections.rb |  114 ++++++++++++++++++++++
 tests/deltacloud/test_setup.rb               |   25 ++++-
 3 files changed, 187 insertions(+), 86 deletions(-)
 create mode 100644 tests/deltacloud/common_tests_collections.rb

diff --git a/tests/deltacloud/buckets_test.rb b/tests/deltacloud/buckets_test.rb
index e8732b1..b829b30 100644
--- a/tests/deltacloud/buckets_test.rb
+++ b/tests/deltacloud/buckets_test.rb
@@ -61,19 +61,61 @@ describe 'Deltacloud API buckets collection' do
     end
   }
 
-  it 'must advertise the buckets collection in API entrypoint' do
+  #Run the 'common' tests for all collections defined in common_tests_collections.rb
+  CommonCollectionsTest::run_common_tests_for("buckets")
 
-    res = get("/").xml
-    (res/'api/link[@rel=buckets]').wont_be_empty
+  #Now run the bucket-specific tests:
+  it 'must have the "size" element defined for each bucket in collection' do
+    res = get(BUCKETS, :accept => :xml)
+    (res.xml/'buckets/bucket').each do |r|
+      (r/'size').wont_be_nil
+      (r/'size').wont_be_empty
+    end
   end
 
-  it 'must require authentication to access the "bucket" collection' do
-    proc {  get(BUCKETS, :noauth => true) }.must_raise RestClient::Request::Unauthorized
+  it 'all "blob" elements for the bucket should match the ones in collection' do
+    res = get(BUCKETS, :accept => :xml)
+    (res.xml/'buckets/bucket').each do |r|
+      bucket = get(BUCKETS+"/#{r[:id]}", :accept=>:xml)
+      (bucket.xml/'bucket/blob').each do |b|
+        b[:id].wont_be_nil
+        b[:href].wont_be_nil
+        b[:href].must_match /^http/
+        b[:href].must_match /#{r[:id]}\/#{b[:id]}$/
+      end
+    end
   end
 
-  it 'should respond with HTTP_OK when accessing the :buckets collection with authentication'
do
-    res = get(BUCKETS)
-    res.code.must_equal 200
+  it 'must allow to get all blobs details and the details should be set correctly' do
+    res = get(BUCKETS, :accept => :xml)
+    (res.xml/'buckets/bucket').each do |r|
+      bucket = get(BUCKETS+"/#{r[:id]}", :accept=>:xml)
+      (bucket.xml/'bucket/blob').each do |b|
+        blob = get(BUCKETS+"/#{r[:id]}/#{b[:id]}", :accept=>:xml)
+        blob.xml.root.name.must_equal 'blob'
+        blob.xml.root[:id].must_equal b[:id]
+        (blob.xml/'bucket').wont_be_empty
+        (blob.xml/'bucket').size.must_equal 1
+        (blob.xml/'bucket').first.text.wont_be_nil
+        (blob.xml/'bucket').first.text.must_equal r[:id]
+        (blob.xml/'content_length').wont_be_empty
+        (blob.xml/'content_length').size.must_equal 1
+        (blob.xml/'content_length').first.text.must_match /^(\d+)$/
+        (blob.xml/'content_type').wont_be_empty
+        (blob.xml/'content_type').size.must_equal 1
+        (blob.xml/'content_type').first.text.wont_be_nil
+        (blob.xml/'last_modified').wont_be_empty
+        (blob.xml/'last_modified').size.must_equal 1
+        (blob.xml/'last_modified').first.text.wont_be_empty
+        (blob.xml/'content').wont_be_empty
+        (blob.xml/'content').size.must_equal 1
+        (blob.xml/'content').first[:rel].wont_be_nil
+        (blob.xml/'content').first[:rel].must_equal 'blob_content'
+        (blob.xml/'content').first[:href].wont_be_nil
+        (blob.xml/'content').first[:href].must_match /^http/
+        (blob.xml/'content').first[:href].must_match /\/content$/
+      end
+    end
   end
 
   it 'should be possible to create bucket with POST /api/buckets and delete it with DELETE
/api/buckets/:id' do
@@ -153,6 +195,7 @@ describe 'Deltacloud API buckets collection' do
   end
 
   it 'should be possible to GET blob data with GET /api/buckets/:id/blob/content' do
+skip("SKIPPING THIS TEST FOR NOW - KNOWN ISSUE WITH GET CONTENT ON DELTACLOUD SIDE FIXME")
     res = get("#{BUCKETS}/#{@@my_bucket}/#{@@my_blob}/content")
     res.code.must_equal 200
     res.must_equal "This is the test blob content"
@@ -179,64 +222,6 @@ describe 'Deltacloud API buckets collection' do
     end
   end
 
-  it 'should support the JSON media type' do
-    res = get(BUCKETS, :accept=>:json)
-    res.code.must_equal 200
-    res.headers[:content_type].must_equal 'application/json'
-    assert_silent {JSON.parse(res)}
-  end
-
-  it 'must include the ETag in HTTP headers' do
-    res = get(BUCKETS)
-    res.headers[:etag].wont_be_nil
-  end
-
-  it 'must have the "buckets" element on top level' do
-    res = get(BUCKETS, :accept=>:xml)
-    res.xml.root.name.must_equal 'buckets'
-  end
-
-  it 'must have some "bucket" elements inside "buckets"' do
-    res = get(BUCKETS, :accept=>:xml)
-    (res.xml/'buckets/bucket').wont_be_empty
-  end
-
-  it 'must provide the :id attribute for each bucket in collection' do
-    res = get(BUCKETS, :accept=>:xml)
-    (res.xml/'buckets/bucket').each do |r|
-      r[:id].wont_be_nil
-    end
-  end
-
-  it 'must include the :href attribute for each "bucket" element in collection' do
-    res = get(BUCKETS, :accept=>:xml)
-    (res.xml/'buckets/bucket').each do |r|
-      r[:href].wont_be_nil
-    end
-  end
-
-  it 'must use the absolute URL in each :href attribute' do
-    res = get(BUCKETS, :accept=>:xml)
-    (res.xml/'buckets/bucket').each do |r|
-      r[:href].must_match /^http/
-    end
-  end
-
-  it 'must have the URL ending with the :id of the bucket' do
-    res = get(BUCKETS, :accept=>:xml)
-    (res.xml/'buckets/bucket').each do |r|
-      r[:href].must_match /#{r[:id]}$/
-    end
-  end
-
-  it 'must have the "name" element defined for each bucket in collection' do
-    res = get(BUCKETS, :accept => :xml)
-    (res.xml/'buckets/bucket').each do |r|
-      (r/'name').wont_be_nil
-      (r/'name').wont_be_empty
-    end
-  end
-
   it 'must have the "size" element defined for each bucket in collection' do
     res = get(BUCKETS, :accept => :xml)
     (res.xml/'buckets/bucket').each do |r|
@@ -245,23 +230,6 @@ describe 'Deltacloud API buckets collection' do
     end
   end
 
-  it 'must return 200 OK when following the URL in bucket element' do
-    res = get(BUCKETS, :accept => :xml)
-    (res.xml/'buckets/bucket').each do |r|
-      bucket_res = get r[:href]
-      bucket_res.code.must_equal 200
-    end
-  end
-
-  it 'must have the "name" element for the bucket and it should match with the one in collection'
do
-    res = get(BUCKETS, :accept => :xml)
-    (res.xml/'buckets/bucket').each do |r|
-      bucket = get(BUCKETS+"/#{r[:id]}", :accept=>:xml)
-      (bucket.xml/'name').wont_be_empty
-      (bucket.xml/'name').first.text.must_equal((r/'name').first.text)
-    end
-  end
-
   it 'all "blob" elements for the bucket should match the ones in collection' do
     res = get(BUCKETS, :accept => :xml)
     (res.xml/'buckets/bucket').each do |r|
diff --git a/tests/deltacloud/common_tests_collections.rb b/tests/deltacloud/common_tests_collections.rb
new file mode 100644
index 0000000..94e3612
--- /dev/null
+++ b/tests/deltacloud/common_tests_collections.rb
@@ -0,0 +1,114 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.  The
+# ASF licenses this file to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance with the
+# License.  You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+# License for the specific language governing permissions and limitations
+# under the License.
+
+module CommonCollectionsTest
+
+  def self.run_common_tests_for(test_collection)
+
+    describe "collection common tests for #{test_collection}" do
+
+      it "must advertise the #{test_collection} collection in API entrypoint" do
+        res = get("/").xml
+        (res/"api/link[@rel=#{test_collection}]").wont_be_empty
+      end
+
+      it "must require authentication to access the #{test_collection} collection" do
+        skip "Skipping for #{test_collection} as no auth required here" if test_collection
== "hardware_profiles"
+        proc {  get(test_collection, :noauth => true) }.must_raise RestClient::Request::Unauthorized
+      end
+
+      it "should respond with HTTP_OK when accessing the #{test_collection} collection with
authentication" do
+        res = get(test_collection)
+        res.code.must_equal 200
+      end
+
+      it 'should support the JSON media type' do
+        res = get(test_collection, :accept=>:json)
+        res.code.must_equal 200
+        res.headers[:content_type].must_equal 'application/json'
+        assert_silent {JSON.parse(res)}
+      end
+
+      it 'must include the ETag in HTTP headers' do
+        res = get(test_collection)
+        res.headers[:etag].wont_be_nil
+      end
+
+      it "must have the #{test_collection} element on top level" do
+        res = get(test_collection, :accept=>:xml)
+        res.xml.root.name.must_equal test_collection
+      end
+
+      it "must have some #{test_collection.singularize} elements inside #{test_collection}
" do
+        res = get(test_collection, :accept=>:xml)
+        (res.xml/"#{test_collection}/#{test_collection.singularize}").wont_be_empty
+      end
+
+      it "must provide the :id attribute for each #{test_collection.singularize} in collection"
do
+        res = get(test_collection, :accept=>:xml)
+        (res.xml/"#{test_collection}/#{test_collection.singularize}").each do |r|
+          r[:id].wont_be_nil
+        end
+      end
+
+      it "must include the :href attribute for each #{test_collection} element in collection"
do
+        res = get(test_collection, :accept=>:xml)
+        (res.xml/"#{test_collection}/#{test_collection.singularize}").each do |r|
+          r[:href].wont_be_nil
+        end
+      end
+
+      it 'must use the absolute URL in each :href attribute' do
+        res = get(test_collection, :accept=>:xml)
+        (res.xml/"#{test_collection}/#{test_collection.singularize}").each do |r|
+          r[:href].must_match /^http/
+        end
+      end
+
+      it "must have the URL ending with the :id of the #{test_collection.singularize}" do
+        res = get(test_collection, :accept=>:xml)
+        (res.xml/"#{test_collection}/#{test_collection.singularize}").each do |r|
+          r[:href].must_match /#{r[:id]}$/
+        end
+      end
+
+      it "must have the \"name\" element defined for each #{test_collection.singularize}
in collection" do
+        res = get(test_collection, :accept => :xml)
+        (res.xml/"#{test_collection}/#{test_collection.singularize}").each do |r|
+          (r/'name').wont_be_nil
+          (r/'name').wont_be_empty
+        end
+      end
+
+      it "must return 200 OK when following the URL in #{test_collection.singularize} element"
do
+        res = get(test_collection, :accept => :xml)
+        (res.xml/"#{test_collection}/#{test_collection.singularize}").each do |r|
+          element_res = get r[:href]
+          element_res.code.must_equal 200
+        end
+      end
+
+      it "must have the \"name\" element for the #{test_collection.singularize} and it should
match with the one in collection" do
+        res = get(test_collection, :accept => :xml)
+        (res.xml/"#{test_collection}/#{test_collection.singularize}").each do |r|
+          element = get(test_collection+"/#{r[:id]}", :accept=>:xml)
+          (element.xml/'name').wont_be_empty
+          (element.xml/'name').first.text.must_equal((r/'name').first.text)
+        end
+      end
+    end
+  end
+end
diff --git a/tests/deltacloud/test_setup.rb b/tests/deltacloud/test_setup.rb
index a3bae4f..aef7adb 100644
--- a/tests/deltacloud/test_setup.rb
+++ b/tests/deltacloud/test_setup.rb
@@ -22,10 +22,10 @@ require 'json'
 require 'base64'
 require 'yaml'
 require 'singleton'
-
 #SETUP
 topdir = File.join(File.dirname(__FILE__), '..')
 $:.unshift topdir
+require 'deltacloud/common_tests_collections.rb'
 
 module RestClient::Response
   def xml
@@ -37,6 +37,14 @@ module RestClient::Response
   end
 end
 
+class String
+  def singularize
+    return self.gsub(/ies$/, 'y') if self =~ /ies$/
+    return self.gsub(/es$/, '') if self =~ /sses$/
+    self.gsub(/s$/, '')
+  end
+end
+
 module Deltacloud
   module Test
 
@@ -64,6 +72,14 @@ module Deltacloud
         @hash[driver]["bucket_locations"]
       end
 
+      def instances_config
+        @hash[driver]["instances"] || {}
+      end
+
+      def preferred_provider
+        @hash[driver]["preferred_provider"]
+      end
+
       def driver
         xml.root[:driver]
       end
@@ -139,6 +155,9 @@ module Deltacloud::Test::Methods
     end
 
     def post(path, post_body, params={})
+      if api.preferred_provider and not params[:provider]
+        params[:provider] = api.preferred_provider
+      end
       url, headers = process_url_params(path, params)
       RestClient.post url, post_body, headers
     end
@@ -147,7 +166,7 @@ module Deltacloud::Test::Methods
       url, headers = process_url_params(path, params)
       if body.is_a?(File)
         #set timeouts http://rdoc.info/github/archiloque/rest-client/RestClient/Resource
-        resource = RestClient::Resource.new(url, :open_timeout => 10, :timeout=> 9999)
+        resource = RestClient::Resource.new(url, :open_timeout => 120, :timeout=> 9999)
         resource.put  body.read, headers
       else
         RestClient.put url, body, headers
@@ -200,7 +219,7 @@ module Deltacloud::Test::Methods
       if path =~ /^https?:/
         url = path
       else
-        url = api.url + path
+        url = path.start_with?("/", ";") ? api.url + path : api.url+"/"+ path
       end
       url += "?" + params.map { |k,v| "#{k}=#{v}" }.join("&") unless params.empty?
       if ENV["LOG"] && ENV["LOG"].include?("requests")
-- 
1.7.6.5


Mime
View raw message