From f9a0d205df948a34318405d9aba1c6d5500f89e0 Mon Sep 17 00:00:00 2001 From: kris Date: Sun, 5 Apr 2026 13:17:28 +0800 Subject: [PATCH] test: cover folder archive context tie-breakers --- tests/conversation-home-items.test.ts | 115 ++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/tests/conversation-home-items.test.ts b/tests/conversation-home-items.test.ts index 5008381..5f2195d 100644 --- a/tests/conversation-home-items.test.ts +++ b/tests/conversation-home-items.test.ts @@ -164,6 +164,121 @@ test("folder archives use the latest thread preview/time while subtitle and cont assert.equal(folder?.contextBudgetUpdatedAt, "2026-04-04T11:05:00+08:00"); }); +test("folder archive context ring prefers more urgent contextBudgetLevel when mustFinishBeforeCompaction is equal", async () => { + await setup(); + const state = await readState(); + + state.projects = state.projects.filter((project) => project.id === "master-agent"); + state.projects.push( + buildImportedThreadProject( + "mac-studio", + "boss-thread-latest", + "Boss", + "boss", + "最新线程", + "thread-latest", + "2026-04-04T12:00:00+08:00", + ), + buildImportedThreadProject( + "mac-studio", + "boss-thread-watch", + "Boss", + "boss", + "次要关注", + "thread-watch", + "2026-04-04T11:00:00+08:00", + ), + ); + state.threadContextSnapshots = [ + buildThreadContextSnapshot( + "boss-thread-latest", + "thread-latest", + "最新线程", + "watch", + false, + 22, + "2026-04-04T12:05:00+08:00", + "node-watch", + ), + buildThreadContextSnapshot( + "boss-thread-watch", + "thread-watch", + "次要关注", + "urgent", + false, + 61, + "2026-04-04T11:05:00+08:00", + "node-urgent", + ), + ]; + + const folder = getConversationHomeItems(state).find((item) => item.conversationType === "folder_archive"); + + assert.ok(folder, "expected grouped folder archive item"); + assert.equal(folder?.contextBudgetIndicator.level, "urgent"); + assert.equal(folder?.contextBudgetIndicator.percent, 61); + assert.equal(folder?.contextBudgetSourceNodeId, "node-urgent"); + assert.equal(folder?.contextBudgetUpdatedAt, "2026-04-04T11:05:00+08:00"); +}); + +test("folder archive context ring prefers newer latestReplyAt when mustFinishBeforeCompaction and contextBudgetLevel are equal", async () => { + await setup(); + const state = await readState(); + + state.projects = state.projects.filter((project) => project.id === "master-agent"); + state.projects.push( + buildImportedThreadProject( + "mac-studio", + "boss-thread-older", + "Boss", + "boss", + "较早线程", + "thread-older", + "2026-04-04T10:00:00+08:00", + ), + buildImportedThreadProject( + "mac-studio", + "boss-thread-newer", + "Boss", + "boss", + "较新线程", + "thread-newer", + "2026-04-04T12:00:00+08:00", + ), + ); + state.threadContextSnapshots = [ + buildThreadContextSnapshot( + "boss-thread-older", + "thread-older", + "较早线程", + "urgent", + false, + 19, + "2026-04-04T10:05:00+08:00", + "node-older", + ), + buildThreadContextSnapshot( + "boss-thread-newer", + "thread-newer", + "较新线程", + "urgent", + false, + 19, + "2026-04-04T12:05:00+08:00", + "node-newer", + ), + ]; + + const folder = getConversationHomeItems(state).find((item) => item.conversationType === "folder_archive"); + + assert.ok(folder, "expected grouped folder archive item"); + assert.equal(folder?.latestReplyAt, "2026-04-04T12:00:00+08:00"); + assert.equal(folder?.contextBudgetIndicator.level, "urgent"); + assert.equal(folder?.contextBudgetIndicator.percent, 19); + assert.equal(folder?.contextBudgetSourceNodeId, "node-newer"); + assert.equal(folder?.contextBudgetUpdatedAt, "2026-04-04T12:05:00+08:00"); +}); + test("conversation home upgrades and downgrades a folder archive as thread count crosses 1 and 2", async () => { await setup(); const state = await readState();