11import path from "node:path" ;
2- import { beforeEach , describe , expect , it , vi } from "vitest" ;
2+ import { beforeAll , beforeEach , describe , expect , it , vi } from "vitest" ;
33import {
44 loadSubagentSpawnModuleForTest ,
55 setupAcceptedSubagentGatewayMock ,
@@ -8,22 +8,45 @@ import {
88type SessionStore = Record < string , Record < string , unknown > > ;
99type 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