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 }