
























@@ -3,6 +3,14 @@ import type { SlackMessageEvent } from "../types.js";
33import { createSlackThreadTsResolver } from "./thread-resolution.js";
4455describe("createSlackThreadTsResolver", () => {
6+function makeThreadReplyMessage(ts: string): SlackMessageEvent {
7+return {
8+channel: "C1",
9+parent_user_id: "U2",
10+ ts,
11+} as SlackMessageEvent;
12+}
13+614it("caches resolved thread_ts lookups", async () => {
715const historyMock = vi.fn().mockResolvedValue({
816messages: [{ ts: "1", thread_ts: "9" }],
@@ -13,11 +21,7 @@ describe("createSlackThreadTsResolver", () => {
1321maxSize: 5,
1422});
152316-const message = {
17-channel: "C1",
18-parent_user_id: "U2",
19-ts: "1",
20-} as SlackMessageEvent;
24+const message = makeThreadReplyMessage("1");
21252226const first = await resolver.resolve({ message, source: "message" });
2327const second = await resolver.resolve({ message, source: "message" });
@@ -37,11 +41,7 @@ describe("createSlackThreadTsResolver", () => {
3741maxSize: 5,
3842});
394340-const message = {
41-channel: "C1",
42-parent_user_id: "U2",
43-ts: "1",
44-} as SlackMessageEvent;
44+const message = makeThreadReplyMessage("1");
45454646const first = await resolver.resolve({ message, source: "message" });
4747const second = await resolver.resolve({ message, source: "message" });
@@ -50,4 +50,45 @@ describe("createSlackThreadTsResolver", () => {
5050expect(second["_ambiguousThreadReply"]).toBe(true);
5151expect(historyMock).toHaveBeenCalledTimes(1);
5252});
53+54+it("falls back to the default ttl when cacheTtlMs is non-finite", async () => {
55+vi.useFakeTimers();
56+try {
57+const historyMock = vi.fn().mockResolvedValue({
58+messages: [{ ts: "1", thread_ts: "9" }],
59+});
60+const resolver = createSlackThreadTsResolver({
61+client: { conversations: { history: historyMock } } as never,
62+cacheTtlMs: Number.NaN,
63+maxSize: 5,
64+});
65+const message = makeThreadReplyMessage("1");
66+67+await resolver.resolve({ message, source: "message" });
68+vi.advanceTimersByTime(60_001);
69+await resolver.resolve({ message, source: "message" });
70+71+expect(historyMock).toHaveBeenCalledTimes(2);
72+} finally {
73+vi.useRealTimers();
74+}
75+});
76+77+it("falls back to the default max size when maxSize is non-finite", async () => {
78+const historyMock = vi.fn(async ({ latest }: { latest: string }) => ({
79+messages: [{ ts: latest, thread_ts: `thread-${latest}` }],
80+}));
81+const resolver = createSlackThreadTsResolver({
82+client: { conversations: { history: historyMock } } as never,
83+cacheTtlMs: 60_000,
84+maxSize: Number.NaN,
85+});
86+87+for (let i = 0; i <= 500; i++) {
88+await resolver.resolve({ message: makeThreadReplyMessage(String(i)), source: "message" });
89+}
90+await resolver.resolve({ message: makeThreadReplyMessage("0"), source: "message" });
91+92+expect(historyMock).toHaveBeenCalledTimes(502);
93+});
5394});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。