






















@@ -484,6 +484,23 @@ async function runArgMenuAction(
484484return respond;
485485}
486486487+function firstCallPayload(mock: ReturnType<typeof vi.fn>, label: string): Record<string, unknown> {
488+expect(mock).toHaveBeenCalled();
489+const [payload] = mock.mock.calls[0] ?? [];
490+if (!payload || typeof payload !== "object" || Array.isArray(payload)) {
491+throw new Error(`expected ${label} payload`);
492+}
493+return payload as Record<string, unknown>;
494+}
495+496+function responseTexts(mock: ReturnType<typeof vi.fn>): unknown[] {
497+return mock.mock.calls.map(([payload]) =>
498+payload && typeof payload === "object" && !Array.isArray(payload)
499+ ? (payload as { text?: unknown }).text
500+ : undefined,
501+);
502+}
503+487504describe("Slack native command argument menus", () => {
488505let harness: ReturnType<typeof createArgMenusHarness>;
489506let usageHandler: (args: unknown) => Promise<void>;
@@ -691,10 +708,9 @@ describe("Slack native command argument menus", () => {
691708const actionBlocks = (payload.blocks ?? []).filter((block) => block.type === "actions");
692709expect(actionBlocks).toHaveLength(1);
693710expect(actionBlocks[0]?.elements).toHaveLength(1);
694-expect(actionBlocks[0]?.elements?.[0]).toMatchObject({
695-text: { text: "Valid" },
696-});
697-expect(actionBlocks[0]?.elements?.[0]?.value?.length).toBeLessThanOrEqual(2000);
711+const element = actionBlocks[0]?.elements?.[0];
712+expect(element?.text?.text).toBe("Valid");
713+expect(element?.value?.length).toBeLessThanOrEqual(2000);
698714});
699715700716it("shows an overflow menu when choices fit compact range", async () => {
@@ -813,7 +829,7 @@ describe("Slack native command argument menus", () => {
813829options?: Array<{ text?: { text?: string }; value?: string }>;
814830};
815831const optionTexts = (optionsPayload.options ?? []).map((option) => option.text?.text ?? "");
816-expect(optionTexts).toEqual(expect.arrayContaining([expect.stringContaining("Period 12")]));
832+expect(optionTexts.some((text) => text.includes("Period 12"))).toBe(true);
817833});
818834819835it("tracks accepted external_select option requests", async () => {
@@ -904,13 +920,10 @@ describe("Slack native command argument menus", () => {
904920includeRespond: false,
905921});
906922907-expect(harness.postEphemeral).toHaveBeenCalledWith(
908-expect.objectContaining({
909-token: "bot-token",
910-channel: "C1",
911-user: "U1",
912-}),
913-);
923+const payload = firstCallPayload(harness.postEphemeral, "postEphemeral");
924+expect(payload.token).toBe("bot-token");
925+expect(payload.channel).toBe("C1");
926+expect(payload.user).toBe("U1");
914927});
915928916929it("treats malformed percent-encoding as an invalid button", async () => {
@@ -919,14 +932,11 @@ describe("Slack native command argument menus", () => {
919932includeRespond: false,
920933});
921934922-expect(harness.postEphemeral).toHaveBeenCalledWith(
923-expect.objectContaining({
924-token: "bot-token",
925-channel: "C1",
926-user: "U1",
927-text: "Sorry, that button is no longer valid.",
928-}),
929-);
935+const payload = firstCallPayload(harness.postEphemeral, "postEphemeral");
936+expect(payload.token).toBe("bot-token");
937+expect(payload.channel).toBe("C1");
938+expect(payload.user).toBe("U1");
939+expect(payload.text).toBe("Sorry, that button is no longer valid.");
930940});
931941});
932942@@ -1093,9 +1103,7 @@ describe("slack slash commands channel policy", () => {
10931103const { respond } = await registerAndRunPolicySlash({ harness });
1094110410951105expect(dispatchMock).toHaveBeenCalledTimes(1);
1096-expect(respond).not.toHaveBeenCalledWith(
1097-expect.objectContaining({ text: "This channel is not allowed." }),
1098-);
1106+expect(responseTexts(respond)).not.toContain("This channel is not allowed.");
10991107});
1100110811011109it("blocks explicitly denied channels when groupPolicy is open", async () => {
@@ -1152,9 +1160,7 @@ describe("slack slash commands access groups", () => {
11521160});
1153116111541162expect(dispatchMock).toHaveBeenCalledTimes(1);
1155-expect(respond).not.toHaveBeenCalledWith(
1156-expect.objectContaining({ text: "You are not authorized to use this command." }),
1157-);
1163+expect(responseTexts(respond)).not.toContain("You are not authorized to use this command.");
11581164const dispatchArg = dispatchMock.mock.calls[0]?.[0] as {
11591165ctx?: { CommandAuthorized?: boolean };
11601166};
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。