test: share outbound media send harness

This commit is contained in:
Peter Steinberger
2026-04-19 00:27:29 +01:00
parent e88a9e5ee4
commit cf3c1994dc

View File

@@ -87,6 +87,8 @@ vi.mock("../../config/sessions.js", () => ({
}));
type OutboundSendServiceModule = typeof import("./outbound-send-service.js");
type ExecuteSendInput = Parameters<OutboundSendServiceModule["executeSendAction"]>[0];
type ExecuteSendContext = ExecuteSendInput["ctx"];
let executePollAction: OutboundSendServiceModule["executePollAction"];
let executeSendAction: OutboundSendServiceModule["executeSendAction"];
@@ -145,6 +147,29 @@ describe("executeSendAction", () => {
});
}
function createPluginMediaSendContext(
overrides: Partial<ExecuteSendContext>,
): ExecuteSendContext {
return {
cfg: {},
channel: "demo-outbound",
params: { media: "/tmp/host.png" },
sessionKey: "agent:main:whatsapp:group:ops",
dryRun: false,
...overrides,
} as ExecuteSendContext;
}
async function executePluginMediaSend(ctx: Partial<ExecuteSendContext>) {
mocks.dispatchChannelMessageAction.mockResolvedValue(pluginActionResult("msg-plugin"));
await executeSendAction({
ctx: createPluginMediaSendContext(ctx),
to: "channel:123",
message: "hello",
});
}
beforeAll(async () => {
({ executePollAction, executeSendAction } = await import("./outbound-send-service.js"));
});
@@ -288,19 +313,8 @@ describe("executeSendAction", () => {
});
it("forwards requesterSenderId into outbound media access resolution", async () => {
mocks.dispatchChannelMessageAction.mockResolvedValue(pluginActionResult("msg-plugin"));
await executeSendAction({
ctx: {
cfg: {},
channel: "demo-outbound",
params: { media: "/tmp/host.png" },
sessionKey: "agent:main:whatsapp:group:ops",
requesterSenderId: "attacker",
dryRun: false,
},
to: "channel:123",
message: "hello",
await executePluginMediaSend({
requesterSenderId: "attacker",
});
expect(mocks.resolveAgentScopedOutboundMediaAccess).toHaveBeenCalledWith(
@@ -311,21 +325,10 @@ describe("executeSendAction", () => {
});
it("forwards non-id requester sender fields into outbound media access resolution", async () => {
mocks.dispatchChannelMessageAction.mockResolvedValue(pluginActionResult("msg-plugin"));
await executeSendAction({
ctx: {
cfg: {},
channel: "demo-outbound",
params: { media: "/tmp/host.png" },
sessionKey: "agent:main:whatsapp:group:ops",
requesterSenderName: "Alice",
requesterSenderUsername: "alice_u",
requesterSenderE164: "+15551234567",
dryRun: false,
},
to: "channel:123",
message: "hello",
await executePluginMediaSend({
requesterSenderName: "Alice",
requesterSenderUsername: "alice_u",
requesterSenderE164: "+15551234567",
});
expect(mocks.resolveAgentScopedOutboundMediaAccess).toHaveBeenCalledWith(
@@ -338,19 +341,8 @@ describe("executeSendAction", () => {
});
it("keeps requester session channel authoritative for media policy", async () => {
mocks.dispatchChannelMessageAction.mockResolvedValue(pluginActionResult("msg-plugin"));
await executeSendAction({
ctx: {
cfg: {},
channel: "demo-outbound",
params: { media: "/tmp/host.png" },
sessionKey: "agent:main:whatsapp:group:ops",
requesterSenderId: "attacker",
dryRun: false,
},
to: "channel:123",
message: "hello",
await executePluginMediaSend({
requesterSenderId: "attacker",
});
expect(mocks.resolveAgentScopedOutboundMediaAccess).toHaveBeenCalledWith(
@@ -362,21 +354,10 @@ describe("executeSendAction", () => {
});
it("uses requester account for media policy when session context is present", async () => {
mocks.dispatchChannelMessageAction.mockResolvedValue(pluginActionResult("msg-plugin"));
await executeSendAction({
ctx: {
cfg: {},
channel: "demo-outbound",
params: { media: "/tmp/host.png" },
sessionKey: "agent:main:whatsapp:group:ops",
requesterAccountId: "source-account",
requesterSenderId: "attacker",
accountId: "destination-account",
dryRun: false,
},
to: "channel:123",
message: "hello",
await executePluginMediaSend({
requesterAccountId: "source-account",
requesterSenderId: "attacker",
accountId: "destination-account",
});
expect(mocks.resolveAgentScopedOutboundMediaAccess).toHaveBeenCalledWith(
@@ -388,20 +369,9 @@ describe("executeSendAction", () => {
});
it("falls back to destination account for media policy when requester account is missing", async () => {
mocks.dispatchChannelMessageAction.mockResolvedValue(pluginActionResult("msg-plugin"));
await executeSendAction({
ctx: {
cfg: {},
channel: "demo-outbound",
params: { media: "/tmp/host.png" },
sessionKey: "agent:main:whatsapp:group:ops",
requesterSenderId: "attacker",
accountId: "destination-account",
dryRun: false,
},
to: "channel:123",
message: "hello",
await executePluginMediaSend({
requesterSenderId: "attacker",
accountId: "destination-account",
});
expect(mocks.resolveAgentScopedOutboundMediaAccess).toHaveBeenCalledWith(