openskynet / src /infra /outbound /message-action-normalization.test.ts
Darochin's picture
Mirror OpenSkyNet workspace snapshot from Git HEAD
fc93158 verified
import { describe, expect, it } from "vitest";
import { normalizeMessageActionInput } from "./message-action-normalization.js";
describe("normalizeMessageActionInput", () => {
it("prefers explicit target and clears legacy target fields", () => {
const normalized = normalizeMessageActionInput({
action: "send",
args: {
target: "channel:C1",
to: "legacy",
channelId: "legacy-channel",
},
});
expect(normalized.target).toBe("channel:C1");
expect(normalized.to).toBe("channel:C1");
expect("channelId" in normalized).toBe(false);
});
it("ignores empty-string legacy target fields when explicit target is present", () => {
const normalized = normalizeMessageActionInput({
action: "send",
args: {
target: "1214056829",
channelId: "",
to: " ",
},
});
expect(normalized.target).toBe("1214056829");
expect(normalized.to).toBe("1214056829");
expect("channelId" in normalized).toBe(false);
});
it("maps legacy target fields into canonical target", () => {
const normalized = normalizeMessageActionInput({
action: "send",
args: {
to: "channel:C1",
},
});
expect(normalized.target).toBe("channel:C1");
expect(normalized.to).toBe("channel:C1");
});
it("infers target from tool context when required", () => {
const normalized = normalizeMessageActionInput({
action: "send",
args: {},
toolContext: {
currentChannelId: "channel:C1",
},
});
expect(normalized.target).toBe("channel:C1");
expect(normalized.to).toBe("channel:C1");
});
it("infers channel from tool context provider", () => {
const normalized = normalizeMessageActionInput({
action: "send",
args: {
target: "channel:C1",
},
toolContext: {
currentChannelId: "C1",
currentChannelProvider: "slack",
},
});
expect(normalized.channel).toBe("slack");
});
it("does not infer a target for actions that do not accept one", () => {
const normalized = normalizeMessageActionInput({
action: "broadcast",
args: {},
toolContext: {
currentChannelId: "channel:C1",
},
});
expect("target" in normalized).toBe(false);
expect("to" in normalized).toBe(false);
});
it("does not backfill a non-deliverable tool-context channel", () => {
const normalized = normalizeMessageActionInput({
action: "send",
args: {
target: "channel:C1",
},
toolContext: {
currentChannelProvider: "webchat",
},
});
expect("channel" in normalized).toBe(false);
});
it("keeps alias-based targets without inferring the current channel", () => {
const normalized = normalizeMessageActionInput({
action: "edit",
args: {
messageId: "msg_123",
},
toolContext: {
currentChannelId: "channel:C1",
},
});
expect(normalized.messageId).toBe("msg_123");
expect("target" in normalized).toBe(false);
expect("to" in normalized).toBe(false);
});
it("maps legacy channelId inputs through canonical target for channel-id actions", () => {
const normalized = normalizeMessageActionInput({
action: "channel-info",
args: {
channelId: "C123",
},
});
expect(normalized.target).toBe("C123");
expect(normalized.channelId).toBe("C123");
expect("to" in normalized).toBe(false);
});
it("throws when required target remains unresolved", () => {
expect(() =>
normalizeMessageActionInput({
action: "send",
args: {},
}),
).toThrow(/requires a target/);
});
});