abfapi/test/mock_server.go

113 lines
No EOL
3.5 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()
}