From 25741a7fb06a82db183c8cc3bb635f6460a80bcd Mon Sep 17 00:00:00 2001 From: Halil Tezcan KARABULUT Date: Fri, 29 May 2026 23:08:34 +0300 Subject: [PATCH] fix(cleanup): restore usage history cutoff boundary --- src/lib/db/cleanup.ts | 2 +- .../database-settings-maintenance.test.ts | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/lib/db/cleanup.ts b/src/lib/db/cleanup.ts index e49fd2b92f..9d67fb9151 100644 --- a/src/lib/db/cleanup.ts +++ b/src/lib/db/cleanup.ts @@ -28,7 +28,6 @@ export async function cleanupQuotaSnapshots(): Promise { const cutoffDate = new Date(); cutoffDate.setDate(cutoffDate.getDate() - retentionDays); const cutoffISO = cutoffDate.toISOString(); - const cutoffDateStr = cutoffISO.split("T")[0]; const result: CleanupResult = { deleted: 0, errors: 0 }; @@ -87,6 +86,7 @@ export async function cleanupUsageHistory(): Promise { const cutoffDate = new Date(); cutoffDate.setDate(cutoffDate.getDate() - retentionDays); const cutoffISO = cutoffDate.toISOString(); + const cutoffDateStr = cutoffISO.split("T")[0]; const result: CleanupResult = { deleted: 0, errors: 0 }; diff --git a/tests/unit/database-settings-maintenance.test.ts b/tests/unit/database-settings-maintenance.test.ts index fa553eb687..449ee5a4ea 100644 --- a/tests/unit/database-settings-maintenance.test.ts +++ b/tests/unit/database-settings-maintenance.test.ts @@ -186,3 +186,36 @@ test("usage aggregation upserts replace recomputed totals instead of adding them assert.equal(hourly.total_output_tokens, 10); assert.equal(hourly.total_cost, 0.75); }); + +test("cleanupUsageHistory rolls up and deletes old rows using the same day boundary", async () => { + const db = core.getDbInstance(); + const oldTimestamp = "2024-01-01T12:00:00.000Z"; + const recentTimestamp = new Date().toISOString(); + + databaseSettings.updateDatabaseSettings({ + retention: { + ...databaseSettings.getUserDatabaseSettings().retention, + usageHistory: 30, + }, + }); + + const insertUsage = db.prepare( + `INSERT INTO usage_history (provider, model, timestamp, tokens_input, tokens_output, success, latency_ms) + VALUES (?, ?, ?, ?, ?, ?, ?)` + ); + insertUsage.run("openai", "gpt-test", oldTimestamp, 100, 40, 1, 200); + insertUsage.run("openai", "gpt-test", recentTimestamp, 7, 3, 1, 100); + + const result = await cleanup.cleanupUsageHistory(); + + assert.equal(result.errors, 0); + assert.equal(result.deleted, 1); + + const remaining = db.prepare("SELECT COUNT(*) AS count FROM usage_history").get() as CountRow; + assert.equal(remaining.count, 1); + + const daily = db.prepare("SELECT * FROM daily_usage_summary").get() as UsageSummaryRow; + assert.equal(daily.total_requests, 1); + assert.equal(daily.total_input_tokens, 100); + assert.equal(daily.total_output_tokens, 40); +});