Shindo.tests("Fog::Compute[:brightbox] | server requests", ["brightbox"]) do
  tests("success") do
    unless Fog.mocking?
      image_id = Brightbox::Compute::TestSupport.image_id
      server_id = nil
    end

    tests("#create_server(:image => '#{image_id}')") do
      pending if Fog.mocking?
      result = Fog::Compute[:brightbox].create_server(image: image_id)
      server_id = result["id"]
      data_matches_schema(Brightbox::Compute::Formats::Full::SERVER, allow_extra_keys: true) { result }
    end

    unless Fog.mocking?
      Fog::Compute[:brightbox].servers.get(server_id).wait_for { ready? }
    end

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

    tests("#get_server('#{server_id}')") do
      pending if Fog.mocking?
      result = Fog::Compute[:brightbox].get_server(server_id)
      data_matches_schema(Brightbox::Compute::Formats::Full::SERVER, allow_extra_keys: true) { result }
    end

    tests("#update_server('#{server_id}')") do
      pending if Fog.mocking?
      result = Fog::Compute[:brightbox].update_server(server_id, name: "Fog@#{Time.now.iso8601}")
      data_matches_schema(Brightbox::Compute::Formats::Full::SERVER, allow_extra_keys: true) { result }
    end

    tests("#activate_console_server('#{server_id}')") do
      pending if Fog.mocking?
      result = Fog::Compute[:brightbox].activate_console_server(server_id)
      data_matches_schema(Brightbox::Compute::Formats::Full::SERVER, allow_extra_keys: true) { result }
      test("has set 'console_url'") { !result["console_url"].empty? }
      test("has set 'console_token'") { !result["console_token"].empty? }
      test("has set 'console_token_expires'") { !result["console_token_expires"].empty? }
    end

    tests("#stop_server('#{server_id}')") do
      pending if Fog.mocking?
      result = Fog::Compute[:brightbox].stop_server(server_id)
      data_matches_schema(Brightbox::Compute::Formats::Full::SERVER, allow_extra_keys: true) { result }
    end

    tests("#start_server('#{server_id}')") do
      pending if Fog.mocking?
      result = Fog::Compute[:brightbox].start_server(server_id)
      data_matches_schema(Brightbox::Compute::Formats::Full::SERVER, allow_extra_keys: true) { result }
    end

    unless Fog.mocking?
      Fog::Compute[:brightbox].servers.get(server_id).wait_for { ready? }
    end

    tests("#shutdown_server('#{server_id}')") do
      pending if Fog.mocking?
      result = Fog::Compute[:brightbox].shutdown_server(server_id)
      data_matches_schema(Brightbox::Compute::Formats::Full::SERVER, allow_extra_keys: true) { result }
    end

    tests("#snapshot_server('#{server_id}')") do
      pending if Fog.mocking?
      result = Fog::Compute[:brightbox].snapshot_server(server_id)
      data_matches_schema(Brightbox::Compute::Formats::Full::SERVER, allow_extra_keys: true) { result }
      # Server should be exclusively for our test so assume we can delete the snapshot
      snapshot_id = result["snapshots"].first["id"]
      @snapshot = Fog::Compute[:brightbox].images.get(snapshot_id)
      @snapshot.wait_for { ready? }
      @snapshot.destroy
    end

    tests("#delete_server('#{server_id}')") do
      pending if Fog.mocking?
      result = Fog::Compute[:brightbox].delete_server(server_id)
      data_matches_schema(Brightbox::Compute::Formats::Full::SERVER, allow_extra_keys: true) { result }
    end
  end

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

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