blob: 0f02272c878f7b68550e06a182f2d957598b8b98 [file] [log] [blame]
require 'rubygems'
require 'require_relative' if RUBY_VERSION < '1.9'
require_relative 'common.rb'
describe Deltacloud::API do
before do
def app; run_frontend; end
end
it 'has the config set property' do
Deltacloud::config[:deltacloud].must_be_kind_of Deltacloud::Server
root_url.must_equal Deltacloud[:deltacloud].root_url
end
it 'must provide the root_url entrypoint' do
get root_url
status.must_equal 200
xml.root.name.must_equal 'api'
end
it 'must advertise current API version in response headers' do
get root_url
headers['Server'].must_match(/Apache-Deltacloud\/(\d+).(\d+).(\d+)/)
xml.root.name.must_equal 'api'
end
it 'must advertise current API driver in response headers' do
get root_url
headers['X-Deltacloud-Driver'].must_equal Deltacloud[:deltacloud].default_driver.to_s
xml.root.name.must_equal 'api'
end
it 'must force authentication when :force_auth param set' do
get root_url, :force_auth => '1'
status.must_equal 401
authorize 'mockuser', 'mockpassword'
get root_url, :force_auth => '1'
status.must_equal 200
end
it 'must return list of collections on OPTIONS' do
options root_url
headers['Allow'].wont_be_nil
headers['Allow'].split(',').must_include 'Sinatra::Rabbit::DriversCollection'
end
it 'must support setting driver and provider using POST' do
post root_url, { :driver => :ec2 }
headers['Location'].wont_be_nil
headers['Location'].must_match(/\/api;driver=ec2/)
post root_url, { :provider => :test_provider }
headers['Location'].wont_be_nil
headers['Location'].must_match(/\/api;provider=test_provider/)
end
it 'must support matrix parameters for changing API driver' do
get root_url + ';driver=ec2'
headers['X-Deltacloud-Driver'].must_equal 'ec2'
xml.root.name.must_equal 'api'
end
it 'must support matrix parameters for changing API provider' do
get root_url + ';provider=someprovider'
headers['X-Deltacloud-Provider'].must_equal 'someprovider'
xml.root.name.must_equal 'api'
end
it 'must support matrix parameters for changing both API provider and driver' do
get root_url + ';provider=someprovider;driver=ec2'
headers['X-Deltacloud-Provider'].must_equal 'someprovider'
headers['X-Deltacloud-Driver'].must_equal 'ec2'
xml.root.name.must_equal 'api'
end
it 'must change driver back to default when no matrix param set' do
get root_url + ';driver=ec2'
headers['X-Deltacloud-Driver'].must_equal 'ec2'
get root_url
headers['X-Deltacloud-Driver'].must_equal Deltacloud[:deltacloud].default_driver.to_s
xml.root.name.must_equal 'api'
end
it 'must change provider back to default when no matrix param set' do
get root_url + ';provider=someprovider'
headers['X-Deltacloud-Provider'].must_equal 'someprovider'
get root_url
headers['X-Deltacloud-Provider'].must_be_nil
xml.root.name.must_equal 'api'
end
it 'must support matrix params when they are part of URL' do
get root_url + ';driver=ec2/hardware_profiles'
headers['X-Deltacloud-Driver'].must_equal 'ec2'
status.must_equal 200
xml.root.name.must_equal 'hardware_profiles'
end
it 'must switch driver using X-Deltacloud-Driver HTTP header in request' do
header 'X-Deltacloud-Driver', 'ec2'
get root_url
headers['X-Deltacloud-Driver'].must_equal 'ec2'
header 'X-Deltacloud-Driver', 'mock'
get root_url
headers['X-Deltacloud-Driver'].must_equal 'mock'
end
it 'must switch provider using X-Deltacloud-Provider HTTP header in request' do
header 'X-Deltacloud-Provider', 'someprovider'
get root_url
headers['X-Deltacloud-Provider'].must_equal 'someprovider'
header 'X-Deltacloud-Provider', nil
get root_url
headers['X-Deltacloud-Provider'].must_be_nil
end
it 'must support media type negotiation for JSON format' do
header 'Accept', 'application/json'
get root_url
status.must_equal 200
headers['Content-Type'].must_equal 'application/json'
JSON::parse(response_body).must_be_kind_of Hash
JSON::parse(response_body)['api'].must_be_kind_of Hash
end
it 'must support media type negotiation for HTML format' do
header 'Accept', 'text/html'
get root_url
status.must_equal 200
headers['Content-Type'].must_equal 'text/html'
response_body.must_match(/^<\!DOCTYPE html>/)
end
it 'must support media type negotiation for XML format' do
header 'Accept', 'application/xml'
get root_url
status.must_equal 200
headers['Content-Type'].must_equal 'application/xml'
xml.root.name.must_equal 'api'
end
it 'must return proper error when unknown media type requested' do
header 'Accept', 'application/unknown'
get root_url
status.must_equal 406
end
end