github.com/kubeshop/testkube@v1.17.23/internal/app/api/v1/uploads_test.go (about) 1 package v1 2 3 import ( 4 "bytes" 5 "io" 6 "mime/multipart" 7 "net/http" 8 "net/http/httptest" 9 "path/filepath" 10 "testing" 11 12 "github.com/golang/mock/gomock" 13 14 "github.com/kubeshop/testkube/pkg/storage" 15 16 "github.com/gofiber/fiber/v2" 17 "github.com/stretchr/testify/assert" 18 19 "github.com/kubeshop/testkube/pkg/log" 20 "github.com/kubeshop/testkube/pkg/server" 21 ) 22 23 func TestTestkubeAPI_UploadCopyFiles(t *testing.T) { 24 t.Parallel() 25 26 mockCtrl := gomock.NewController(t) 27 defer mockCtrl.Finish() 28 29 mockArtifactsStorage := storage.NewMockArtifactsStorage(mockCtrl) 30 31 app := fiber.New() 32 s := &TestkubeAPI{ 33 HTTPServer: server.HTTPServer{ 34 Mux: app, 35 Log: log.DefaultLogger, 36 }, 37 ArtifactsStorage: mockArtifactsStorage, 38 } 39 route := "/uploads" 40 41 app.Post(route, s.UploadFiles()) 42 43 tests := []struct { 44 name string 45 parentName string 46 parentType string 47 filePath string 48 fileContent []byte 49 expectedCode int 50 expectedBucketName string 51 expectedFileContent []byte 52 expectedObjectSize int64 53 setupMocks func() 54 }{ 55 { 56 name: "no file", 57 expectedCode: fiber.StatusBadRequest, 58 setupMocks: func() {}, 59 }, 60 { 61 name: "file specified on execution", 62 parentName: "1", 63 parentType: "execution", 64 filePath: "/data/file1", 65 fileContent: []byte("first file"), 66 expectedCode: fiber.StatusOK, 67 expectedBucketName: "execution-1", 68 expectedFileContent: []byte("first file"), 69 expectedObjectSize: int64(10), 70 setupMocks: func() { 71 mockArtifactsStorage.EXPECT().GetValidBucketName("execution", "1").Return("execution-1") 72 mockArtifactsStorage.EXPECT().UploadFile(gomock.Any(), "execution-1", "/data/file1", gomock.Any(), int64(10)).Return(nil) 73 }, 74 }, 75 { 76 name: "file specified on test", 77 parentName: "2", 78 parentType: "test", 79 filePath: "/data/file2", 80 fileContent: []byte("second file"), 81 expectedCode: fiber.StatusOK, 82 expectedBucketName: "test-2", 83 expectedFileContent: []byte("second file"), 84 expectedObjectSize: int64(11), 85 setupMocks: func() { 86 mockArtifactsStorage.EXPECT().GetValidBucketName("test", "2").Return("test-2") 87 mockArtifactsStorage.EXPECT().UploadFile(gomock.Any(), "test-2", "/data/file2", gomock.Any(), int64(11)).Return(nil) 88 }, 89 }, 90 { 91 name: "file specified on test suite", 92 parentName: "3", 93 parentType: "test-suite", 94 filePath: "/data/file3", 95 fileContent: []byte("third file"), 96 expectedCode: fiber.StatusOK, 97 expectedBucketName: "test-suite-3", 98 expectedFileContent: []byte("third file"), 99 expectedObjectSize: int64(10), 100 setupMocks: func() { 101 mockArtifactsStorage.EXPECT().GetValidBucketName("test-suite", "3").Return("test-suite-3") 102 mockArtifactsStorage.EXPECT().UploadFile(gomock.Any(), "test-suite-3", "/data/file3", gomock.Any(), int64(10)).Return(nil) 103 }, 104 }, 105 } 106 107 for i := range tests { 108 tt := tests[i] 109 t.Run(tt.name, func(t *testing.T) { 110 t.Parallel() 111 112 tt.setupMocks() 113 body := &bytes.Buffer{} 114 writer := multipart.NewWriter(body) 115 part, err := writer.CreateFormFile("attachment", filepath.Base(tt.filePath)) 116 if err != nil { 117 t.Error(err) 118 } 119 120 if _, err = io.Copy(part, bytes.NewBuffer(tt.fileContent)); err != nil { 121 t.Error(err) 122 } 123 124 if err = writer.WriteField("parentName", tt.parentName); err != nil { 125 t.Error(err) 126 } 127 128 if err = writer.WriteField("parentType", tt.parentType); err != nil { 129 t.Error(err) 130 } 131 132 if err = writer.WriteField("filePath", tt.filePath); err != nil { 133 t.Error(err) 134 } 135 136 if err = writer.Close(); err != nil { 137 t.Error(err) 138 } 139 140 req := httptest.NewRequest(http.MethodPost, route, body) 141 req.Header.Set("Content-Type", writer.FormDataContentType()) 142 143 resp, err := app.Test(req, -1) 144 assert.NoError(t, err) 145 assert.Equal(t, tt.expectedCode, resp.StatusCode, tt.name) 146 }) 147 } 148 }