test: dedupe subagent announcement fixtures

This commit is contained in:
Peter Steinberger
2026-04-23 18:34:04 +01:00
parent 844f1dd87a
commit ce681be084

View File

@@ -7,6 +7,53 @@ afterEach(() => {
__testing.setDepsForTest();
});
const slackThreadOrigin = {
channel: "slack",
to: "channel:C123",
accountId: "acct-1",
threadId: "171.222",
} as const;
function createGatewayMock() {
return vi.fn(async () => ({}) as Record<string, unknown>) as unknown as typeof runtimeCallGateway;
}
async function deliverSlackThreadAnnouncement(params: {
callGateway: typeof runtimeCallGateway;
isActive: boolean;
sessionId: string;
expectsCompletionMessage: boolean;
directIdempotencyKey: string;
queueEmbeddedPiMessage?: (sessionId: string, message: string) => boolean;
}) {
__testing.setDepsForTest({
callGateway: params.callGateway,
getRequesterSessionActivity: () => ({
sessionId: params.sessionId,
isActive: params.isActive,
}),
loadConfig: () => ({}) as never,
...(params.queueEmbeddedPiMessage
? { queueEmbeddedPiMessage: params.queueEmbeddedPiMessage }
: {}),
});
return deliverSubagentAnnouncement({
requesterSessionKey: "agent:main:slack:channel:C123:thread:171.222",
targetRequesterSessionKey: "agent:main:slack:channel:C123:thread:171.222",
triggerMessage: "child done",
steerMessage: "child done",
requesterOrigin: slackThreadOrigin,
requesterSessionOrigin: slackThreadOrigin,
completionDirectOrigin: slackThreadOrigin,
directOrigin: slackThreadOrigin,
requesterIsSubagent: false,
expectsCompletionMessage: params.expectsCompletionMessage,
bestEffortDeliver: true,
directIdempotencyKey: params.directIdempotencyKey,
});
}
describe("resolveAnnounceOrigin threaded route targets", () => {
it("preserves stored thread ids when requester origin omits one for the same chat", () => {
expect(
@@ -70,53 +117,15 @@ describe("resolveAnnounceOrigin threaded route targets", () => {
describe("deliverSubagentAnnouncement completion delivery", () => {
it("keeps completion announces session-internal while preserving route context for active requesters", async () => {
const callGateway = vi.fn(
async () => ({}) as Record<string, unknown>,
) as unknown as typeof runtimeCallGateway;
const callGateway = createGatewayMock();
const queueEmbeddedPiMessage = vi.fn(() => true);
__testing.setDepsForTest({
const result = await deliverSlackThreadAnnouncement({
callGateway,
getRequesterSessionActivity: () => ({
sessionId: "requester-session-1",
isActive: true,
}),
loadConfig: () => ({}) as never,
queueEmbeddedPiMessage,
});
const result = await deliverSubagentAnnouncement({
requesterSessionKey: "agent:main:slack:channel:C123:thread:171.222",
targetRequesterSessionKey: "agent:main:slack:channel:C123:thread:171.222",
triggerMessage: "child done",
steerMessage: "child done",
requesterOrigin: {
channel: "slack",
to: "channel:C123",
accountId: "acct-1",
threadId: "171.222",
},
requesterSessionOrigin: {
channel: "slack",
to: "channel:C123",
accountId: "acct-1",
threadId: "171.222",
},
completionDirectOrigin: {
channel: "slack",
to: "channel:C123",
accountId: "acct-1",
threadId: "171.222",
},
directOrigin: {
channel: "slack",
to: "channel:C123",
accountId: "acct-1",
threadId: "171.222",
},
requesterIsSubagent: false,
sessionId: "requester-session-1",
isActive: true,
expectsCompletionMessage: true,
bestEffortDeliver: true,
directIdempotencyKey: "announce-1",
queueEmbeddedPiMessage,
});
expect(result).toEqual(
@@ -130,50 +139,12 @@ describe("deliverSubagentAnnouncement completion delivery", () => {
});
it("keeps direct external delivery for dormant completion requesters", async () => {
const callGateway = vi.fn(
async () => ({}) as Record<string, unknown>,
) as unknown as typeof runtimeCallGateway;
__testing.setDepsForTest({
const callGateway = createGatewayMock();
await deliverSlackThreadAnnouncement({
callGateway,
getRequesterSessionActivity: () => ({
sessionId: "requester-session-2",
isActive: false,
}),
loadConfig: () => ({}) as never,
});
await deliverSubagentAnnouncement({
requesterSessionKey: "agent:main:slack:channel:C123:thread:171.222",
targetRequesterSessionKey: "agent:main:slack:channel:C123:thread:171.222",
triggerMessage: "child done",
steerMessage: "child done",
requesterOrigin: {
channel: "slack",
to: "channel:C123",
accountId: "acct-1",
threadId: "171.222",
},
requesterSessionOrigin: {
channel: "slack",
to: "channel:C123",
accountId: "acct-1",
threadId: "171.222",
},
completionDirectOrigin: {
channel: "slack",
to: "channel:C123",
accountId: "acct-1",
threadId: "171.222",
},
directOrigin: {
channel: "slack",
to: "channel:C123",
accountId: "acct-1",
threadId: "171.222",
},
requesterIsSubagent: false,
sessionId: "requester-session-2",
isActive: false,
expectsCompletionMessage: true,
bestEffortDeliver: true,
directIdempotencyKey: "announce-1b",
});
@@ -193,50 +164,12 @@ describe("deliverSubagentAnnouncement completion delivery", () => {
});
it("keeps direct external delivery for non-completion announces", async () => {
const callGateway = vi.fn(
async () => ({}) as Record<string, unknown>,
) as unknown as typeof runtimeCallGateway;
__testing.setDepsForTest({
const callGateway = createGatewayMock();
await deliverSlackThreadAnnouncement({
callGateway,
getRequesterSessionActivity: () => ({
sessionId: "requester-session-3",
isActive: false,
}),
loadConfig: () => ({}) as never,
});
await deliverSubagentAnnouncement({
requesterSessionKey: "agent:main:slack:channel:C123:thread:171.222",
targetRequesterSessionKey: "agent:main:slack:channel:C123:thread:171.222",
triggerMessage: "child done",
steerMessage: "child done",
requesterOrigin: {
channel: "slack",
to: "channel:C123",
accountId: "acct-1",
threadId: "171.222",
},
requesterSessionOrigin: {
channel: "slack",
to: "channel:C123",
accountId: "acct-1",
threadId: "171.222",
},
completionDirectOrigin: {
channel: "slack",
to: "channel:C123",
accountId: "acct-1",
threadId: "171.222",
},
directOrigin: {
channel: "slack",
to: "channel:C123",
accountId: "acct-1",
threadId: "171.222",
},
requesterIsSubagent: false,
sessionId: "requester-session-3",
isActive: false,
expectsCompletionMessage: false,
bestEffortDeliver: true,
directIdempotencyKey: "announce-2",
});