abfapi/test/main.go
2025-01-08 14:45:29 +03:00

162 lines
No EOL
6.2 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 (
"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") {
log.Printf("Invalid Content-Type: %s", contentType)
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")
}