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  }