package customizations_test import ( "context" "errors" "net/http" "strings" "testing" "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/s3" "github.com/aws/smithy-go" ) func Test_EmptyResponse(t *testing.T) { cases := map[string]struct { response *http.Response expectError bool }{ "success case with no response body": { response: &http.Response{ StatusCode: 200, Body: asReadCloser( ``, ), }, }, "error case with no response body": { response: &http.Response{ StatusCode: 400, Body: asReadCloser( ``, ), }, expectError: true, }, } for name, c := range cases { t.Run(name, func(t *testing.T) { ctx, cancelFn := context.WithTimeout(context.Background(), 5*time.Second) defer cancelFn() cfg := aws.Config{ Region: "mock-region", Retryer: func() aws.Retryer { return aws.NopRetryer{} }, } client := s3.NewFromConfig(cfg, func(options *s3.Options) { options.UsePathStyle = true options.HTTPClient = &mockHTTPClient{c.response} }, ) params := &s3.HeadBucketInput{Bucket: aws.String("aws-sdk-go-data")} _, err := client.HeadBucket(ctx, params) if c.expectError { var apiErr smithy.APIError if !errors.As(err, &apiErr) { t.Fatalf("expect error to be API error, was not, %v", err) } if len(apiErr.ErrorCode()) == 0 { t.Errorf("expect non-empty error code") } if len(apiErr.ErrorMessage()) == 0 { t.Errorf("expect non-empty error message") } } else { if err != nil { t.Errorf("expected no error, got %v", err.Error()) } } }) } } func TestBucketLocationPopulation(t *testing.T) { cases := map[string]struct { response *http.Response expectLocation string expectError string }{ "empty location": { response: &http.Response{ StatusCode: 200, Body: asReadCloser( ``, ), }, expectLocation: "", }, "EU location": { response: &http.Response{ StatusCode: 200, Body: asReadCloser( `EU`, ), }, expectLocation: "EU", }, "AfSouth1 location": { response: &http.Response{ StatusCode: 200, Body: asReadCloser( `af-south-1`, ), }, expectLocation: "af-south-1", }, "IncompleteResponse": { response: &http.Response{ Body: asReadCloser( ``, ), }, expectError: "unexpected EOF", }, } for name, c := range cases { t.Run(name, func(t *testing.T) { ctx, cancelFn := context.WithTimeout(context.Background(), 5*time.Second) defer cancelFn() cfg := aws.Config{ Region: "us-east-1", Retryer: func() aws.Retryer { return aws.NopRetryer{} }, } client := s3.NewFromConfig(cfg, func(options *s3.Options) { options.UsePathStyle = true options.HTTPClient = &mockHTTPClient{c.response} }) params := &s3.GetBucketLocationInput{ Bucket: aws.String("aws-sdk-go-data"), } resp, err := client.GetBucketLocation(ctx, params) if len(c.expectError) != 0 && err == nil { t.Fatal("expect error, got none") } if err != nil && len(c.expectError) == 0 { t.Fatalf("expect no error, got %v", err) } else { if err != nil { if !strings.Contains(err.Error(), c.expectError) { t.Fatalf("expect error to be %v, got %v", err.Error(), c.expectError) } return } } if e, a := c.expectLocation, resp.LocationConstraint; !strings.EqualFold(e, string(a)) { t.Fatalf("expected location constraint to be deserialized as %v, got %v", e, a) } }) } }