Skip to content

Commit

Permalink
Unit test for presigned URLs
Browse files Browse the repository at this point in the history
  • Loading branch information
vmilovanovicc committed Oct 5, 2023
1 parent c05df82 commit 18323b5
Show file tree
Hide file tree
Showing 4 changed files with 91 additions and 6 deletions.
22 changes: 22 additions & 0 deletions backend/mock_client_ops.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@ package backend
import (
"context"
"github.com/aws/aws-sdk-go-v2/aws"
v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
"github.com/aws/aws-sdk-go-v2/service/polly"
typesPolly "github.com/aws/aws-sdk-go-v2/service/polly/types"
"github.com/aws/aws-sdk-go-v2/service/s3"
typesS3 "github.com/aws/aws-sdk-go-v2/service/s3/types"
"github.com/aws/aws-sdk-go-v2/service/translate"
"strings"
"time"
)

//////////////////////////////////////////
Expand Down Expand Up @@ -56,6 +58,26 @@ func CreateBucketFromS3(ctx context.Context, api S3CreateBucketAPI, bucketName s
return *response.Location, nil
}

//////////////////////////////////////////
// PresignGetObject Mock
//////////////////////////////////////////

type S3PresignGetObjectAPI interface {
GetPresignedURL(ctx context.Context, params *s3.GetObjectInput, optFns ...func(options *s3.PresignOptions)) (*v4.PresignedHTTPRequest, error)
}

func GetPresignedURLFromS3(ctx context.Context, api S3PresignGetObjectAPI, bucketName, objectName string, expires time.Time) (string, error) {
response, err := api.GetPresignedURL(ctx, &s3.GetObjectInput{
Bucket: aws.String(bucketName),
Key: aws.String(objectName),
ResponseExpires: aws.Time(expires),
})
if err != nil {
return "", err
}
return response.URL, nil
}

//////////////////////////////////////////
// StartSpeechSynthesisTask Mock
//////////////////////////////////////////
Expand Down
4 changes: 2 additions & 2 deletions backend/storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,8 @@ func GetBucketName(locationURL string) (string, error) {
return outputS3BucketName, nil
}

// GeneratePresignedURL retrieves a presigned URL for an Amazon S3 bucket object.
func GeneratePresignedURL(bucketName, objectName string, expires time.Time) (string, error) {
// GetPresignedURL retrieves a presigned URL for an Amazon S3 bucket object.
func GetPresignedURL(bucketName, objectName string, expires time.Time) (string, error) {
cfg := LoadAWSConfig()
client := s3.NewFromConfig(cfg)
psClient := s3.NewPresignClient(client)
Expand Down
59 changes: 59 additions & 0 deletions backend/storage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ package backend
import (
"context"
"github.com/aws/aws-sdk-go-v2/aws"
v4 "github.com/aws/aws-sdk-go-v2/aws/signer/v4"
"github.com/aws/aws-sdk-go-v2/service/s3"
"regexp"
"testing"
"time"
)

type mockCreateBucketAPI func(ctx context.Context, params *s3.CreateBucketInput, optFns ...func(*s3.Options)) (*s3.CreateBucketOutput, error)
Expand Down Expand Up @@ -101,3 +103,60 @@ func TestGetBucketName(t *testing.T) {
})
}
}

type mockGetPresignedURLAPI func(ctx context.Context, params *s3.GetObjectInput, optFns ...func(*s3.PresignOptions)) (*v4.PresignedHTTPRequest, error)

func (m mockGetPresignedURLAPI) GetPresignedURL(ctx context.Context, params *s3.GetObjectInput, optFns ...func(*s3.PresignOptions)) (*v4.PresignedHTTPRequest, error) {
return m(ctx, params, optFns...)
}

func TestGetPresignedURLFromS3(t *testing.T) {
cases := []struct {
client func(t *testing.T) S3PresignGetObjectAPI
bucketName string
objectName string
expires time.Time
expectURL string
}{
{
client: func(t *testing.T) S3PresignGetObjectAPI {
return mockGetPresignedURLAPI(func(ctx context.Context, params *s3.GetObjectInput, optFns ...func(*s3.PresignOptions)) (*v4.PresignedHTTPRequest, error) {
t.Helper()

if *params.Bucket == "" {
t.Fatalf("expect bucket name to not be nil")
}

if *params.Key == "" {
t.Fatalf("expect object name to not be nil")
}

if params.ResponseExpires.IsZero() {
t.Fatalf("expect time to be set, currently not set")
}

return &v4.PresignedHTTPRequest{
URL: "https://mock-bucket.s3.eu-central-1.amazonaws.com/mock-object.mp3?XXXX",
}, nil
})
}, // end client
bucketName: "mock-bucket",
objectName: "mock-object",
expires: time.Now().Add(3600 * time.Second),
expectURL: "https://mock-bucket.s3.eu-central-1.amazonaws.com/mock-object.mp3?XXXX",
},
}
for _, tt := range cases {
t.Run("Test presigned URL", func(t *testing.T) {
ctx := context.TODO()

gotPresignedURL, err := GetPresignedURLFromS3(ctx, tt.client(t), tt.bucketName, tt.objectName, tt.expires)
if err != nil {
t.Fatalf("expect no error, got: %v", err)
}
if tt.expectURL != gotPresignedURL {
t.Errorf("expect %v, got %v", tt.expectURL, gotPresignedURL)
}
})
}
}
12 changes: 8 additions & 4 deletions main.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,17 @@
package main

import "zobot/backend"
import (
"time"
"zobot/backend"
)

func main() {
// placeholder
// remove these
backend.TranslateText("hello world", "es")
locationURL, _ := backend.CreateBucket("")
backend.GetBucketName(locationURL)
//locationURL, _ := backend.CreateBucket("")
//backend.GetBucketName(locationURL)
backend.GetTargetVoice("fr")
taskId, _, _ := backend.GetSpeechSynthesisTaskId("Testing speech to voice functionality", "", "es", "")
backend.GetSpeechSynthesisTaskStatus(taskId)
backend.GetPresignedURL("amazon-polly-audio-10012023182532", "bf923301-3f75-4a0a-adcb-ff0d3325xx09.mp3", time.Now().Add(3600*time.Second))
}

0 comments on commit 18323b5

Please sign in to comment.