


















@@ -100,6 +100,23 @@ function evaluateMentionGateForMessage(params: { cfg: OpenClawConfig; threadRoot
100100return { account, resolver, decision };
101101}
102102103+function mockCall(mock: { mock: { calls: unknown[][] } }, index: number, label: string): unknown[] {
104+const resolvedIndex = index < 0 ? mock.mock.calls.length + index : index;
105+const call = mock.mock.calls[resolvedIndex];
106+if (!call) {
107+throw new Error(`expected ${label} call ${index}`);
108+}
109+return call;
110+}
111+112+function mockCallArg(
113+mock: { mock: { calls: unknown[][] } },
114+index: number,
115+label: string,
116+): unknown {
117+return mockCall(mock, index, label)[0];
118+}
119+103120describe("mattermost mention gating", () => {
104121it("accepts unmentioned root channel posts in onmessage mode", () => {
105122const cfg: OpenClawConfig = {
@@ -114,7 +131,7 @@ describe("mattermost mention gating", () => {
114131expect(decision.dropReason).toBeNull();
115132expect(decision.shouldRequireMention).toBe(false);
116133expect(resolver).toHaveBeenCalledTimes(1);
117-const [resolverCall] = resolver.mock.calls.at(0) ?? [];
134+const resolverCall = mockCallArg(resolver, 0, "resolveRequireMention");
118135expect(resolverCall).toStrictEqual({
119136 cfg,
120137channel: "mattermost",
@@ -139,9 +156,11 @@ describe("mattermost mention gating", () => {
139156});
140157expect(decision.dropReason).toBeNull();
141158expect(decision.shouldRequireMention).toBe(false);
142-const resolverCall = resolver.mock.calls.at(-1)?.[0];
143-expect(resolverCall?.groupId).toBe("chan-1");
144-expect(resolverCall?.groupId).not.toBe("thread-root-1");
159+const resolverCall = mockCallArg(resolver, -1, "resolveRequireMention") as {
160+groupId?: string;
161+};
162+expect(resolverCall.groupId).toBe("chan-1");
163+expect(resolverCall.groupId).not.toBe("thread-root-1");
145164});
146165147166it("rejects unmentioned channel posts in oncall mode", () => {
@@ -493,8 +512,11 @@ describe("deliverMattermostReplyWithDraftPreview", () => {
493512});
494513495514expect(updateMattermostPostSpy).toHaveBeenCalledTimes(1);
496-const [updateClient, updatePostId, updateParams] =
497-updateMattermostPostSpy.mock.calls.at(0) ?? [];
515+const [updateClient, updatePostId, updateParams] = mockCall(
516+updateMattermostPostSpy,
517+0,
518+"updateMattermostPost",
519+);
498520expect(updateClient).toBe(client);
499521expect(updatePostId).toBe("preview-post-1");
500522expect(updateParams).toStrictEqual({ message: "Final answer" });
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。