Skip to content

Commit 564f820

Browse files
committed
perf: reuse subagent spawn test module
1 parent fa139b4 commit 564f820

1 file changed

Lines changed: 43 additions & 37 deletions

File tree

src/agents/subagent-spawn.context.test.ts

Lines changed: 43 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import path from "node:path";
2-
import { beforeEach, describe, expect, it, vi } from "vitest";
2+
import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest";
33
import {
44
loadSubagentSpawnModuleForTest,
55
setupAcceptedSubagentGatewayMock,
@@ -8,22 +8,45 @@ import {
88
type SessionStore = Record<string, Record<string, unknown>>;
99
type GatewayRequest = { method?: string; params?: Record<string, unknown> };
1010

11-
function createPersistentStoreMock(store: SessionStore) {
12-
return vi.fn(async (_storePath: unknown, mutator: unknown) => {
13-
if (typeof mutator !== "function") {
14-
throw new Error("missing session store mutator");
15-
}
16-
return await mutator(store);
11+
describe("sessions_spawn context modes", () => {
12+
const storePath = "/tmp/subagent-context-session-store.json";
13+
const callGatewayMock = vi.fn();
14+
const updateSessionStoreMock = vi.fn();
15+
const forkSessionFromParentMock = vi.fn();
16+
const resolveContextEngineMock = vi.fn();
17+
let spawnSubagentDirect: Awaited<
18+
ReturnType<typeof loadSubagentSpawnModuleForTest>
19+
>["spawnSubagentDirect"];
20+
21+
beforeAll(async () => {
22+
({ spawnSubagentDirect } = await loadSubagentSpawnModuleForTest({
23+
callGatewayMock,
24+
updateSessionStoreMock,
25+
forkSessionFromParentMock,
26+
resolveContextEngineMock,
27+
sessionStorePath: storePath,
28+
}));
1729
});
18-
}
1930

20-
describe("sessions_spawn context modes", () => {
2131
beforeEach(() => {
22-
vi.resetModules();
32+
callGatewayMock.mockReset();
33+
updateSessionStoreMock.mockReset();
34+
forkSessionFromParentMock.mockReset();
35+
resolveContextEngineMock.mockReset();
36+
setupAcceptedSubagentGatewayMock(callGatewayMock);
37+
resolveContextEngineMock.mockResolvedValue({});
2338
});
2439

40+
function usePersistentStoreMock(store: SessionStore) {
41+
updateSessionStoreMock.mockImplementation(async (_storePath: unknown, mutator: unknown) => {
42+
if (typeof mutator !== "function") {
43+
throw new Error("missing session store mutator");
44+
}
45+
return await mutator(store);
46+
});
47+
}
48+
2549
it("forks the requester transcript when context=fork", async () => {
26-
const storePath = "/tmp/subagent-context-session-store.json";
2750
const store: SessionStore = {
2851
main: {
2952
sessionId: "parent-session-id",
@@ -32,20 +55,13 @@ describe("sessions_spawn context modes", () => {
3255
totalTokens: 1200,
3356
},
3457
};
35-
const callGatewayMock = vi.fn();
36-
setupAcceptedSubagentGatewayMock(callGatewayMock);
37-
const forkSessionFromParentMock = vi.fn(async () => ({
58+
usePersistentStoreMock(store);
59+
forkSessionFromParentMock.mockImplementation(async () => ({
3860
sessionId: "forked-session-id",
3961
sessionFile: "/tmp/forked-session.jsonl",
4062
}));
4163
const prepareSubagentSpawn = vi.fn(async () => undefined);
42-
const { spawnSubagentDirect } = await loadSubagentSpawnModuleForTest({
43-
callGatewayMock,
44-
updateSessionStoreMock: createPersistentStoreMock(store),
45-
forkSessionFromParentMock,
46-
resolveContextEngineMock: vi.fn(async () => ({ prepareSubagentSpawn })),
47-
sessionStorePath: storePath,
48-
});
64+
resolveContextEngineMock.mockResolvedValue({ prepareSubagentSpawn });
4965

5066
const result = await spawnSubagentDirect(
5167
{ task: "inspect the current thread", context: "fork" },
@@ -79,16 +95,9 @@ describe("sessions_spawn context modes", () => {
7995
const store: SessionStore = {
8096
main: { sessionId: "parent-session-id", updatedAt: 1 },
8197
};
82-
const callGatewayMock = vi.fn();
83-
setupAcceptedSubagentGatewayMock(callGatewayMock);
84-
const forkSessionFromParentMock = vi.fn();
98+
usePersistentStoreMock(store);
8599
const prepareSubagentSpawn = vi.fn(async () => undefined);
86-
const { spawnSubagentDirect } = await loadSubagentSpawnModuleForTest({
87-
callGatewayMock,
88-
updateSessionStoreMock: createPersistentStoreMock(store),
89-
forkSessionFromParentMock,
90-
resolveContextEngineMock: vi.fn(async () => ({ prepareSubagentSpawn })),
91-
});
100+
resolveContextEngineMock.mockResolvedValue({ prepareSubagentSpawn });
92101

93102
const result = await spawnSubagentDirect({ task: "clean worker" }, { agentSessionKey: "main" });
94103

@@ -107,20 +116,17 @@ describe("sessions_spawn context modes", () => {
107116
const store: SessionStore = {
108117
main: { sessionId: "parent-session-id", updatedAt: 1 },
109118
};
119+
usePersistentStoreMock(store);
110120
const rollback = vi.fn(async () => undefined);
111-
const callGatewayMock = vi.fn(async (requestUnknown: unknown) => {
121+
callGatewayMock.mockImplementation(async (requestUnknown: unknown) => {
112122
const request = requestUnknown as GatewayRequest;
113123
if (request.method === "agent") {
114124
throw new Error("agent start failed");
115125
}
116126
return { ok: true };
117127
});
118-
const { spawnSubagentDirect } = await loadSubagentSpawnModuleForTest({
119-
callGatewayMock,
120-
updateSessionStoreMock: createPersistentStoreMock(store),
121-
resolveContextEngineMock: vi.fn(async () => ({
122-
prepareSubagentSpawn: vi.fn(async () => ({ rollback })),
123-
})),
128+
resolveContextEngineMock.mockResolvedValue({
129+
prepareSubagentSpawn: vi.fn(async () => ({ rollback })),
124130
});
125131

126132
const result = await spawnSubagentDirect({ task: "clean worker" }, { agentSessionKey: "main" });

0 commit comments

Comments
 (0)