package httpserver import ( "context" "errors" "net/http" "net/http/httptest" "strings" "testing" "git.yuntuo.hk/k2safe/orbit/internal/observability" ) func TestHealthSeparatesLivenessAndReadiness(t *testing.T) { server := New("127.0.0.1:0", func(context.Context) error { return errors.New("internal-database-details") }) for path, want := range map[string]int{"/health/live": 200, "/health/ready": 503, "/v1/tasks": 404} { rr := httptest.NewRecorder() server.Handler.ServeHTTP(rr, httptest.NewRequest(http.MethodGet, path, nil)) if rr.Code != want || strings.Contains(rr.Body.String(), "internal-database-details") { t.Fatalf("%s: %d %s", path, rr.Code, rr.Body.String()) } } } func TestMetricsListenerIsSeparateAndOptional(t *testing.T) { metrics := observability.NewRegistry() business := New("", nil) WrapMetrics(business, metrics) private := NewMetricsServer("", metrics) for _, tc := range []struct { handler http.Handler path string want int }{ {business.Handler, "/metrics", 404}, {private.Handler, "/v1/tasks", 404}, {private.Handler, "/metrics", 200}, {NewMetricsServer("", nil).Handler, "/metrics", 404}, {private.Handler, "/metrics?secret=value", 400}, } { rr := httptest.NewRecorder() tc.handler.ServeHTTP(rr, httptest.NewRequest("GET", tc.path, nil)) if rr.Code != tc.want { t.Fatalf("%s: %d", tc.path, rr.Code) } if strings.Contains(rr.Body.String(), "secret") { t.Fatal("query leaked") } } }