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