Shindo.tests("Fog::Compute[:brightbox]", ["brightbox"]) do
  @test_service = Fog::Compute[:brightbox]

  tests("#respond_to? :default_image").returns(true) do
    @test_service.respond_to?(:default_image)
  end
end

Shindo.tests("Fog::Compute.new", ["brightbox"]) do
  tests("service options") do
    {
      :brightbox_api_url => "https://example.com",
      :brightbox_auth_url => "https://example.com",
      :brightbox_client_id => "app-12345",
      :brightbox_secret => "12345abdef6789",
      :brightbox_username => "user-12345",
      :brightbox_password => "password1234",
      :brightbox_account => "acc-12345",
      :brightbox_access_token => "12345abdef6789",
      :brightbox_refresh_token => "12345abdef6789",
      :brightbox_token_management => false
    }.each_pair do |option, sample|
      tests("recognises :#{option}").returns(true) do
        options = { :provider => "Brightbox" }
        options[option] = sample
        begin
          Fog::Compute.new(options)
          true
        rescue ArgumentError
          false
        end
      end
    end
  end

  tests("automatic token management") do
    service_options = { :provider => "Brightbox" }

    tests("when enabled (default)") do
      service_options[:brightbox_token_management] = true

      tests("using bad token") do
        service_options[:brightbox_access_token] = "bad-token"

        tests("#request").returns(true, "returns a Hash") do
          pending if Fog.mocking?
          service = Fog::Compute.new(service_options)
          response = service.get_authenticated_user
          response.is_a?(Hash) # This is an outstanding issue, should be Excon::Response
        end
      end
    end

    tests("when disabled") do
      service_options[:brightbox_token_management] = false

      tests("using bad token") do
        service_options[:brightbox_access_token] = "bad-token"

        tests("#request").raises(Excon::Errors::Unauthorized) do
          pending if Fog.mocking?
          service = Fog::Compute.new(service_options)
          service.get_authenticated_user
        end
      end
    end
  end

  tests("account scoping") do
    service = Fog::Compute.new(:provider => "Brightbox")
    configured_account = Fog.credentials[:brightbox_account]
    tests("when Fog.credentials are #{configured_account}") do
      test("#scoped_account == #{configured_account}") { service.scoped_account == configured_account }
    end

    set_account = "acc-35791"
    tests("when Compute instance is updated to #{set_account}") do
      service.scoped_account = set_account
      test("#scoped_account == #{set_account}") { service.scoped_account == set_account }
    end

    tests("when Compute instance is reset") do
      service.scoped_account_reset
      test("#scoped_account == #{configured_account}") { service.scoped_account == configured_account }
    end

    optioned_account = "acc-56789"
    tests("when Compute instance created with :brightbox_account => #{optioned_account}") do
      service = Fog::Compute.new(:provider => "Brightbox", :brightbox_account => optioned_account)
      test("#scoped_account == #{optioned_account}") { service.scoped_account == optioned_account }
    end

    request_account = "acc-24680"
    tests("when requested with #{request_account}") do
      test("#scoped_account(#{request_account}) == #{request_account}") { service.scoped_account(request_account) == request_account }
    end
  end
end
