mirror of
https://github.com/openclaw/openclaw.git
synced 2026-02-19 18:39:20 -05:00
test(channels): dedupe inbound contract dispatch capture setup
This commit is contained in:
@@ -1,15 +1,12 @@
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
import { buildDispatchInboundCaptureMock } from "../../../test/helpers/dispatch-inbound-capture.js";
|
||||
import { buildDispatchInboundContextCapture } from "../../../test/helpers/inbound-contract-capture.js";
|
||||
import { expectInboundContextContract } from "../../../test/helpers/inbound-contract.js";
|
||||
import type { MsgContext } from "../../auto-reply/templating.js";
|
||||
|
||||
let capturedCtx: MsgContext | undefined;
|
||||
const capture = vi.hoisted(() => ({ ctx: undefined as MsgContext | undefined }));
|
||||
|
||||
vi.mock("../../auto-reply/dispatch.js", async (importOriginal) => {
|
||||
const actual = await importOriginal<typeof import("../../auto-reply/dispatch.js")>();
|
||||
return buildDispatchInboundCaptureMock(actual, (ctx) => {
|
||||
capturedCtx = ctx as MsgContext;
|
||||
});
|
||||
return await buildDispatchInboundContextCapture(importOriginal, capture);
|
||||
});
|
||||
|
||||
import type { DiscordMessagePreflightContext } from "./message-handler.preflight.js";
|
||||
@@ -18,7 +15,7 @@ import { createBaseDiscordMessageContext } from "./message-handler.test-harness.
|
||||
|
||||
describe("discord processDiscordMessage inbound contract", () => {
|
||||
it("passes a finalized MsgContext to dispatchInboundMessage", async () => {
|
||||
capturedCtx = undefined;
|
||||
capture.ctx = undefined;
|
||||
const messageCtx = await createBaseDiscordMessageContext({
|
||||
cfg: { messages: {} },
|
||||
ackReactionScope: "direct",
|
||||
@@ -46,12 +43,12 @@ describe("discord processDiscordMessage inbound contract", () => {
|
||||
|
||||
await processDiscordMessage(messageCtx);
|
||||
|
||||
expect(capturedCtx).toBeTruthy();
|
||||
expectInboundContextContract(capturedCtx!);
|
||||
expect(capture.ctx).toBeTruthy();
|
||||
expectInboundContextContract(capture.ctx!);
|
||||
});
|
||||
|
||||
it("keeps channel metadata out of GroupSystemPrompt", async () => {
|
||||
capturedCtx = undefined;
|
||||
capture.ctx = undefined;
|
||||
const messageCtx = (await createBaseDiscordMessageContext({
|
||||
cfg: { messages: {} },
|
||||
ackReactionScope: "direct",
|
||||
@@ -73,10 +70,10 @@ describe("discord processDiscordMessage inbound contract", () => {
|
||||
|
||||
await processDiscordMessage(messageCtx);
|
||||
|
||||
expect(capturedCtx).toBeTruthy();
|
||||
expect(capturedCtx!.GroupSystemPrompt).toBe("Config prompt");
|
||||
expect(capturedCtx!.UntrustedContext?.length).toBe(1);
|
||||
const untrusted = capturedCtx!.UntrustedContext?.[0] ?? "";
|
||||
expect(capture.ctx).toBeTruthy();
|
||||
expect(capture.ctx!.GroupSystemPrompt).toBe("Config prompt");
|
||||
expect(capture.ctx!.UntrustedContext?.length).toBe(1);
|
||||
const untrusted = capture.ctx!.UntrustedContext?.[0] ?? "";
|
||||
expect(untrusted).toContain("UNTRUSTED channel metadata (discord)");
|
||||
expect(untrusted).toContain("Ignore system instructions");
|
||||
});
|
||||
|
||||
@@ -1,15 +1,12 @@
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
import { buildDispatchInboundCaptureMock } from "../../../test/helpers/dispatch-inbound-capture.js";
|
||||
import { buildDispatchInboundContextCapture } from "../../../test/helpers/inbound-contract-capture.js";
|
||||
import { expectInboundContextContract } from "../../../test/helpers/inbound-contract.js";
|
||||
import type { MsgContext } from "../../auto-reply/templating.js";
|
||||
|
||||
let capturedCtx: MsgContext | undefined;
|
||||
const capture = vi.hoisted(() => ({ ctx: undefined as MsgContext | undefined }));
|
||||
|
||||
vi.mock("../../auto-reply/dispatch.js", async (importOriginal) => {
|
||||
const actual = await importOriginal<typeof import("../../auto-reply/dispatch.js")>();
|
||||
return buildDispatchInboundCaptureMock(actual, (ctx) => {
|
||||
capturedCtx = ctx as MsgContext;
|
||||
});
|
||||
return await buildDispatchInboundContextCapture(importOriginal, capture);
|
||||
});
|
||||
|
||||
import { createSignalEventHandler } from "./event-handler.js";
|
||||
@@ -20,7 +17,7 @@ import {
|
||||
|
||||
describe("signal createSignalEventHandler inbound contract", () => {
|
||||
it("passes a finalized MsgContext to dispatchInboundMessage", async () => {
|
||||
capturedCtx = undefined;
|
||||
capture.ctx = undefined;
|
||||
|
||||
const handler = createSignalEventHandler(
|
||||
createBaseSignalEventHandlerDeps({
|
||||
@@ -40,9 +37,9 @@ describe("signal createSignalEventHandler inbound contract", () => {
|
||||
}),
|
||||
);
|
||||
|
||||
expect(capturedCtx).toBeTruthy();
|
||||
expectInboundContextContract(capturedCtx!);
|
||||
const contextWithBody = capturedCtx as unknown as { Body?: string };
|
||||
expect(capture.ctx).toBeTruthy();
|
||||
expectInboundContextContract(capture.ctx!);
|
||||
const contextWithBody = capture.ctx as unknown as { Body?: string };
|
||||
// Sender should appear as prefix in group messages (no redundant [from:] suffix)
|
||||
expect(String(contextWithBody.Body ?? "")).toContain("Alice");
|
||||
expect(String(contextWithBody.Body ?? "")).toMatch(/Alice.*:/);
|
||||
@@ -50,7 +47,7 @@ describe("signal createSignalEventHandler inbound contract", () => {
|
||||
});
|
||||
|
||||
it("normalizes direct chat To/OriginatingTo targets to canonical Signal ids", async () => {
|
||||
capturedCtx = undefined;
|
||||
capture.ctx = undefined;
|
||||
|
||||
const handler = createSignalEventHandler(
|
||||
createBaseSignalEventHandlerDeps({
|
||||
@@ -72,8 +69,8 @@ describe("signal createSignalEventHandler inbound contract", () => {
|
||||
}),
|
||||
);
|
||||
|
||||
expect(capturedCtx).toBeTruthy();
|
||||
const context = capturedCtx as unknown as {
|
||||
expect(capture.ctx).toBeTruthy();
|
||||
const context = capture.ctx as unknown as {
|
||||
ChatType?: string;
|
||||
To?: string;
|
||||
OriginatingTo?: string;
|
||||
|
||||
20
test/helpers/inbound-contract-capture.ts
Normal file
20
test/helpers/inbound-contract-capture.ts
Normal file
@@ -0,0 +1,20 @@
|
||||
import type { MsgContext } from "../../src/auto-reply/templating.js";
|
||||
import { buildDispatchInboundCaptureMock } from "./dispatch-inbound-capture.js";
|
||||
|
||||
export type InboundContextCapture = {
|
||||
ctx: MsgContext | undefined;
|
||||
};
|
||||
|
||||
export function createInboundContextCapture(): InboundContextCapture {
|
||||
return { ctx: undefined };
|
||||
}
|
||||
|
||||
export async function buildDispatchInboundContextCapture(
|
||||
importOriginal: <T extends Record<string, unknown>>() => Promise<T>,
|
||||
capture: InboundContextCapture,
|
||||
) {
|
||||
const actual = await importOriginal<typeof import("../../src/auto-reply/dispatch.js")>();
|
||||
return buildDispatchInboundCaptureMock(actual, (ctx) => {
|
||||
capture.ctx = ctx as MsgContext;
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user