require 'test_helper'

class Aviator::Test

  describe 'aviator/openstack/compute/v2/public/list_servers' do

    def create_request(session_data = new_session_data)
      klass.new(session_data)
    end


    def new_session_data
      service = Aviator::Service.new(
        provider: Environment.openstack_admin[:provider],
        service:  Environment.openstack_admin[:auth_service][:name]
      )
      
      bootstrap = RequestHelper.admin_bootstrap_session_data
      
      response = service.request :create_token, session_data: bootstrap do |params|
        auth_credentials = Environment.openstack_admin[:auth_credentials]
        auth_credentials.each { |key, value| params[key] = auth_credentials[key] }
      end
      
      response.body
    end


    def helper
      Aviator::Test::RequestHelper
    end


    def klass
      @klass ||= helper.load_request('openstack', 'compute', 'v2', 'public', 'list_servers.rb')
    end


    validate_attr :anonymous? do
      klass.anonymous?.must_equal false
    end
    
    
    validate_attr :api_version do
      klass.api_version.must_equal :v2
    end


    validate_attr :body do
      klass.body?.must_equal false    
      create_request.body?.must_equal false
    end
    
    
    validate_attr :endpoint_type do
      klass.endpoint_type.must_equal :public
    end
    

    validate_attr :headers do
      session_data = new_session_data
      
      headers = { 'X-Auth-Token' => session_data[:access][:token][:id] }

      request = create_request(session_data)

      request.headers.must_equal headers
    end
    
    
    validate_attr :http_method do
      create_request.http_method.must_equal :get
    end


    validate_attr :optional_params do
      klass.optional_params.must_equal [
        :details,
        :flavor,
        :image,
        :limit,
        :marker,
        :server,
        :status,
        'changes-since'
      ]
    end


    validate_attr :required_params do
      klass.required_params.must_equal []
    end


    validate_attr :url do
      session_data = new_session_data
      service_spec = session_data[:access][:serviceCatalog].find{|s| s[:type] == 'compute' }
      url          = "#{ service_spec[:endpoints][0][:publicURL] }/servers"
            
      params = [
        [ :details, false      ],
        [ :flavor,  'm1.small' ],
        [ :image,   'cirros-0.3.1-x86_64-uec-ramdisk' ],
        [ :status,  'ACTIVE'                          ]
      ]
          
      url += "/detail" if params.first[1]
          
      filters = []
          
      params[1, params.length-1].each { |pair| filters << "#{ pair[0] }=#{ pair[1] }" }
      
      url += "?#{ filters.join('&') }" unless filters.empty?
      
      request = klass.new(session_data) do |p|
        params.each { |pair| p[pair[0]] = pair[1] }
      end
      
          
      request.url.must_equal url
    end
    
    
    validate_response 'no parameters are provided' do
      service = Aviator::Service.new(
        provider: 'openstack',
        service:  'compute',
        default_session_data: new_session_data
      )
      
      response = service.request :list_servers
      
      response.status.must_equal 200
      response.body.wont_be_nil
      response.body[:servers].length.wont_equal 0
      response.headers.wont_be_nil
    end
    
    
    validate_response 'parameters are invalid' do
      service = Aviator::Service.new(
        provider: 'openstack',
        service:  'compute',
        default_session_data: new_session_data
      )
      
      response = service.request :list_servers do |params|
        params[:image] = "nonexistentimagenameherpderp"
      end
      
      response.status.must_equal 200
      response.body.wont_be_nil
      response.body[:servers].length.must_equal 0
      response.headers.wont_be_nil
    end
    
    
    validate_response 'parameters are valid' do
      service = Aviator::Service.new(
        provider: 'openstack',
        service:  'compute',
        default_session_data: new_session_data
      )
      
      response = service.request :list_servers do |params|
        params[:details] = true
        params[:image] = 'c95d4992-24b1-4c9a-93cb-5d2935503148'
      end
      
      response.status.must_equal 200
      response.body.wont_be_nil
      response.body[:servers].length.must_equal 1
      response.headers.wont_be_nil
    end    

  end

end