mirror of https://github.com/openclaw/openclaw.git
156 lines
4.0 KiB
TypeScript
156 lines
4.0 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
import type { OpenClawConfig } from "../config/config.js";
|
|
import { buildSlackThreadingToolContext } from "./threading-tool-context.js";
|
|
|
|
const emptyCfg = {} as OpenClawConfig;
|
|
|
|
describe("buildSlackThreadingToolContext", () => {
|
|
it("uses top-level replyToMode by default", () => {
|
|
const cfg = {
|
|
channels: {
|
|
slack: { replyToMode: "first" },
|
|
},
|
|
} as OpenClawConfig;
|
|
const result = buildSlackThreadingToolContext({
|
|
cfg,
|
|
accountId: null,
|
|
context: { ChatType: "channel" },
|
|
});
|
|
expect(result.replyToMode).toBe("first");
|
|
});
|
|
|
|
it("uses chat-type replyToMode overrides for direct messages when configured", () => {
|
|
const cfg = {
|
|
channels: {
|
|
slack: {
|
|
replyToMode: "off",
|
|
replyToModeByChatType: { direct: "all" },
|
|
},
|
|
},
|
|
} as OpenClawConfig;
|
|
const result = buildSlackThreadingToolContext({
|
|
cfg,
|
|
accountId: null,
|
|
context: { ChatType: "direct" },
|
|
});
|
|
expect(result.replyToMode).toBe("all");
|
|
});
|
|
|
|
it("uses top-level replyToMode for channels when no channel override is set", () => {
|
|
const cfg = {
|
|
channels: {
|
|
slack: {
|
|
replyToMode: "off",
|
|
replyToModeByChatType: { direct: "all" },
|
|
},
|
|
},
|
|
} as OpenClawConfig;
|
|
const result = buildSlackThreadingToolContext({
|
|
cfg,
|
|
accountId: null,
|
|
context: { ChatType: "channel" },
|
|
});
|
|
expect(result.replyToMode).toBe("off");
|
|
});
|
|
|
|
it("falls back to top-level when no chat-type override is set", () => {
|
|
const cfg = {
|
|
channels: {
|
|
slack: {
|
|
replyToMode: "first",
|
|
},
|
|
},
|
|
} as OpenClawConfig;
|
|
const result = buildSlackThreadingToolContext({
|
|
cfg,
|
|
accountId: null,
|
|
context: { ChatType: "direct" },
|
|
});
|
|
expect(result.replyToMode).toBe("first");
|
|
});
|
|
|
|
it("uses legacy dm.replyToMode for direct messages when no chat-type override exists", () => {
|
|
const cfg = {
|
|
channels: {
|
|
slack: {
|
|
replyToMode: "off",
|
|
dm: { replyToMode: "all" },
|
|
},
|
|
},
|
|
} as OpenClawConfig;
|
|
const result = buildSlackThreadingToolContext({
|
|
cfg,
|
|
accountId: null,
|
|
context: { ChatType: "direct" },
|
|
});
|
|
expect(result.replyToMode).toBe("all");
|
|
});
|
|
|
|
it("uses all mode when MessageThreadId is present", () => {
|
|
const cfg = {
|
|
channels: {
|
|
slack: {
|
|
replyToMode: "all",
|
|
replyToModeByChatType: { direct: "off" },
|
|
},
|
|
},
|
|
} as OpenClawConfig;
|
|
const result = buildSlackThreadingToolContext({
|
|
cfg,
|
|
accountId: null,
|
|
context: {
|
|
ChatType: "direct",
|
|
ThreadLabel: "thread-label",
|
|
MessageThreadId: "1771999998.834199",
|
|
},
|
|
});
|
|
expect(result.replyToMode).toBe("all");
|
|
});
|
|
|
|
it("does not force all mode from ThreadLabel alone", () => {
|
|
const cfg = {
|
|
channels: {
|
|
slack: {
|
|
replyToMode: "all",
|
|
replyToModeByChatType: { direct: "off" },
|
|
},
|
|
},
|
|
} as OpenClawConfig;
|
|
const result = buildSlackThreadingToolContext({
|
|
cfg,
|
|
accountId: null,
|
|
context: {
|
|
ChatType: "direct",
|
|
ThreadLabel: "label-without-real-thread",
|
|
},
|
|
});
|
|
expect(result.replyToMode).toBe("off");
|
|
});
|
|
|
|
it("keeps configured channel behavior when not in a thread", () => {
|
|
const cfg = {
|
|
channels: {
|
|
slack: {
|
|
replyToMode: "off",
|
|
replyToModeByChatType: { channel: "first" },
|
|
},
|
|
},
|
|
} as OpenClawConfig;
|
|
const result = buildSlackThreadingToolContext({
|
|
cfg,
|
|
accountId: null,
|
|
context: { ChatType: "channel", ThreadLabel: "label-only" },
|
|
});
|
|
expect(result.replyToMode).toBe("first");
|
|
});
|
|
|
|
it("defaults to off when no replyToMode is configured", () => {
|
|
const result = buildSlackThreadingToolContext({
|
|
cfg: emptyCfg,
|
|
accountId: null,
|
|
context: { ChatType: "direct" },
|
|
});
|
|
expect(result.replyToMode).toBe("off");
|
|
});
|
|
});
|