





























@@ -23,6 +23,29 @@ function buildParams(commandBody: string) {
2323return buildCommandTestParams(commandBody, cfg, undefined, { workspaceDir: "/tmp/workspace" });
2424}
252526+function mockCall(mock: unknown, index = 0): Array<unknown> {
27+const calls = (mock as { mock?: { calls?: Array<Array<unknown>> } }).mock?.calls ?? [];
28+const call = calls.at(index);
29+expect(call, `mock call ${index + 1}`).toBeDefined();
30+return call as Array<unknown>;
31+}
32+33+function mockFirstObjectArg(mock: unknown): Record<string, unknown> {
34+const [arg] = mockCall(mock);
35+expect(arg).toBeTypeOf("object");
36+expect(arg).not.toBeNull();
37+return arg as Record<string, unknown>;
38+}
39+40+function expectObjectFields(value: unknown, expected: Record<string, unknown>): void {
41+expect(value).toBeTypeOf("object");
42+expect(value).not.toBeNull();
43+const record = value as Record<string, unknown>;
44+for (const [key, expectedValue] of Object.entries(expected)) {
45+expect(record[key], key).toEqual(expectedValue);
46+}
47+}
48+2649describe("handleBtwCommand", () => {
2750beforeEach(() => {
2851runBtwSideQuestionMock.mockReset();
@@ -83,14 +106,12 @@ describe("handleBtwCommand", () => {
8310684107const result = await handleBtwCommand(params, true);
8510886-expect(runBtwSideQuestionMock).toHaveBeenCalledWith(
87-expect.objectContaining({
88-question: "what changed?",
89-sessionEntry: params.sessionEntry,
90-resolvedThinkLevel: "off",
91-resolvedReasoningLevel: "off",
92-}),
93-);
109+expectObjectFields(mockFirstObjectArg(runBtwSideQuestionMock), {
110+question: "what changed?",
111+sessionEntry: params.sessionEntry,
112+resolvedThinkLevel: "off",
113+resolvedReasoningLevel: "off",
114+});
94115expect(result).toEqual({
95116shouldContinue: false,
96117reply: { text: "snapshot answer", btw: { question: "what changed?" } },
@@ -124,15 +145,14 @@ describe("handleBtwCommand", () => {
124145125146const result = await handleBtwCommand(params, true);
126147127-expect(runBtwSideQuestionMock).toHaveBeenCalledWith(
128-expect.objectContaining({
129-question: "what changed?",
130-agentDir: expect.stringContaining("/agents/main/agent"),
131-sessionEntry: params.sessionEntry,
132-resolvedThinkLevel: "off",
133-resolvedReasoningLevel: "off",
134-}),
135-);
148+const runnerArgs = mockFirstObjectArg(runBtwSideQuestionMock);
149+expectObjectFields(runnerArgs, {
150+question: "what changed?",
151+sessionEntry: params.sessionEntry,
152+resolvedThinkLevel: "off",
153+resolvedReasoningLevel: "off",
154+});
155+expect(String(runnerArgs.agentDir)).toContain("/agents/main/agent");
136156expect(result).toEqual({
137157shouldContinue: false,
138158reply: { text: "nothing important", btw: { question: "what changed?" } },
@@ -150,11 +170,7 @@ describe("handleBtwCommand", () => {
150170151171const result = await handleBtwCommand(params, true);
152172153-expect(runBtwSideQuestionMock).toHaveBeenCalledWith(
154-expect.objectContaining({
155-question: "what changed?",
156-}),
157-);
173+expect(mockFirstObjectArg(runBtwSideQuestionMock).question).toBe("what changed?");
158174expect(result).toEqual({
159175shouldContinue: false,
160176reply: { text: "alias answer", btw: { question: "what changed?" } },
@@ -174,10 +190,8 @@ describe("handleBtwCommand", () => {
174190175191const result = await handleBtwCommand(params, true);
176192177-expect(runBtwSideQuestionMock).toHaveBeenCalledWith(
178-expect.objectContaining({
179-agentDir: expect.stringContaining("/agents/worker-1/agent"),
180-}),
193+expect(String(mockFirstObjectArg(runBtwSideQuestionMock).agentDir)).toContain(
194+"/agents/worker-1/agent",
181195);
182196expect(result).toEqual({
183197shouldContinue: false,
@@ -199,14 +213,12 @@ describe("handleBtwCommand", () => {
199213200214const result = await handleBtwCommand(params, true);
201215202-expect(resolveSessionAgentIdMock).toHaveBeenCalledWith({
203-sessionKey: "agent:worker-1:whatsapp:direct:12345",
204-config: expect.any(Object),
205-});
206-expect(runBtwSideQuestionMock).toHaveBeenCalledWith(
207-expect.objectContaining({
208-agentDir: expect.stringContaining("/agents/worker-1/agent"),
209-}),
216+const sessionAgentArgs = mockFirstObjectArg(resolveSessionAgentIdMock);
217+expect(sessionAgentArgs.sessionKey).toBe("agent:worker-1:whatsapp:direct:12345");
218+expect(sessionAgentArgs.config).toBeTypeOf("object");
219+expect(sessionAgentArgs.config).not.toBeNull();
220+expect(String(mockFirstObjectArg(runBtwSideQuestionMock).agentDir)).toContain(
221+"/agents/worker-1/agent",
210222);
211223expect(result).toEqual({
212224shouldContinue: false,
@@ -229,16 +241,15 @@ describe("handleBtwCommand", () => {
229241230242const result = await handleBtwCommand(params, true);
231243232-expect(resolveSessionAgentIdMock).toHaveBeenCalledWith({
233-sessionKey: "agent:worker-1:whatsapp:direct:12345",
234-config: expect.any(Object),
235-});
236-expect(resolveAgentDirMock).toHaveBeenCalledWith(expect.any(Object), "worker-1");
237-expect(runBtwSideQuestionMock).toHaveBeenCalledWith(
238-expect.objectContaining({
239-agentDir: "/tmp/worker-1-agent",
240-}),
241-);
244+const canonicalAgentArgs = mockFirstObjectArg(resolveSessionAgentIdMock);
245+expect(canonicalAgentArgs.sessionKey).toBe("agent:worker-1:whatsapp:direct:12345");
246+expect(canonicalAgentArgs.config).toBeTypeOf("object");
247+expect(canonicalAgentArgs.config).not.toBeNull();
248+const resolveDirCall = mockCall(resolveAgentDirMock);
249+expect(resolveDirCall[0]).toBeTypeOf("object");
250+expect(resolveDirCall[0]).not.toBeNull();
251+expect(resolveDirCall[1]).toBe("worker-1");
252+expect(mockFirstObjectArg(runBtwSideQuestionMock).agentDir).toBe("/tmp/worker-1-agent");
242253expect(result).toEqual({
243254shouldContinue: false,
244255reply: { text: "resolved fallback", btw: { question: "what changed?" } },
@@ -262,13 +273,8 @@ describe("handleBtwCommand", () => {
262273263274const result = await handleBtwCommand(params, true);
264275265-expect(runBtwSideQuestionMock).toHaveBeenCalledWith(
266-expect.objectContaining({
267-sessionEntry: expect.objectContaining({
268-sessionId: "target-session",
269-}),
270-}),
271-);
276+const sideQuestionArgs = mockFirstObjectArg(runBtwSideQuestionMock);
277+expectObjectFields(sideQuestionArgs.sessionEntry, { sessionId: "target-session" });
272278expect(result).toEqual({
273279shouldContinue: false,
274280reply: { text: "target context", btw: { question: "what changed?" } },
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。