test(tmux-subagent): expand polling-manager test coverage
This commit is contained in:
@@ -68,6 +68,8 @@ describe("TmuxPollingManager overlap", () => {
|
|||||||
closePending: false,
|
closePending: false,
|
||||||
closeRetryCount: 0,
|
closeRetryCount: 0,
|
||||||
activityVersion: 0,
|
activityVersion: 0,
|
||||||
|
stableIdlePolls: 2,
|
||||||
|
observedIdleActivityVersion: 0,
|
||||||
})
|
})
|
||||||
|
|
||||||
let messagesCallCount = 0
|
let messagesCallCount = 0
|
||||||
@@ -100,10 +102,138 @@ describe("TmuxPollingManager overlap", () => {
|
|||||||
await pollSessions.call(manager)
|
await pollSessions.call(manager)
|
||||||
await pollSessions.call(manager)
|
await pollSessions.call(manager)
|
||||||
await pollSessions.call(manager)
|
await pollSessions.call(manager)
|
||||||
await pollSessions.call(manager)
|
|
||||||
|
|
||||||
//#then
|
//#then
|
||||||
expect(messagesCallCount).toBe(0)
|
expect(messagesCallCount).toBe(0)
|
||||||
expect(closedSessionIds).toEqual(["ses-1"])
|
expect(closedSessionIds).toEqual(["ses-1"])
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test("does not close sessions missing from one poll until the longer grace window elapses", async () => {
|
||||||
|
// given
|
||||||
|
const now = Date.now()
|
||||||
|
const sessions = new Map<string, TrackedSession>()
|
||||||
|
sessions.set("ses-1", {
|
||||||
|
sessionId: "ses-1",
|
||||||
|
paneId: "%1",
|
||||||
|
description: "test",
|
||||||
|
createdAt: new Date(now - 1_000),
|
||||||
|
lastSeenAt: new Date(now - 7_000),
|
||||||
|
closePending: false,
|
||||||
|
closeRetryCount: 0,
|
||||||
|
activityVersion: 0,
|
||||||
|
})
|
||||||
|
|
||||||
|
const closedSessionIds: string[] = []
|
||||||
|
const client = {
|
||||||
|
session: {
|
||||||
|
status: async () => ({ data: {} }),
|
||||||
|
messages: async () => ({ data: [] }),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const manager = new TmuxPollingManager(
|
||||||
|
client as unknown as import("../../tools/delegate-task/types").OpencodeClient,
|
||||||
|
sessions,
|
||||||
|
async (sessionId) => {
|
||||||
|
closedSessionIds.push(sessionId)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
// when
|
||||||
|
const pollSessions = (manager as unknown as { pollSessions: () => Promise<void> }).pollSessions
|
||||||
|
await pollSessions.call(manager)
|
||||||
|
|
||||||
|
// then
|
||||||
|
expect(closedSessionIds).toEqual([])
|
||||||
|
})
|
||||||
|
|
||||||
|
test("does not time out active sessions after only eleven minutes", async () => {
|
||||||
|
// given
|
||||||
|
const now = Date.now()
|
||||||
|
const sessions = new Map<string, TrackedSession>()
|
||||||
|
sessions.set("ses-1", {
|
||||||
|
sessionId: "ses-1",
|
||||||
|
paneId: "%1",
|
||||||
|
description: "test",
|
||||||
|
createdAt: new Date(now - 11 * 60 * 1000),
|
||||||
|
lastSeenAt: new Date(now),
|
||||||
|
closePending: false,
|
||||||
|
closeRetryCount: 0,
|
||||||
|
activityVersion: 0,
|
||||||
|
})
|
||||||
|
|
||||||
|
const closedSessionIds: string[] = []
|
||||||
|
const client = {
|
||||||
|
session: {
|
||||||
|
status: async () => ({ data: { "ses-1": { type: "running" } } }),
|
||||||
|
messages: async () => ({ data: [] }),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
const manager = new TmuxPollingManager(
|
||||||
|
client as unknown as import("../../tools/delegate-task/types").OpencodeClient,
|
||||||
|
sessions,
|
||||||
|
async (sessionId) => {
|
||||||
|
closedSessionIds.push(sessionId)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
|
// when
|
||||||
|
const pollSessions = (manager as unknown as { pollSessions: () => Promise<void> }).pollSessions
|
||||||
|
await pollSessions.call(manager)
|
||||||
|
|
||||||
|
// then
|
||||||
|
expect(closedSessionIds).toEqual([])
|
||||||
|
})
|
||||||
|
|
||||||
|
test("does not close when activityVersion changes before the idle recheck resolves", async () => {
|
||||||
|
// given
|
||||||
|
const sessions = new Map<string, TrackedSession>()
|
||||||
|
sessions.set("ses-1", {
|
||||||
|
sessionId: "ses-1",
|
||||||
|
paneId: "%1",
|
||||||
|
description: "test",
|
||||||
|
createdAt: new Date(Date.now() - 15_000),
|
||||||
|
lastSeenAt: new Date(),
|
||||||
|
closePending: false,
|
||||||
|
closeRetryCount: 0,
|
||||||
|
activityVersion: 0,
|
||||||
|
})
|
||||||
|
|
||||||
|
const closedSessionIds: string[] = []
|
||||||
|
let statusCallCount = 0
|
||||||
|
let manager: TmuxPollingManager
|
||||||
|
|
||||||
|
const client = {
|
||||||
|
session: {
|
||||||
|
status: async () => {
|
||||||
|
statusCallCount += 1
|
||||||
|
if (statusCallCount === 2) {
|
||||||
|
manager.handleEvent({
|
||||||
|
type: "message.part.delta",
|
||||||
|
properties: { sessionID: "ses-1", field: "text", delta: "new activity" },
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return { data: { "ses-1": { type: "idle" } } }
|
||||||
|
},
|
||||||
|
messages: async () => ({ data: [] }),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
manager = new TmuxPollingManager(
|
||||||
|
client as unknown as import("../../tools/delegate-task/types").OpencodeClient,
|
||||||
|
sessions,
|
||||||
|
async (sessionId) => {
|
||||||
|
closedSessionIds.push(sessionId)
|
||||||
|
},
|
||||||
|
)
|
||||||
|
const pollSessions = (manager as unknown as { pollSessions: () => Promise<void> }).pollSessions
|
||||||
|
|
||||||
|
// when
|
||||||
|
await pollSessions.call(manager)
|
||||||
|
|
||||||
|
// then
|
||||||
|
expect(closedSessionIds).toEqual([])
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user