#
# 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.

require 'rubygems'
require 'minitest/autorun'
require 'rest_client'
require 'nokogiri'
require 'json'
require 'base64'
require 'yaml'

module RestClient::Response
  # Only return the raw content type without parameters
  def content_type
    if headers[:content_type]
      headers[:content_type].split(";").first
    end
  end

  def location
    headers[:location]
  end

  def xml
    @xml ||= Nokogiri::XML(body)
  end

  def json
    @json ||= JSON.parse(body)
  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
  def pluralize
    return self + 'es' if self =~ /ess$/
    return self[0, self.length-1] + "ies" if self =~ /ty$/
    return self if self =~ /data$/
    self + "s"
  end
end

class Array
  alias :original_method_missing :method_missing

  def method_missing(name, *args)
    if name == :choice
      return self.sample(*args)
    end
    original_method_missing(name, *args)
  end
end

module Deltacloud
  module Test

    def self.yaml_config
      fname = ENV["CONFIG"] || File::join(File::dirname(__FILE__), "..",
                                          "config.yaml")
      YAML.load(File::open(fname))
    end
  end
end

# Add an assertion for URI's
module MiniTest::Assertions
  def assert_uri(obj, msg = nil)
    msg = message(msg) { "Expected #{mu_pp(obj)} to be a valid URI" }
    refute_nil obj, msg
    refute_empty obj, msg
    begin
      u = URI.parse(obj)
      refute_nil u.path, msg
    rescue => e
      fail "Could not parse URI #{mu_pp(obj)}"
    end
  end
end

MiniTest::Expectations::infect_an_assertion :assert_uri, :must_be_uri, :unary
MiniTest::Expectations::infect_an_assertion :assert_includes, :must_be_one_of
