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.test",
      brightbox_auth_url: "https://example.test",
      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
