From 95a2255ecc20da61189d246f8980ad62b8948e57 Mon Sep 17 00:00:00 2001 From: Sergey Khorbin Date: Wed, 29 May 2024 23:21:29 +0200 Subject: [PATCH] test: added tests for image upload --- src/database/database.go | 9 +- src/handlers/image/handleImageUpload_test.go | 254 +++++++++++++++++++ 2 files changed, 261 insertions(+), 2 deletions(-) create mode 100644 src/handlers/image/handleImageUpload_test.go diff --git a/src/database/database.go b/src/database/database.go index 80f3cd3..4a4219c 100644 --- a/src/database/database.go +++ b/src/database/database.go @@ -11,12 +11,17 @@ import ( "gorm.io/gorm" ) +const ( + DbFolder = "db_data" + DbName = "main.db" +) + var DB *gorm.DB func ConnectToDB() { - dbPath := fmt.Sprintf("%v/db_data", util.ExPath) + dbPath := fmt.Sprintf("%v/%s", util.ExPath, DbFolder) - _, err := os.Stat(fmt.Sprintf("%v/main.db", dbPath)) + _, err := os.Stat(fmt.Sprintf("%v/%s", dbPath, DbName)) if err != nil { os.Mkdir(dbPath, 0o755) log.Printf("DB not found, creating at %v/main.db...", dbPath) diff --git a/src/handlers/image/handleImageUpload_test.go b/src/handlers/image/handleImageUpload_test.go new file mode 100644 index 0000000..7c1635b --- /dev/null +++ b/src/handlers/image/handleImageUpload_test.go @@ -0,0 +1,254 @@ +package handlers + +import ( + "fmt" + "io" + "mime/multipart" + "net/http" + "net/http/httptest" + "os" + "testing" + + "github.com/gin-gonic/gin" + "github.com/kevinanielsen/go-fast-cdn/src/database" + "github.com/kevinanielsen/go-fast-cdn/src/util" + "github.com/stretchr/testify/require" +) + +func TestHandleImageUpload_NoError(t *testing.T) { + // create tmpFile + pipeRead, pipeWriter := io.Pipe() + writer := multipart.NewWriter(pipeWriter) + go func() { + defer writer.Close() + part, _ := writer.CreateFormFile("image", "image.img") + img, _ := createDummyImage(200, 200) + _ = EncodeImage(part, img) + }() + + // init request + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + + c.Request = httptest.NewRequest(http.MethodPost, "/api/cdn/upload/image", pipeRead) + c.Request.Header.Add("Content-Type", writer.FormDataContentType()) + + // init database + util.ExPath = os.TempDir() + database.ConnectToDB() + defer func() { + filePath := fmt.Sprintf("%s/%s/%s", util.ExPath, database.DbFolder, database.DbName) + err := os.Remove(filePath) + if err != nil { + t.Error(err) + } + }() + + // handling + HandleImageUpload(c) + + // assert + require.Equal(t, http.StatusOK, w.Result().StatusCode) +} + +func TestHandleImageUpload_ReadFailed_NoFile(t *testing.T) { + // create tmpFile + pipeRead, pipeWriter := io.Pipe() + writer := multipart.NewWriter(pipeWriter) + go func() { + defer writer.Close() + part, _ := writer.CreateFormFile("png", "img.img") + img, _ := createDummyImage(200, 200) + _ = EncodeImage(part, img) + }() + + // init request + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + + c.Request = httptest.NewRequest(http.MethodPost, "/api/cdn/upload/image", pipeRead) + c.Request.Header.Add("Content-Type", writer.FormDataContentType()) + + // init database + util.ExPath = os.TempDir() + database.ConnectToDB() + defer func() { + filePath := fmt.Sprintf("%s/%s/%s", util.ExPath, database.DbFolder, database.DbName) + err := os.Remove(filePath) + if err != nil { + t.Error(err) + } + }() + + // handling + HandleImageUpload(c) + + // assert + require.Equal(t, http.StatusBadRequest, w.Result().StatusCode) + require.Equal(t, w.Body.String(), "Failed to read file: http: no such file") +} + +func TestHandleImageUpload_ReadFailed_EOF(t *testing.T) { + // create tmpFile + pipeRead, pipeWriter := io.Pipe() + writer := multipart.NewWriter(pipeWriter) + go func() { + defer writer.Close() + part, _ := writer.CreateFormFile("image", "image.img") + part.Write([]byte("")) + }() + + // init request + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + + c.Request = httptest.NewRequest(http.MethodPost, "/api/cdn/upload/image", pipeRead) + c.Request.Header.Add("Content-Type", writer.FormDataContentType()) + + // init database + util.ExPath = os.TempDir() + database.ConnectToDB() + defer func() { + filePath := fmt.Sprintf("%s/%s/%s", util.ExPath, database.DbFolder, database.DbName) + err := os.Remove(filePath) + if err != nil { + t.Error(err) + } + }() + + // handling + HandleImageUpload(c) + + // assert + fmt.Println(w.Body.String()) + require.Equal(t, http.StatusInternalServerError, w.Result().StatusCode) + require.Equal(t, w.Body.String(), "Failed to read file: EOF") +} + +func TestHandleImageUpload_InvalidType(t *testing.T) { + // create tmpFile + pipeRead, pipeWriter := io.Pipe() + writer := multipart.NewWriter(pipeWriter) + go func() { + defer writer.Close() + part, _ := writer.CreateFormFile("image", "img.docx") + part.Write([]byte("dsf")) + }() + + // init request + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + + c.Request = httptest.NewRequest(http.MethodPost, "/api/cdn/upload/image", pipeRead) + c.Request.Header.Add("Content-Type", writer.FormDataContentType()) + + // init database + util.ExPath = os.TempDir() + database.ConnectToDB() + defer func() { + filePath := fmt.Sprintf("%s/%s/%s", util.ExPath, database.DbFolder, database.DbName) + err := os.Remove(filePath) + if err != nil { + t.Error(err) + } + }() + + // handling + HandleImageUpload(c) + + // assert + require.Equal(t, http.StatusBadRequest, w.Result().StatusCode) + require.Equal(t, w.Body.String(), "Invalid file type") +} + +func TestHandleImageUpload_InvalidFilename(t *testing.T) { + // create tmpFile + pipeRead, pipeWriter := io.Pipe() + writer := multipart.NewWriter(pipeWriter) + go func() { + defer writer.Close() + part, _ := writer.CreateFormFile("image", "img.image.img") + img, _ := createDummyImage(200, 200) + _ = EncodeImage(part, img) + }() + + // init request + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + + c.Request = httptest.NewRequest(http.MethodPost, "/api/cdn/upload/image", pipeRead) + c.Request.Header.Add("Content-Type", writer.FormDataContentType()) + + // init database + util.ExPath = os.TempDir() + database.ConnectToDB() + defer func() { + filePath := fmt.Sprintf("%s/%s/%s", util.ExPath, database.DbFolder, database.DbName) + err := os.Remove(filePath) + if err != nil { + t.Error(err) + } + }() + + // handling + HandleImageUpload(c) + + // assert + require.Equal(t, http.StatusBadRequest, w.Result().StatusCode) + require.Equal(t, w.Body.String(), "filename cannot contain more than one period character") +} + +func TestHandleImageUpload_FileExist(t *testing.T) { + // create tmpFile + pipeRead, pipeWriter := io.Pipe() + writer := multipart.NewWriter(pipeWriter) + go func() { + defer writer.Close() + part, _ := writer.CreateFormFile("image", "image.img") + img, _ := createDummyImage(200, 200) + _ = EncodeImage(part, img) + }() + + // init database + util.ExPath = os.TempDir() + database.ConnectToDB() + defer func() { + filePath := fmt.Sprintf("%s/%s/%s", util.ExPath, database.DbFolder, database.DbName) + err := os.Remove(filePath) + if err != nil { + t.Error(err) + } + }() + + // init request + w := httptest.NewRecorder() + c, _ := gin.CreateTestContext(w) + + c.Request = httptest.NewRequest(http.MethodPost, "/api/cdn/upload/image", pipeRead) + c.Request.Header.Add("Content-Type", writer.FormDataContentType()) + + // first handling + HandleImageUpload(c) + + // first statement + require.Equal(t, http.StatusOK, w.Result().StatusCode) + + // init request + ww := httptest.NewRecorder() + cc, _ := gin.CreateTestContext(ww) + go func() { + defer writer.Close() + part, _ := writer.CreateFormFile("image", "image.img") + img, _ := createDummyImage(200, 200) + _ = EncodeImage(part, img) + }() + cc.Request = httptest.NewRequest(http.MethodPost, "/api/cdn/upload/image", pipeRead) + cc.Request.Header.Add("Content-Type", writer.FormDataContentType()) + + // second handling + HandleImageUpload(cc) + + //// first statement + require.Equal(t, http.StatusConflict, ww.Result().StatusCode) + require.Equal(t, ww.Body.String(), "\"File already exists\"") +}