package integration import ( "encoding/json" "fmt" "net" "net/http" "net/http/httptest" "testing" "github.com/noahlann/nnet/pkg/nnet" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) // TestHealthCheck 测试健康检查 func TestHealthCheck(t *testing.T) { listener, err := net.Listen("tcp", "127.0.0.1:0") require.NoError(t, err) port := listener.Addr().(*net.TCPAddr).Port listener.Close() cfg := &nnet.Config{ Addr: fmt.Sprintf("tcp://127.0.0.1:%d", port), } ts := StartTestServerWithRoutes(t, cfg, func(srv nnet.Server) { srv.Router().RegisterString("test", func(ctx nnet.Context) error { return ctx.Response().WriteBytes([]byte("ok\n")) }) }) defer CleanupTestServer(t, ts) // 获取健康检查器 healthChecker := ts.Server.HealthChecker() require.NotNil(t, healthChecker, "Health checker should not be nil") // 获取健康状态 status, results := healthChecker.Check() assert.NotEmpty(t, status, "Status should not be empty") assert.NotNil(t, results, "Results should not be nil") t.Logf("Health status: %s, results: %+v", status, results) } // TestHealthHandler 测试健康检查HTTP处理器 func TestHealthHandler(t *testing.T) { listener, err := net.Listen("tcp", "127.0.0.1:0") require.NoError(t, err) port := listener.Addr().(*net.TCPAddr).Port listener.Close() cfg := &nnet.Config{ Addr: fmt.Sprintf("tcp://127.0.0.1:%d", port), } ts := StartTestServerWithRoutes(t, cfg, func(srv nnet.Server) { srv.Router().RegisterString("test", func(ctx nnet.Context) error { return ctx.Response().WriteBytes([]byte("ok\n")) }) }) defer CleanupTestServer(t, ts) // 获取健康检查处理器 handler := ts.Server.HealthHandler() require.NotNil(t, handler, "Health handler should not be nil") // 创建HTTP请求 req := httptest.NewRequest(http.MethodGet, "/health", nil) w := httptest.NewRecorder() // 调用处理器 handler.ServeHTTP(w, req) // 验证响应 assert.Equal(t, http.StatusOK, w.Code, "Response status should be OK") var result map[string]interface{} err = json.Unmarshal(w.Body.Bytes(), &result) assert.NoError(t, err, "Response should be valid JSON") assert.Contains(t, result, "status", "Response should contain status") assert.Contains(t, result, "results", "Response should contain results") t.Logf("Health check response: %s", w.Body.String()) }