blob: 65e5a0a60c1c4242cc1f61a5e0e9b911e7ecf85b [file] [log] [blame]
#
# 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.
$:.unshift File.join(File.dirname(__FILE__), '..')
require "deltacloud/test_setup.rb"
describe "Deltacloud API Entry Point" do
include Deltacloud::Test::Methods
# Get the API entrypoint without any authentication
def get_api(params={})
get("/", params) #, params.update(:noauth => true))
end
it 'return status 200 OK when accessing API entrypoint' do
res = get_api
res.code.must_equal 200
end
it 'advertise the current driver in API entrypoint' do
res = get_api
driver = res.xml.root[:driver]
driver.wont_be_nil
api.drivers.include?(driver).must_equal true
end
it 'advertise the current API version in API entrypoint' do
res = get_api
version = res.xml.root[:version]
version.wont_be_nil
version.must_equal api.version
end
it 'advertise the current API version in HTTP headers' do
res = get_api
res.headers[:server].must_equal "Apache-Deltacloud/#{api.version}"
end
it 'must include the ETag in HTTP headers' do
res = get_api
res.headers[:etag].wont_be_nil
end
it 'advertise collections in API entrypoint' do
res = get_api
res.xml.xpath('//api/link').wont_be_empty
end
it 'include the :href and :rel attribute for each collection in API entrypoint' do
get_api().xml.xpath("//api/link").each do |collection|
collection[:href].wont_be_nil
collection[:rel].wont_be_nil
end
end
it 'uses the absolute URI in the :href attribute for each collection in API entrypoint' do
get_api().xml.xpath("//api/link").each do |collection|
collection[:href].must_match /^http/
end
end
it 'advertise features for some collections in API entrypoint' do
doc = get_api()
doc.xml.xpath("//api/link/feature").wont_be_empty
end
it 'advertise the name of the feature for some collections in API entrypoint' do
get_api().xml.xpath("//api/link/feature").each do |feature|
feature[:name].wont_be_nil
end
end
it 'must change the media type from XML to JSON using Accept headers' do
res = get_api(:accept => :json)
res.headers[:content_type].must_equal 'application/json'
end
it 'must change the media type to JSON using the "?format" parameter in URL' do
res = get_api(:format => :json)
res.headers[:content_type].must_equal 'application/json'
end
it 'must change the driver when using X-Deltacloud-Driver HTTP header' do
res = get_api(:driver => 'ec2')
res.xml.root[:driver].must_equal 'ec2'
res = get_api(:driver => 'mock')
res.xml.root[:driver].must_equal 'mock'
end
it 'must change the features when driver is swapped using HTTP headers' do
res = get_api(:driver => 'ec2')
# The 'user_name' feature is not supported currently for the EC2 driver
(res.xml/'api/link/feature').map { |f| f[:name] }.wont_include 'user_name'
res = get_api(:driver => 'mock')
# But it's supported in Mock driver
(res.xml/'api/link/feature').map { |f| f[:name] }.must_include 'user_name'
end
it 'must re-validate the driver credentials when using "?force_auth" parameter in URL' do
proc do
get_api(:noauth=> true, :force_auth => '1')
end.must_raise RestClient::Request::Unauthorized
res = get("/", :driver => "mock", :force_auth => '1',
:user => "mockuser", :password => "mockpassword")
res.code.must_equal 200
end
it 'must change the API PROVIDER using the /api;provider matrix parameter in URI' do
res = get(";driver=mock;provider=test1")
res.xml.root[:provider].wont_be_nil
res.xml.root[:provider].must_equal 'test1'
res = get(";driver=mock;provider=test2")
res.xml.root[:provider].must_equal 'test2'
end
it 'must change the API DRIVER using the /api;driver matrix parameter in URI' do
res = get(";driver=ec2", :noauth=>true)
res.xml.root[:driver].must_equal 'ec2'
res = get(";driver=mock", :noauth=>true)
res.xml.root[:driver].must_equal 'mock'
end
end