diff --git a/src/infra/session-maintenance-warning.test.ts b/src/infra/session-maintenance-warning.test.ts index 3cf0ee72eeae..7fd1a454d367 100644 --- a/src/infra/session-maintenance-warning.test.ts +++ b/src/infra/session-maintenance-warning.test.ts @@ -199,4 +199,37 @@ describe("deliverSessionMaintenanceWarning", () => { { sessionKey: params.sessionKey }, ]); }); + + it.each([ + [59_500, "60 seconds", "1 minute"], + [3_570_000, "60 minutes", "1 hour"], + [86_370_000, "24 hours", "1 day"], + ])( + "formatDuration rolls over %dms to next unit instead of %s", + async (pruneAfterMs, _buggyOutput, expected) => { + mocks.deliverOutboundPayloads.mockRejectedValueOnce(new Error("force system event")); + const params = createParams({ + warning: { pruneAfterMs, wouldPrune: true, wouldCap: false, maxEntries: 100 } as never, + }); + + await deliverSessionMaintenanceWarning(params); + + expect(firstSystemEventCall()?.[0]).toContain(`older than ${expected}`); + }, + ); + + it.each([ + [30_000, "30 seconds"], + [1_800_000, "30 minutes"], + [43_200_000, "12 hours"], + ])("formatDuration keeps %dms in its own unit as %s", async (pruneAfterMs, expected) => { + mocks.deliverOutboundPayloads.mockRejectedValueOnce(new Error("force system event")); + const params = createParams({ + warning: { pruneAfterMs, wouldPrune: true, wouldCap: false, maxEntries: 100 } as never, + }); + + await deliverSessionMaintenanceWarning(params); + + expect(firstSystemEventCall()?.[0]).toContain(`older than ${expected}`); + }); }); diff --git a/src/infra/session-maintenance-warning.ts b/src/infra/session-maintenance-warning.ts index 5871de1311c3..9248de3d5f1c 100644 --- a/src/infra/session-maintenance-warning.ts +++ b/src/infra/session-maintenance-warning.ts @@ -54,20 +54,20 @@ function buildWarningContext(params: WarningParams): string { } function formatDuration(ms: number): string { - if (ms >= 86_400_000) { - const days = Math.round(ms / 86_400_000); - return `${days} day${days === 1 ? "" : "s"}`; + const secs = Math.round(ms / 1000); + if (secs < 60) { + return `${secs} second${secs === 1 ? "" : "s"}`; } - if (ms >= 3_600_000) { - const hours = Math.round(ms / 3_600_000); - return `${hours} hour${hours === 1 ? "" : "s"}`; - } - if (ms >= 60_000) { - const mins = Math.round(ms / 60_000); + const mins = Math.round(secs / 60); + if (mins < 60) { return `${mins} minute${mins === 1 ? "" : "s"}`; } - const secs = Math.round(ms / 1000); - return `${secs} second${secs === 1 ? "" : "s"}`; + const hours = Math.round(mins / 60); + if (hours < 24) { + return `${hours} hour${hours === 1 ? "" : "s"}`; + } + const days = Math.round(hours / 24); + return `${days} day${days === 1 ? "" : "s"}`; } function buildWarningText(warning: SessionMaintenanceWarning): string {