feat: bootstrap reusable GoOmni framework
This commit is contained in:
73
health/health_test.go
Normal file
73
health/health_test.go
Normal file
@@ -0,0 +1,73 @@
|
||||
package health
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
omni "git.yuntuo.hk/k2safe/go-omni"
|
||||
"git.yuntuo.hk/k2safe/go-omni/transport/nethttp"
|
||||
)
|
||||
|
||||
func TestCheckerReadinessReportsAllProbes(t *testing.T) {
|
||||
checker, err := New(
|
||||
Probe{Name: "database", Check: func(context.Context) error { return nil }},
|
||||
Probe{Name: "cache", Check: func(context.Context) error { return errors.New("connection refused") }},
|
||||
)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
app := omni.NewWithRouter(nethttp.New())
|
||||
app.GET("/live", checker.LivenessHandler())
|
||||
app.GET("/ready", checker.ReadinessHandler())
|
||||
|
||||
live := httptest.NewRecorder()
|
||||
app.ServeHTTP(live, httptest.NewRequest(http.MethodGet, "/live", nil))
|
||||
if live.Code != http.StatusOK {
|
||||
t.Fatalf("expected liveness 200, got %d", live.Code)
|
||||
}
|
||||
|
||||
ready := httptest.NewRecorder()
|
||||
app.ServeHTTP(ready, httptest.NewRequest(http.MethodGet, "/ready", nil))
|
||||
if ready.Code != http.StatusServiceUnavailable {
|
||||
t.Fatalf("expected readiness 503, got %d", ready.Code)
|
||||
}
|
||||
var body struct {
|
||||
Code string `json:"code"`
|
||||
Data Result `json:"data"`
|
||||
}
|
||||
if err := json.Unmarshal(ready.Body.Bytes(), &body); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if body.Code != "NOT_READY" || body.Data.Status != StatusNotReady || len(body.Data.Checks) != 2 || body.Data.Checks[1].Error != "connection refused" {
|
||||
t.Fatalf("unexpected readiness response: %+v", body)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCheckerTimeoutAndRegistrationValidation(t *testing.T) {
|
||||
checker, err := New(Probe{
|
||||
Name: "slow",
|
||||
Timeout: 5 * time.Millisecond,
|
||||
Check: func(ctx context.Context) error {
|
||||
<-ctx.Done()
|
||||
return ctx.Err()
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
result := checker.Check(context.Background())
|
||||
if result.Ready() || result.Checks[0].Status != StatusNotReady {
|
||||
t.Fatalf("expected timeout to fail readiness: %+v", result)
|
||||
}
|
||||
|
||||
for _, probe := range []Probe{{Check: func(context.Context) error { return nil }}, {Name: "slow", Check: func(context.Context) error { return nil }}, {Name: "negative", Timeout: -time.Second, Check: func(context.Context) error { return nil }}} {
|
||||
if err := checker.Add(probe); err == nil {
|
||||
t.Fatalf("expected registration error for %+v", probe)
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user