185 lines
4.4 KiB
Go
185 lines
4.4 KiB
Go
package cmd
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"os"
|
|
"path/filepath"
|
|
"sort"
|
|
"testing"
|
|
|
|
"github.com/gorilla/mux"
|
|
)
|
|
|
|
func setupTest(t *testing.T) (string, func()) {
|
|
tempDir := t.TempDir()
|
|
oldDir := serveDirectory
|
|
serveDirectory = tempDir
|
|
|
|
return tempDir, func() {
|
|
serveDirectory = oldDir
|
|
}
|
|
}
|
|
|
|
func TestUploadHandler_Success(t *testing.T) {
|
|
tempDir, cleanup := setupTest(t)
|
|
defer cleanup()
|
|
|
|
r := mux.NewRouter()
|
|
r.HandleFunc("/backup/{filename}", uploadHandler).Methods("POST")
|
|
|
|
body := bytes.NewBufferString("test data")
|
|
req := httptest.NewRequest("POST", "/backup/testfile", body)
|
|
req = mux.SetURLVars(req, map[string]string{"filename": "testfile"})
|
|
|
|
w := httptest.NewRecorder()
|
|
r.ServeHTTP(w, req)
|
|
|
|
if w.Code != http.StatusOK {
|
|
t.Errorf("Expected status 200, got %d", w.Code)
|
|
}
|
|
|
|
filePath := filepath.Join(tempDir, "testfile")
|
|
data, err := os.ReadFile(filePath)
|
|
if err != nil {
|
|
t.Fatal("File not created:", err)
|
|
}
|
|
|
|
if string(data) != "test data" {
|
|
t.Errorf("Expected 'test data', got '%s'", string(data))
|
|
}
|
|
}
|
|
|
|
func TestUploadHandler_CreateFileError(t *testing.T) {
|
|
_, cleanup := setupTest(t)
|
|
defer cleanup()
|
|
|
|
// Создаем директорию без прав на запись
|
|
serveDirectory = "/proc/invalid_path"
|
|
|
|
r := mux.NewRouter()
|
|
r.HandleFunc("/backup/{filename}", uploadHandler).Methods("POST")
|
|
|
|
body := bytes.NewBufferString("test")
|
|
req := httptest.NewRequest("POST", "/backup/testfile", body)
|
|
req = mux.SetURLVars(req, map[string]string{"filename": "testfile"})
|
|
|
|
w := httptest.NewRecorder()
|
|
r.ServeHTTP(w, req)
|
|
|
|
if w.Code != http.StatusInternalServerError {
|
|
t.Errorf("Expected status 500, got %d", w.Code)
|
|
}
|
|
}
|
|
|
|
func TestDownloadHandler_Success(t *testing.T) {
|
|
tempDir, cleanup := setupTest(t)
|
|
defer cleanup()
|
|
|
|
// Создаем тестовый файл
|
|
filePath := filepath.Join(tempDir, "testfile")
|
|
if err := os.WriteFile(filePath, []byte("test data"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
r := mux.NewRouter()
|
|
r.HandleFunc("/backup/{filename}", downloadHandler).Methods("GET")
|
|
|
|
req := httptest.NewRequest("GET", "/backup/testfile", nil)
|
|
req = mux.SetURLVars(req, map[string]string{"filename": "testfile"})
|
|
|
|
w := httptest.NewRecorder()
|
|
r.ServeHTTP(w, req)
|
|
|
|
if w.Code != http.StatusOK {
|
|
t.Errorf("Expected status 200, got %d", w.Code)
|
|
}
|
|
|
|
if body := w.Body.String(); body != "test data" {
|
|
t.Errorf("Expected 'test data', got '%s'", body)
|
|
}
|
|
}
|
|
|
|
func TestDownloadHandler_NotFound(t *testing.T) {
|
|
_, cleanup := setupTest(t)
|
|
defer cleanup()
|
|
|
|
r := mux.NewRouter()
|
|
r.HandleFunc("/backup/{filename}", downloadHandler).Methods("GET")
|
|
|
|
req := httptest.NewRequest("GET", "/backup/missing", nil)
|
|
req = mux.SetURLVars(req, map[string]string{"filename": "missing"})
|
|
|
|
w := httptest.NewRecorder()
|
|
r.ServeHTTP(w, req)
|
|
|
|
if w.Code != http.StatusNotFound {
|
|
t.Errorf("Expected status 404, got %d", w.Code)
|
|
}
|
|
}
|
|
|
|
func TestListHandler_Success(t *testing.T) {
|
|
tempDir, cleanup := setupTest(t)
|
|
defer cleanup()
|
|
|
|
// Создаем тестовые файлы
|
|
files := []string{"file1.txt", "file2.txt"}
|
|
for _, f := range files {
|
|
path := filepath.Join(tempDir, f)
|
|
if err := os.WriteFile(path, []byte("data"), 0644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
|
|
r := mux.NewRouter()
|
|
r.HandleFunc("/backup", listHandler).Methods("GET")
|
|
|
|
req := httptest.NewRequest("GET", "/backup", nil)
|
|
w := httptest.NewRecorder()
|
|
r.ServeHTTP(w, req)
|
|
|
|
if w.Code != http.StatusOK {
|
|
t.Errorf("Expected status 200, got %d", w.Code)
|
|
}
|
|
|
|
var result []string
|
|
if err := json.Unmarshal(w.Body.Bytes(), &result); err != nil {
|
|
t.Fatal("Failed to parse JSON:", err)
|
|
}
|
|
|
|
sort.Strings(result)
|
|
expected := []string{"file1.txt", "file2.txt"}
|
|
sort.Strings(expected)
|
|
|
|
if len(result) != len(expected) {
|
|
t.Fatalf("Expected %d files, got %d", len(expected), len(result))
|
|
}
|
|
|
|
for i := range expected {
|
|
if expected[i] != result[i] {
|
|
t.Errorf("Expected %s, got %s", expected[i], result[i])
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestListHandler_ReadDirError(t *testing.T) {
|
|
tempDir, cleanup := setupTest(t)
|
|
defer cleanup()
|
|
|
|
// Удаляем директорию чтобы вызвать ошибку
|
|
os.RemoveAll(tempDir)
|
|
|
|
r := mux.NewRouter()
|
|
r.HandleFunc("/backup", listHandler).Methods("GET")
|
|
|
|
req := httptest.NewRequest("GET", "/backup", nil)
|
|
w := httptest.NewRecorder()
|
|
r.ServeHTTP(w, req)
|
|
|
|
if w.Code != http.StatusInternalServerError {
|
|
t.Errorf("Expected status 500, got %d", w.Code)
|
|
}
|
|
}
|