github.com/kubeshop/testkube@v1.17.23/pkg/cloud/data/artifact/uploader_test.go (about)

     1  package artifact_test
     2  
     3  import (
     4  	"context"
     5  	"io"
     6  	"net/http"
     7  	"net/http/httptest"
     8  	"testing"
     9  
    10  	"github.com/kubeshop/testkube/pkg/api/v1/testkube"
    11  
    12  	"github.com/stretchr/testify/assert"
    13  
    14  	cloudscraper "github.com/kubeshop/testkube/pkg/cloud/data/artifact"
    15  	"github.com/kubeshop/testkube/pkg/cloud/data/executor"
    16  	"github.com/kubeshop/testkube/pkg/executor/scraper"
    17  
    18  	"github.com/golang/mock/gomock"
    19  	"github.com/pkg/errors"
    20  )
    21  
    22  func TestCloudLoader_Load(t *testing.T) {
    23  	t.Parallel()
    24  
    25  	mockCtrl := gomock.NewController(t)
    26  	defer mockCtrl.Finish()
    27  
    28  	mockExecutor := executor.NewMockExecutor(mockCtrl)
    29  
    30  	testServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    31  		assert.Equal(t, http.MethodPut, r.Method)
    32  		assert.Equal(t, "/dummy", r.URL.Path)
    33  		w.WriteHeader(http.StatusOK)
    34  	}))
    35  	defer testServer.Close()
    36  
    37  	tests := []struct {
    38  		name        string
    39  		execution   testkube.Execution
    40  		data        io.Reader
    41  		setup       func() *cloudscraper.CloudUploader
    42  		putErr      error
    43  		wantErr     bool
    44  		errContains string
    45  	}{
    46  		{
    47  			name: "valid data",
    48  			execution: testkube.Execution{
    49  				Id:            "my-execution-id",
    50  				TestName:      "my-test",
    51  				TestSuiteName: "my-test-suite",
    52  			},
    53  			data: nil,
    54  			setup: func() *cloudscraper.CloudUploader {
    55  				req := &cloudscraper.PutObjectSignedURLRequest{
    56  					Object:        "my-object",
    57  					ExecutionID:   "my-execution-id",
    58  					TestName:      "my-test",
    59  					TestSuiteName: "my-test-suite",
    60  				}
    61  
    62  				mockExecutor.EXPECT().Execute(gomock.Any(), cloudscraper.CmdScraperPutObjectSignedURL, gomock.Eq(req)).Return([]byte(`{"URL":"`+testServer.URL+`/dummy"}`), nil).Times(1)
    63  				return cloudscraper.NewCloudUploader(mockExecutor, false)
    64  			},
    65  			putErr:  nil,
    66  			wantErr: false,
    67  		},
    68  		{
    69  			name: "executor error",
    70  			execution: testkube.Execution{
    71  				Id:            "my-execution-id",
    72  				TestName:      "my-test",
    73  				TestSuiteName: "my-test-suite",
    74  			},
    75  			data: nil,
    76  			setup: func() *cloudscraper.CloudUploader {
    77  				req := &cloudscraper.PutObjectSignedURLRequest{
    78  					Object:        "my-object",
    79  					ExecutionID:   "my-execution-id",
    80  					TestName:      "my-test",
    81  					TestSuiteName: "my-test-suite",
    82  				}
    83  
    84  				mockExecutor.EXPECT().Execute(gomock.Any(), cloudscraper.CmdScraperPutObjectSignedURL, gomock.Eq(req)).Return(nil, errors.New("connection error")).Times(1)
    85  				return cloudscraper.NewCloudUploader(mockExecutor, false)
    86  			},
    87  			wantErr:     true,
    88  			errContains: "failed to get signed URL for object [my-object]: connection error",
    89  		},
    90  	}
    91  
    92  	for _, tt := range tests {
    93  		t.Run(tt.name, func(t *testing.T) {
    94  			ctx := context.Background()
    95  
    96  			cloudLoader := tt.setup()
    97  			object := &scraper.Object{
    98  				Name: "my-object",
    99  				Data: tt.data,
   100  			}
   101  			err := cloudLoader.Upload(ctx, object, tt.execution)
   102  			if tt.wantErr {
   103  				assert.ErrorContains(t, err, tt.errContains)
   104  			} else {
   105  				assert.NoError(t, err)
   106  			}
   107  		})
   108  	}
   109  }