require_relative '../spec_helper'

module Aws
  module S3
    describe Client do
      context 'success cases' do
        it 'applies the bucket to the custom endpoint' do
          client = Aws::S3::Client.new(
            stub_responses: true,
            region: 'us-west-2',
            s3_use_arn_region: false,
            endpoint: 'https://beta.example.com'
          )
          bucket = 'bucketname'
          expect_auth({ 'signingName' => 's3' })
          resp = client.list_objects(bucket: bucket)
          host = 'bucketname.beta.example.com'
          expect(resp.context.http_request.endpoint.host).to eq(host)
        end

        it 'works with access point ARNs' do
          client = Aws::S3::Client.new(
            stub_responses: true,
            region: 'us-west-2',
            s3_use_arn_region: false,
            endpoint: 'https://beta.example.com'
          )
          bucket = 'arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint'
          expect_auth({ 'signingName' => 's3' })
          resp = client.list_objects(bucket: bucket)
          host = 'myendpoint-123456789012.beta.example.com'
          expect(resp.context.http_request.endpoint.host).to eq(host)
        end

        it 'works with outpost access point ARNs' do
          client = Aws::S3::Client.new(
            stub_responses: true,
            region: 'us-west-2',
            s3_use_arn_region: false,
            endpoint: 'https://beta.example.com'
          )
          bucket = 'arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint'
          expect_auth({ 'signingName' => 's3-outposts' })
          resp = client.list_objects(bucket: bucket)
          host = 'myaccesspoint-123456789012.op-01234567890123456.beta.example.com'
          expect(resp.context.http_request.endpoint.host).to eq(host)
        end

        it 'works with a global list bucket operation' do
          client = Aws::S3::Client.new(
            stub_responses: true,
            region: 'us-west-2',
            endpoint: 'https://bucket.vpce-123-abc.s3.us-west-2.vpce.amazonaws.com'
          )
          expect_auth({ 'signingName' => 's3' })
          resp = client.list_buckets
          host = 'bucket.vpce-123-abc.s3.us-west-2.vpce.amazonaws.com'
          expect(resp.context.http_request.endpoint.host).to eq(host)
        end

        it 'works with the private link endpoint as is with path style' do
          client = Aws::S3::Client.new(
            stub_responses: true,
            region: 'us-west-2',
            force_path_style: true,
            endpoint: 'https://bucket.vpce-123-abc.s3.us-west-2.vpce.amazonaws.com'
          )
          bucket = 'bucketname'
          expect_auth({ 'signingName' => 's3' })
          resp = client.list_objects(bucket: bucket)
          host = 'bucket.vpce-123-abc.s3.us-west-2.vpce.amazonaws.com'
          expect(resp.context.http_request.endpoint.host).to eq(host)
        end

        it 'works with the private link endpoint as is' do
          client = Aws::S3::Client.new(
            stub_responses: true,
            region: 'us-west-2',
            endpoint: 'https://bucket.vpce-123-abc.s3.us-west-2.vpce.amazonaws.com'
          )
          bucket = 'bucketname'
          expect_auth({ 'signingName' => 's3' })
          resp = client.list_objects(bucket: bucket)
          host = 'bucketname.bucket.vpce-123-abc.s3.us-west-2.vpce.amazonaws.com'
          expect(resp.context.http_request.endpoint.host).to eq(host)
        end

        it 'works with the private link endpoint using the ARN region' do
          client = Aws::S3::Client.new(
            stub_responses: true,
            region: 'eu-west-1',
            endpoint: 'https://accesspoint.vpce-123-abc.s3.us-west-2.vpce.amazonaws.com'
          )
          bucket = 'arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint'
          expect_auth({ 'signingName' => 's3' })
          resp = client.list_objects(bucket: bucket)
          host = 'myendpoint-123456789012.accesspoint.vpce-123-abc.s3.us-west-2.vpce.amazonaws.com'
          expect(resp.context.http_request.endpoint.host).to eq(host)
        end
      end

      context 'failure cases' do
        it 'raises when a custom endpoint is used with dualstack' do
          client = Aws::S3::Client.new(
            stub_responses: true,
            region: 'us-west-2',
            use_dualstack_endpoint: true,
            s3_use_arn_region: false,
            endpoint: 'https://beta.example.com'
          )
          bucket = 'bucketname'
          expect do
            client.list_objects(bucket: bucket)
          end.to raise_error(ArgumentError)
        end

        it 'raises when outpost access point ARN is used with dualstack' do
          client = Aws::S3::Client.new(
            stub_responses: true,
            region: 'us-west-2',
            use_dualstack_endpoint: true,
            s3_use_arn_region: false,
            endpoint: 'https://beta.example.com'
          )
          bucket = 'arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint'
          expect do
            client.list_objects(bucket: bucket)
          end.to raise_error(ArgumentError)
        end
      end
    end
  end
end