You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

85 lines
2.3 KiB
Go

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())
}