package main import ( "encoding/json" "net/http" "net/http/httptest" "strings" ) // MockServer представляет собой тестовый HTTP-сервер с моками. type MockServer struct { Server *httptest.Server } // NewMockServer создает новый тестовый сервер с моками. func NewMockServer() *MockServer { mux := http.NewServeMux() // Мок для /api/v1/arches.json mux.HandleFunc("/api/v1/arches.json", func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { w.WriteHeader(http.StatusMethodNotAllowed) return } response := map[string]interface{}{ "architectures": []string{"x86_64", "i386", "arm64"}, } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(response) }) // Мок для /api/v1/upload mux.HandleFunc("/api/v1/upload", func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost { w.WriteHeader(http.StatusMethodNotAllowed) return } if contentType := r.Header.Get("Content-Type"); !strings.Contains(contentType, "multipart/form-data") { w.WriteHeader(http.StatusBadRequest) return } // Парсим multipart/form-data err := r.ParseMultipartForm(10 << 20) // 10 MB max memory if err != nil { w.WriteHeader(http.StatusBadRequest) return } // Получаем файл из формы file, handler, err := r.FormFile("file_store[file]") if err != nil { w.WriteHeader(http.StatusBadRequest) return } defer file.Close() // Читаем содержимое файла content, err := io.ReadAll(file) if err != nil { w.WriteHeader(http.StatusInternalServerError) return } // Вычисляем SHA1 хеш файла hasher := sha1.New() hasher.Write(content) shaHash := fmt.Sprintf("%x", hasher.Sum(nil)) response := map[string]interface{}{ "sha1_hash": shaHash, "file_name": handler.Filename, } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(response) }) // Мок для /api/v1/file_stores/{hash} mux.HandleFunc("/api/v1/file_stores/", func(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodGet { w.WriteHeader(http.StatusMethodNotAllowed) return } parts := strings.Split(r.URL.Path, "/") if len(parts) < 5 { w.WriteHeader(http.StatusBadRequest) return } shaHash := parts[4] // Пример ответа для конкретного хеша if shaHash == "expected_sha1_hash" { response := map[string]interface{}{ "sha1_hash": shaHash, "file_name": "testfile.txt", } w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode([]interface{}{response}) } else { w.WriteHeader(http.StatusNotFound) } }) server := httptest.NewServer(mux) return &MockServer{ Server: server, } } // Close останавливает тестовый сервер. func (ms *MockServer) Close() { ms.Server.Close() }