abfapi/test/main.go
2025-01-08 00:43:24 +03:00

155 lines
No EOL
5.7 KiB
Go
Raw 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 (
"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) {
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 == "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")
}