package database import ( "context" "log/slog" "os" "time" "go.uber.org/fx" ) // NewTestRetentionReaper builds a RetentionReaper backed by the given // main database and per-webhook database manager, without the fx // lifecycle. Intended for tests. func NewTestRetentionReaper( db *Database, mgr *WebhookDBManager, ) *RetentionReaper { return &RetentionReaper{ db: db, dbManager: mgr, log: slog.New(slog.NewTextHandler( os.Stderr, &slog.HandlerOptions{Level: slog.LevelDebug}, )), interval: time.Hour, } } // ExportSweep runs a single retention sweep synchronously for tests. func (r *RetentionReaper) ExportSweep(ctx context.Context) { r.sweep(ctx) } // ExportRegisterHooks registers the reaper's real fx lifecycle hooks // on a lifecycle supplied by a test, so a test can drive the exact // OnStart/OnStop functions the application runs and hand OnStart the // kind of context fx actually supplies. func (r *RetentionReaper) ExportRegisterHooks(lc fx.Lifecycle) { r.registerHooks(lc) } // ExportStart starts the reaper's background loop for tests. func (r *RetentionReaper) ExportStart() { r.start() } // ExportStop stops the reaper's background loop for tests. func (r *RetentionReaper) ExportStop() { r.stop() } // ExportSetInterval overrides the sweep interval for tests. func (r *RetentionReaper) ExportSetInterval(d time.Duration) { r.interval = d }