github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/cmd/awsS3Upload_test.go (about) 1 //go:build unit 2 // +build unit 3 4 package cmd 5 6 import ( 7 "context" 8 "fmt" 9 "io/fs" 10 "log" 11 "os" 12 "path/filepath" 13 "testing" 14 15 "github.com/stretchr/testify/assert" 16 17 "github.com/aws/aws-sdk-go-v2/service/s3" 18 ) 19 20 type mockPutObjectAPI func(ctx context.Context, params *s3.PutObjectInput, optFns ...func(*s3.Options)) (*s3.PutObjectOutput, error) 21 22 func (m mockPutObjectAPI) PutObject(ctx context.Context, params *s3.PutObjectInput, optFns ...func(*s3.Options)) (*s3.PutObjectOutput, error) { 23 return m(ctx, params, optFns...) 24 } 25 26 func TestRunAwsS3Upload(t *testing.T) { 27 t.Parallel() 28 29 t.Run("happy path", func(t *testing.T) { 30 t.Parallel() 31 // create temporary file 32 f, err := os.CreateTemp("", "tmpfile-") // in Go version older than 1.17 you can use ioutil.TempFile 33 if err != nil { 34 log.Fatal(err) 35 } 36 defer f.Close() 37 defer os.Remove(f.Name()) 38 data := []byte("test test test") 39 if _, err := f.Write(data); err != nil { 40 log.Fatal(err) 41 } 42 43 // initialization 44 config := awsS3UploadOptions{ 45 FilePath: f.Name(), 46 } 47 client := mockS3Client 48 // test 49 err = runAwsS3Upload(&config, client(t, config.FilePath), "fooBucket") 50 // assert 51 assert.NoError(t, err) 52 }) 53 54 t.Run("error path", func(t *testing.T) { 55 t.Parallel() 56 // initialization 57 config := awsS3UploadOptions{ 58 FilePath: "nonExistingFilepath", 59 } 60 client := mockS3Client 61 // test 62 err := runAwsS3Upload(&config, client(t, config.FilePath), "fooBucket") 63 // assert 64 _, ok := err.(*fs.PathError) 65 assert.True(t, ok) 66 }) 67 68 t.Run("error bucket", func(t *testing.T) { 69 t.Parallel() 70 // create temporary file 71 f, err := os.CreateTemp("", "tmpfile-") // in Go version older than 1.17 you can use ioutil.TempFile 72 if err != nil { 73 log.Fatal(err) 74 } 75 defer f.Close() 76 defer os.Remove(f.Name()) 77 data := []byte("test test test") 78 if _, err := f.Write(data); err != nil { 79 log.Fatal(err) 80 } 81 82 // initialization 83 config := awsS3UploadOptions{ 84 FilePath: f.Name(), 85 } 86 client := mockS3Client 87 // test 88 err = runAwsS3Upload(&config, client(t, config.FilePath), "errorBucket") 89 // assert 90 assert.EqualError(t, err, "expect fooBucket, got errorBucket") 91 }) 92 } 93 94 func mockS3Client(t *testing.T, fileName string) S3PutObjectAPI { 95 return mockPutObjectAPI(func(ctx context.Context, params *s3.PutObjectInput, optFns ...func(*s3.Options)) (*s3.PutObjectOutput, error) { 96 t.Helper() 97 if params.Bucket == nil { 98 return nil, fmt.Errorf("expect bucket to not be nil") 99 } 100 if e, a := "fooBucket", *params.Bucket; e != a { 101 return nil, fmt.Errorf("expect %v, got %v", e, a) 102 } 103 if params.Key == nil { 104 return nil, fmt.Errorf("expect key to not be nil") 105 } 106 if e, a := filepath.ToSlash(fileName), *params.Key; e != a { 107 return nil, fmt.Errorf("expect %v, got %v", e, a) 108 } 109 if params.Body == nil { 110 return nil, fmt.Errorf("expect Body / io.Reader not to be nil") 111 } 112 return &s3.PutObjectOutput{}, nil 113 }) 114 }