





















@@ -2,6 +2,12 @@ import { afterEach, describe, expect, it, vi } from "vitest";
22import { testing, registerNativeHookRelay } from "../../agents/harness/native-hook-relay.js";
33import { nativeHookRelayHandlers } from "./native-hook-relay.js";
445+const POST_TOOL_USE_PAYLOAD = {
6+hook_event_name: "PostToolUse",
7+tool_name: "Bash",
8+tool_response: { output: "ok" },
9+};
10+511afterEach(() => {
612testing.clearNativeHookRelaysForTests();
713});
@@ -14,55 +20,28 @@ describe("native hook relay gateway method", () => {
1420runId: "run-1",
1521allowedEvents: ["post_tool_use"],
1622});
17-const respond = viRespond();
182319-await nativeHookRelayHandlers["nativeHook.invoke"]({
20-req: { type: "req", id: "1", method: "nativeHook.invoke" },
21-params: {
22-provider: "codex",
23-relayId: relay.relayId,
24-generation: relay.generation,
25-event: "post_tool_use",
26-rawPayload: {
27-hook_event_name: "PostToolUse",
28-tool_name: "Bash",
29-tool_response: { output: "ok" },
30-},
31-},
32-client: null,
33-isWebchatConnect: () => false,
34- respond,
35-context: {} as never,
24+const respond = await invokeNativeHook({
25+provider: "codex",
26+relayId: relay.relayId,
27+generation: relay.generation,
28+event: "post_tool_use",
29+rawPayload: POST_TOOL_USE_PAYLOAD,
3630});
37313832expect(respond).toHaveBeenCalledWith(true, { stdout: "", stderr: "", exitCode: 0 });
3933expect(testing.getNativeHookRelayInvocationsForTests()).toHaveLength(1);
4034});
41354236it("rejects unknown relay ids", async () => {
43-const respond = viRespond();
44-45-await nativeHookRelayHandlers["nativeHook.invoke"]({
46-req: { type: "req", id: "1", method: "nativeHook.invoke" },
47-params: {
48-provider: "codex",
49-relayId: "missing",
50-event: "pre_tool_use",
51-rawPayload: {},
52-},
53-client: null,
54-isWebchatConnect: () => false,
55- respond,
56-context: {} as never,
37+const respond = await invokeNativeHook({
38+provider: "codex",
39+relayId: "missing",
40+event: "pre_tool_use",
41+rawPayload: {},
5742});
584359-const call = respond.mock.calls.at(0) as
60-| [boolean, unknown, { code?: string; message?: string }]
61-| undefined;
62-expect(call?.[0]).toBe(false);
63-expect(call?.[1]).toBeUndefined();
64-expect(call?.[2]?.code).toBe("INVALID_REQUEST");
65-expect(call?.[2]?.message).toContain("not found");
44+expectInvalidRequest(respond, "not found");
6645});
67466847it("rejects stale relay generations", async () => {
@@ -80,38 +59,43 @@ describe("native hook relay gateway method", () => {
8059runId: "run-2",
8160allowedEvents: ["post_tool_use"],
8261});
83-const respond = viRespond();
846285-await nativeHookRelayHandlers["nativeHook.invoke"]({
86-req: { type: "req", id: "1", method: "nativeHook.invoke" },
87-params: {
88-provider: "codex",
89-relayId: first.relayId,
90-generation: first.generation,
91-event: "post_tool_use",
92-rawPayload: {
93-hook_event_name: "PostToolUse",
94-tool_name: "Bash",
95-tool_response: { output: "ok" },
96-},
97-},
98-client: null,
99-isWebchatConnect: () => false,
100- respond,
101-context: {} as never,
63+const respond = await invokeNativeHook({
64+provider: "codex",
65+relayId: first.relayId,
66+generation: first.generation,
67+event: "post_tool_use",
68+rawPayload: POST_TOOL_USE_PAYLOAD,
10269});
10370104-const call = respond.mock.calls.at(0) as
105-| [boolean, unknown, { code?: string; message?: string }]
106-| undefined;
107-expect(call?.[0]).toBe(false);
108-expect(call?.[1]).toBeUndefined();
109-expect(call?.[2]?.code).toBe("INVALID_REQUEST");
110-expect(call?.[2]?.message).toContain("native hook relay bridge stale registration");
71+expectInvalidRequest(respond, "native hook relay bridge stale registration");
11172expect(testing.getNativeHookRelayInvocationsForTests()).toStrictEqual([]);
11273});
11374});
1147576+async function invokeNativeHook(params: Record<string, unknown>) {
77+const respond = viRespond();
78+await nativeHookRelayHandlers["nativeHook.invoke"]({
79+req: { type: "req", id: "1", method: "nativeHook.invoke" },
80+ params,
81+client: null,
82+isWebchatConnect: () => false,
83+ respond,
84+context: {} as never,
85+});
86+return respond;
87+}
88+89+function expectInvalidRequest(respond: ReturnType<typeof viRespond>, message: string) {
90+const call = respond.mock.calls.at(0) as
91+| [boolean, unknown, { code?: string; message?: string }]
92+| undefined;
93+expect(call?.[0]).toBe(false);
94+expect(call?.[1]).toBeUndefined();
95+expect(call?.[2]?.code).toBe("INVALID_REQUEST");
96+expect(call?.[2]?.message).toContain(message);
97+}
98+11599function viRespond() {
116100return vi.fn();
117101}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。