package health import ( "context" "errors" "testing" "gl/domain/ledger" ) type databaseStub struct{ err error } func (s databaseStub) Ping(context.Context) error { return s.err } type settlementStub struct { stats ledger.SettlementStats err error } func (s settlementStub) Stats(context.Context) (ledger.SettlementStats, error) { return s.stats, s.err } func TestCheckReportsDatabaseReadiness(t *testing.T) { for _, tc := range []struct { name string db Database ready bool }{ {name: "not connected", db: nil, ready: false}, {name: "ready", db: databaseStub{}, ready: true}, {name: "unavailable", db: databaseStub{err: errors.New("down")}, ready: false}, } { t.Run(tc.name, func(t *testing.T) { got := NewService(tc.db).Check(context.Background()) if got.Serving != tc.ready || got.DatabaseReady != tc.ready { t.Fatalf("unexpected status: %+v", got) } }) } } func TestCheckReportsSettlementBacklog(t *testing.T) { monitor := settlementStub{stats: ledger.SettlementStats{Pending: 2, Retryable: 3, OldestPendingSeconds: 60}} got := NewService(databaseStub{}, monitor).Check(context.Background()) if !got.Serving || !got.DatabaseReady || !got.SettlementEnabled || !got.SettlementReady || got.SettlementStats != monitor.stats { t.Fatalf("unexpected status: %+v", got) } } func TestCheckExposesManualReviewWithoutStoppingSettlementQueue(t *testing.T) { got := NewService(databaseStub{}, settlementStub{stats: ledger.SettlementStats{ManualReview: 1}}).Check(context.Background()) if !got.Serving || !got.SettlementReady || got.SettlementStats.ManualReview != 1 { t.Fatalf("unexpected status: %+v", got) } } func TestCheckReportsSettlementQueryFailure(t *testing.T) { got := NewService(databaseStub{}, settlementStub{err: errors.New("query failed")}).Check(context.Background()) if !got.Serving || got.SettlementReady { t.Fatalf("unexpected status: %+v", got) } }