| 11 | ) |
| 12 | |
| 13 | func TestSaveFile(t *testing.T) { |
| 14 | // Mock file data to upload. |
| 15 | fileContent := "Hello, test file content!" |
| 16 | fileName := "testfile.txt" |
| 17 | |
| 18 | // Create a new buffer to simulate multipart form data. |
| 19 | body := &bytes.Buffer{} |
| 20 | writer := multipart.NewWriter(body) |
| 21 | |
| 22 | // Create a form file field and write file content. |
| 23 | part, err := writer.CreateFormFile("file", fileName) |
| 24 | if err != nil { |
| 25 | t.Fatalf("Failed to create form file: %v", err) |
| 26 | } |
| 27 | _, err = part.Write([]byte(fileContent)) |
| 28 | if err != nil { |
| 29 | t.Fatalf("Failed to write to form file: %v", err) |
| 30 | } |
| 31 | writer.Close() |
| 32 | |
| 33 | // Create a new HTTP request with the multipart data. |
| 34 | req := httptest.NewRequest(http.MethodPost, "/upload", body) |
| 35 | req.Header.Set("Content-Type", writer.FormDataContentType()) |
| 36 | |
| 37 | // Create a test Ctx instance with the mock request. |
| 38 | ctx := &Ctx{Request: req, Server: &Server{config: Config{UploadPath: "./uploads"}}} |
| 39 | |
| 40 | // Retrieve the uploaded file from the request. |
| 41 | _, fh, err := ctx.FormFile("file") |
| 42 | if err != nil { |
| 43 | t.Fatalf("Failed to retrieve form file: %v", err) |
| 44 | } |
| 45 | |
| 46 | // Save the file using SaveFile. |
| 47 | err = ctx.SaveFile(fh) |
| 48 | if err != nil { |
| 49 | t.Fatalf("Failed to save file: %v", err) |
| 50 | } |
| 51 | |
| 52 | // Verify the file was saved correctly. |
| 53 | savedFilePath := filepath.Join("./uploads", fileName) |
| 54 | defer os.Remove(savedFilePath) // Clean up the test file after verification. |
| 55 | |
| 56 | savedContent, err := os.ReadFile(savedFilePath) |
| 57 | if err != nil { |
| 58 | t.Fatalf("Failed to read saved file: %v", err) |
| 59 | } |
| 60 | |
| 61 | if string(savedContent) != fileContent { |
| 62 | t.Errorf("File content mismatch. Got: %s, Expected: %s", savedContent, fileContent) |
| 63 | } |
| 64 | } |
| 65 | |
| 66 | func TestSaveFile_PathTraversal(t *testing.T) { |
| 67 | uploadDir := t.TempDir() |