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  }