76 lines
2.4 KiB
Go
76 lines
2.4 KiB
Go
package main
|
|
|
|
import (
|
|
"net"
|
|
"net/http"
|
|
"os"
|
|
"path/filepath"
|
|
"strconv"
|
|
"testing"
|
|
)
|
|
|
|
// serveHealthz поднимает http-сервер на свободном порту, отдавая указанный
|
|
// статус на /healthz. Возвращает порт и стоп-функцию.
|
|
func serveHealthz(t *testing.T, status int) int {
|
|
t.Helper()
|
|
ln, err := net.Listen("tcp", "127.0.0.1:0")
|
|
if err != nil {
|
|
t.Fatalf("listen: %v", err)
|
|
}
|
|
mux := http.NewServeMux()
|
|
mux.HandleFunc("/healthz", func(w http.ResponseWriter, _ *http.Request) {
|
|
w.WriteHeader(status)
|
|
})
|
|
srv := &http.Server{Handler: mux}
|
|
go func() { _ = srv.Serve(ln) }()
|
|
t.Cleanup(func() { _ = srv.Close() })
|
|
return ln.Addr().(*net.TCPAddr).Port
|
|
}
|
|
|
|
func writeConfig(t *testing.T, port int) string {
|
|
t.Helper()
|
|
dir := t.TempDir()
|
|
// Медиа-пути должны существовать как каталоги (fail-fast валидация конфига).
|
|
for _, sub := range []string{"downloads", "movies", "series"} {
|
|
if err := os.MkdirAll(filepath.Join(dir, sub), 0o755); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
path := filepath.Join(dir, "config.toml")
|
|
content := "" +
|
|
"[qbittorrent]\nurl = \"http://qbit:8080\"\npassword = \"secret\"\n\n" +
|
|
"[paths]\n" +
|
|
"downloads = \"" + filepath.Join(dir, "downloads") + "\"\n" +
|
|
"movies = \"" + filepath.Join(dir, "movies") + "\"\n" +
|
|
"series = \"" + filepath.Join(dir, "series") + "\"\n\n" +
|
|
"[http]\nlisten = \"127.0.0.1:" + strconv.Itoa(port) + "\"\n"
|
|
if err := os.WriteFile(path, []byte(content), 0o644); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
return path
|
|
}
|
|
|
|
func TestHealthcheck_OK(t *testing.T) {
|
|
port := serveHealthz(t, http.StatusOK)
|
|
if err := runHealthcheck([]string{"--config", writeConfig(t, port)}); err != nil {
|
|
t.Errorf("healthcheck: %v", err)
|
|
}
|
|
}
|
|
|
|
func TestHealthcheck_BadStatus(t *testing.T) {
|
|
port := serveHealthz(t, http.StatusServiceUnavailable)
|
|
if err := runHealthcheck([]string{"--config", writeConfig(t, port)}); err == nil {
|
|
t.Error("ожидалась ошибка при 503")
|
|
}
|
|
}
|
|
|
|
func TestHealthcheck_NoServer(t *testing.T) {
|
|
// Порт, на котором никто не слушает (берём свободный и закрываем).
|
|
ln, _ := net.Listen("tcp", "127.0.0.1:0")
|
|
port := ln.Addr().(*net.TCPAddr).Port
|
|
_ = ln.Close()
|
|
if err := runHealthcheck([]string{"--config", writeConfig(t, port)}); err == nil {
|
|
t.Error("ожидалась ошибка без сервера")
|
|
}
|
|
}
|