feat(server): graceful scheduler shutdown, /healthz, healthcheck mode

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BwxdSt4reTm7Dj1oxRvpP3
This commit is contained in:
2026-07-04 15:46:56 +07:00
parent c265d36bdb
commit a27ddc79e8
2 changed files with 132 additions and 16 deletions
+70 -1
View File
@@ -1,6 +1,10 @@
package main
import "testing"
import (
"net/http"
"net/http/httptest"
"testing"
)
func TestIsAPIPath(t *testing.T) {
cases := []struct {
@@ -20,3 +24,68 @@ func TestIsAPIPath(t *testing.T) {
}
}
}
func TestBuildMux(t *testing.T) {
var metricsHit, apiHit, webHit bool
metricsHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
metricsHit = true
w.WriteHeader(http.StatusOK)
})
apiRouter := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
apiHit = true
w.WriteHeader(http.StatusOK)
})
webHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
webHit = true
w.WriteHeader(http.StatusOK)
})
mux := buildMux(metricsHandler, apiRouter, webHandler)
t.Run("healthz returns 200 ok", func(t *testing.T) {
metricsHit, apiHit, webHit = false, false, false
rr := httptest.NewRecorder()
req := httptest.NewRequest(http.MethodGet, "/healthz", nil)
mux.ServeHTTP(rr, req)
if rr.Code != http.StatusOK {
t.Fatalf("status = %d, want %d", rr.Code, http.StatusOK)
}
if rr.Body.String() != "ok" {
t.Fatalf("body = %q, want %q", rr.Body.String(), "ok")
}
if metricsHit || apiHit || webHit {
t.Fatalf("healthz must not fall through to other handlers")
}
})
t.Run("metrics routed to metrics handler", func(t *testing.T) {
metricsHit, apiHit, webHit = false, false, false
rr := httptest.NewRecorder()
req := httptest.NewRequest(http.MethodGet, "/metrics", nil)
mux.ServeHTTP(rr, req)
if !metricsHit {
t.Fatalf("expected metrics handler to be hit")
}
})
t.Run("api path routed to api router", func(t *testing.T) {
metricsHit, apiHit, webHit = false, false, false
rr := httptest.NewRecorder()
req := httptest.NewRequest(http.MethodGet, "/api/domains", nil)
mux.ServeHTTP(rr, req)
if !apiHit {
t.Fatalf("expected api router to be hit")
}
})
t.Run("other path routed to web handler", func(t *testing.T) {
metricsHit, apiHit, webHit = false, false, false
rr := httptest.NewRecorder()
req := httptest.NewRequest(http.MethodGet, "/domains/xyz", nil)
mux.ServeHTTP(rr, req)
if !webHit {
t.Fatalf("expected web handler to be hit")
}
})
}