Shindo.tests("Fog::Compute[:brightbox] | load balancer requests", ["brightbox"]) do
  tests("success") do
    unless Fog.mocking?
      @node = Brightbox::Compute::TestSupport.get_test_server
      node_id = @node.id
    end

    create_options = {
      :nodes => [{
        :node => node_id
      }],
      :listeners => [{
        :in       => 80,
        :out      => 8080,
        :protocol => "http"
      }],
      :healthcheck => {
        :type => "http",
        :port => 80
      }
    }

    tests("#create_load_balancer(#{create_options.inspect})") do
      pending if Fog.mocking?
      result = Fog::Compute[:brightbox].create_load_balancer(create_options)
      @load_balancer_id = result["id"]
      data_matches_schema(Brightbox::Compute::Formats::Full::LOAD_BALANCER, :allow_extra_keys => true) { result }
    end

    unless Fog.mocking?
      Fog::Compute[:brightbox].load_balancers.get(@load_balancer_id).wait_for { ready? }
    end

    tests("#list_load_balancers()") do
      pending if Fog.mocking?
      result = Fog::Compute[:brightbox].list_load_balancers
      data_matches_schema(Brightbox::Compute::Formats::Collection::LOAD_BALANCERS, :allow_extra_keys => true) { result }
    end

    tests("#get_load_balancer('#{@load_balancer_id}')") do
      pending if Fog.mocking?
      result = Fog::Compute[:brightbox].get_load_balancer(@load_balancer_id)
      data_matches_schema(Brightbox::Compute::Formats::Full::LOAD_BALANCER, :allow_extra_keys => true) { result }
    end

    update_options = { :name => "New name" }
    tests("#update_load_balancer('#{@load_balancer_id}', #{update_options.inspect})") do
      pending if Fog.mocking?
      result = Fog::Compute[:brightbox].update_load_balancer(@load_balancer_id, update_options)
      data_matches_schema(Brightbox::Compute::Formats::Full::LOAD_BALANCER, :allow_extra_keys => true) { result }
    end

    add_listeners_options = { :listeners => [{ :out => 28_080, :in => 8080, :protocol => "http" }] }
    tests("#add_listeners_load_balancer('#{@load_balancer_id}', #{add_listeners_options.inspect})") do
      pending if Fog.mocking?
      result = Fog::Compute[:brightbox].add_listeners_load_balancer(@load_balancer_id, add_listeners_options)
      data_matches_schema(Brightbox::Compute::Formats::Full::LOAD_BALANCER, :allow_extra_keys => true) { result }
    end

    remove_listeners_options = { :listeners => [{ :out => 28_080, :in => 8080, :protocol => "http" }] }
    tests("#remove_listeners_load_balancer('#{@load_balancer_id}', #{remove_listeners_options.inspect})") do
      pending if Fog.mocking?
      result = Fog::Compute[:brightbox].remove_listeners_load_balancer(@load_balancer_id, remove_listeners_options)
      data_matches_schema(Brightbox::Compute::Formats::Full::LOAD_BALANCER, :allow_extra_keys => true) { result }
    end

    unless Fog.mocking?
      @node2 = Brightbox::Compute::TestSupport.get_test_server
      second_node_id = @node2.id
    end

    # Can't remove the last node so we need to add a second...
    add_nodes_options = { :nodes => [{ :node => second_node_id }] }
    tests("#add_nodes_load_balancer('#{@load_balancer_id}', #{add_nodes_options.inspect})") do
      pending if Fog.mocking?
      result = Fog::Compute[:brightbox].add_nodes_load_balancer(@load_balancer_id, add_nodes_options)
      data_matches_schema(Brightbox::Compute::Formats::Full::LOAD_BALANCER, :allow_extra_keys => true) { result }
    end

    # ...before we can attempt to remove either
    remove_nodes_options = { :nodes => [{ :node => node_id }] }
    tests("#remove_nodes_load_balancer('#{@load_balancer_id}', #{remove_nodes_options.inspect})") do
      pending if Fog.mocking?
      result = Fog::Compute[:brightbox].remove_nodes_load_balancer(@load_balancer_id, remove_nodes_options)
      data_matches_schema(Brightbox::Compute::Formats::Full::LOAD_BALANCER, :allow_extra_keys => true) { result }
    end

    tests("#destroy_load_balancer('#{@load_balancer_id}')") do
      pending if Fog.mocking?
      result = Fog::Compute[:brightbox].destroy_load_balancer(@load_balancer_id)
      data_matches_schema(Brightbox::Compute::Formats::Full::LOAD_BALANCER, :allow_extra_keys => true) { result }
    end

    unless Fog.mocking?
      @node.destroy
      @node2.destroy
    end
  end

  tests("failure") do
    tests("#create_load_balancer").raises(ArgumentError) do
      pending if Fog.mocking?
      Fog::Compute[:brightbox].create_load_balancer
    end

    tests("#get_load_balancer('lba-00000')").raises(Excon::Errors::NotFound) do
      pending if Fog.mocking?
      Fog::Compute[:brightbox].get_load_balancer("lba-00000")
    end

    tests("#get_load_balancer").raises(ArgumentError) do
      pending if Fog.mocking?
      Fog::Compute[:brightbox].get_load_balancer
    end
  end
end
