#
# 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 "test_helper.rb"

class CloundEntryPointBehavior < CIMI::Test::Spec

  ROOTS = [ "resourceMetadata", "systems", "systemTemplates",
            "machines" , "machineTemplates", "machineConfigs",
            "machineImages", "credentials", "credentialTemplates",
            "volumes", "volumeTemplates", "volumeConfigs", "volumeImages",
            "networks", "networkTemplates", "networkConfigs", "networkPorts",
            "networkPortTemplates", "networkPortConfigs",
            "addresses", "addressTemplates", "forwardingGroups",
            "forwardingGroupTemplates",
            "jobs", "meters", "meterTemplates", "meterConfigs",
            "eventLogs", "eventLogTemplates" ]

  RESOURCE_URI = "http://schemas.dmtf.org/cimi/1/CloudEntryPoint"

  #  Ensure test executes in test plan order
  i_suck_and_my_tests_are_order_dependent!

  # We'd like to call this :cep, but there's already a method by that name
  model :subject, :cache => true do |fmt|
    cep(:accept => fmt)
  end

  it "should have a valid baseURI" do
    subject.base_uri.must_be_uri
    subject.base_uri.must_match %r{/$}
  end

  it "should have a name" do
    subject.name.wont_be_empty
  end

  it "should have a response code equal to 200" do
    subject
    last_response.code.must_equal 200
  end

  it "should have the correct resourceURI", :only => :json do
    subject.wont_be_nil     # Make sure we talk to the server
    last_response.json["resourceURI"].must_equal RESOURCE_URI
  end

  query_the_cep(ROOTS)

  it "should handle Accept of */*", :only => :json do
    response = RestClient.get(api.cep_url, "Accept" => "*/*")
    response.content_type.must_be_one_of CONTENT_TYPES.values
  end
end
