Files
GL/application/health/service_test.go
T
nfel 88e227f80c
CI/CD Stage / stage (push) Failing after 1m12s
feat(gl): add standalone ledger authority mode
2026-10-06 22:40:07 +03:30

76 lines
2.5 KiB
Go

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)
}
}
type pausedSettlementStub struct{ settlementStub }
func (pausedSettlementStub) SettlementAllowed(context.Context) (bool, error) { return false, nil }
func TestGLOnlyKeepsLedgerServingWhileNormalSettlementClientsFailClosed(t *testing.T) {
monitor := pausedSettlementStub{settlementStub{stats: ledger.SettlementStats{Pending: 3}}}
got := NewService(databaseStub{}, monitor).Check(context.Background())
if !got.Serving || !got.DatabaseReady || !got.SettlementEnabled || got.SettlementReady || got.SettlementStats.Pending != 3 {
t.Fatalf("unexpected GL-only readiness: %+v", got)
}
}