package adminapi import ( "context" "net/http" "testing" "time" "galaxy/user/internal/config" "github.com/stretchr/testify/require" ) func TestServerRunDisabledWaitsForContext(t *testing.T) { t.Parallel() server := NewServer(config.AdminHTTPConfig{}, http.HandlerFunc(func(http.ResponseWriter, *http.Request) { t.Fatal("disabled admin server must not serve requests") }), nil) ctx, cancel := context.WithCancel(context.Background()) defer cancel() errCh := make(chan error, 1) go func() { errCh <- server.Run(ctx) }() cancel() select { case err := <-errCh: require.ErrorIs(t, err, context.Canceled) case <-time.After(2 * time.Second): t.Fatal("disabled admin server did not stop after context cancellation") } } func TestServerRunServesMetricsOnly(t *testing.T) { t.Parallel() server := NewServer(config.AdminHTTPConfig{ Addr: "127.0.0.1:0", ReadHeaderTimeout: 2 * time.Second, ReadTimeout: 10 * time.Second, IdleTimeout: time.Minute, }, http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { _, _ = w.Write([]byte("sample_metric 1\n")) }), nil) ctx, cancel := context.WithCancel(context.Background()) defer cancel() errCh := make(chan error, 1) go func() { errCh <- server.Run(ctx) }() addr := waitForListener(t, server) metricsResponse, err := http.Get("http://" + addr + "/metrics") require.NoError(t, err) t.Cleanup(func() { _ = metricsResponse.Body.Close() }) require.Equal(t, http.StatusOK, metricsResponse.StatusCode) rootResponse, err := http.Get("http://" + addr + "/") require.NoError(t, err) t.Cleanup(func() { _ = rootResponse.Body.Close() }) require.Equal(t, http.StatusNotFound, rootResponse.StatusCode) cancel() select { case err := <-errCh: require.NoError(t, err) case <-time.After(2 * time.Second): t.Fatal("admin server did not stop after context cancellation") } } func waitForListener(t *testing.T, server *Server) string { t.Helper() deadline := time.Now().Add(2 * time.Second) for time.Now().Before(deadline) { server.stateMu.RLock() listener := server.listener server.stateMu.RUnlock() if listener != nil { return listener.Addr().String() } time.Sleep(10 * time.Millisecond) } t.Fatal("admin server listener did not start") return "" }