package httpx_test import ( "io" "net/http" "net/http/httptest" "testing" "git.asio.asia/nixevol/NixMsg/internal/httpx" "git.asio.asia/nixevol/NixMsg/internal/listener" "git.asio.asia/nixevol/NixMsg/internal/metrics" ) func TestMetricsGateSharedPort(t *testing.T) { reg := metrics.New() okHandler := reg.Handler() t.Run("empty token 404", func(t *testing.T) { mux := listener.NewMux(listener.RoleShared, listener.Handlers{ Metrics: okHandler, MetricsToken: "", }) res := httptest.NewRecorder() mux.ServeHTTP(res, httptest.NewRequest(http.MethodGet, "/metrics", nil)) if res.Code != http.StatusNotFound { t.Fatalf("want 404 got %d", res.Code) } }) t.Run("wrong token 401", func(t *testing.T) { mux := listener.NewMux(listener.RoleShared, listener.Handlers{ Metrics: okHandler, MetricsToken: "secret-token", }) req := httptest.NewRequest(http.MethodGet, "/metrics", nil) req.Header.Set("Authorization", "Bearer wrong") res := httptest.NewRecorder() mux.ServeHTTP(res, req) if res.Code != http.StatusUnauthorized { t.Fatalf("want 401 got %d", res.Code) } }) t.Run("no auth 401", func(t *testing.T) { mux := listener.NewMux(listener.RoleShared, listener.Handlers{ Metrics: okHandler, MetricsToken: "secret-token", }) res := httptest.NewRecorder() mux.ServeHTTP(res, httptest.NewRequest(http.MethodGet, "/metrics", nil)) if res.Code != http.StatusUnauthorized { t.Fatalf("want 401 got %d", res.Code) } }) t.Run("good token 200", func(t *testing.T) { mux := listener.NewMux(listener.RoleShared, listener.Handlers{ Metrics: okHandler, MetricsToken: "secret-token", }) req := httptest.NewRequest(http.MethodGet, "/metrics", nil) req.Header.Set("Authorization", "Bearer secret-token") res := httptest.NewRecorder() mux.ServeHTTP(res, req) if res.Code != http.StatusOK { t.Fatalf("want 200 got %d", res.Code) } body, _ := io.ReadAll(res.Body) if len(body) == 0 { t.Fatal("empty metrics body") } }) t.Run("admin role no auth", func(t *testing.T) { mux := listener.NewMux(listener.RoleAdmin, listener.Handlers{ Metrics: okHandler, }) res := httptest.NewRecorder() mux.ServeHTTP(res, httptest.NewRequest(http.MethodGet, "/metrics", nil)) if res.Code != http.StatusOK { t.Fatalf("admin metrics want 200 got %d", res.Code) } }) } func TestMetricsGateDirect(t *testing.T) { h := httpx.MetricsGate("tok", http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusOK) _, _ = w.Write([]byte("ok")) })) res := httptest.NewRecorder() req := httptest.NewRequest(http.MethodGet, "/metrics", nil) req.Header.Set("Authorization", "Bearer tok") h.ServeHTTP(res, req) if res.Code != 200 || res.Body.String() != "ok" { t.Fatalf("got %d %q", res.Code, res.Body.String()) } }