package main import ( "crypto/sha1" "encoding/json" "fmt" "io" "log" "net/http" "net/http/httptest" "os" "strings" "tvoygit.ru/Djam/abfapi" ) // 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) { log.Printf("Handling request to /api/v1/arches.json") 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) { log.Printf("Handling request to /api/v1/upload") 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 { log.Printf("Error parsing form: %v", err) w.WriteHeader(http.StatusBadRequest) return } // Получаем файл из формы file, handler, err := r.FormFile("file_store[file]") if err != nil { log.Printf("Error getting file from form: %v", err) w.WriteHeader(http.StatusBadRequest) return } defer file.Close() // Читаем содержимое файла content, err := io.ReadAll(file) if err != nil { log.Printf("Error reading file content: %v", err) 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) { log.Printf("Handling request to /api/v1/file_stores/") 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 == "be730b67b175ac8dc96c9006e88e4166713cb1b5" { 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() } func main() { logger := log.New(os.Stdout, "ABF: ", log.LstdFlags) // Создаем тестовый сервер с моками mockServer := NewMockServer() defer mockServer.Close() // Используем URL тестового сервера вместо реальных URL abfClient, err := abfapi.NewAbfJson(mockServer.Server.URL, mockServer.Server.URL, "username", "password", logger) if err != nil { logger.Fatalf("Failed to create ABF client: %v", err) } // Пример вызова метода GetArchitectures architectures, err := abfClient.GetArchitectures() if err != nil { logger.Fatalf("Failed to get architectures: %v", err) } logger.Printf("Architectures: %+v", architectures) // Пример вызова метода UploadFile shaHash, err := abfClient.UploadFile("testfile.txt", false) if err != nil { logger.Fatalf("Failed to upload file: %v", err) } logger.Printf("Uploaded file SHA1: %s", shaHash) // Пример вызова метода FetchFile err = abfClient.FetchFile(shaHash, "downloaded_testfile.txt") if err != nil { logger.Fatalf("Failed to fetch file: %v", err) } logger.Printf("File fetched successfully") }