



























@@ -56,16 +56,16 @@ describe("Slack status reaction lifecycle", () => {
5656void ctrl.setThinking();
5757await vi.advanceTimersByTimeAsync(10);
5858expect(active.has(DEFAULT_EMOJIS.thinking)).toBe(true);
59-expect(active.has("eyes")).toBe(false);
59+expect(active.has("eyes")).toBe(true);
60606161void ctrl.setTool("web_search");
6262await vi.advanceTimersByTimeAsync(10);
6363expect(active.has(DEFAULT_EMOJIS.web)).toBe(true);
64-expect(active.has(DEFAULT_EMOJIS.thinking)).toBe(false);
64+expect(active.has(DEFAULT_EMOJIS.thinking)).toBe(true);
65656666await ctrl.setDone();
6767expect(active.has(DEFAULT_EMOJIS.done)).toBe(true);
68-expect(active.has(DEFAULT_EMOJIS.web)).toBe(false);
68+expect(active.has(DEFAULT_EMOJIS.web)).toBe(true);
69697070await ctrl.clear();
7171expect(active.size).toBe(0);
@@ -87,7 +87,7 @@ describe("Slack status reaction lifecycle", () => {
87878888await ctrl.setError();
8989expect(active.has(DEFAULT_EMOJIS.error)).toBe(true);
90-expect(active.has("eyes")).toBe(false);
90+expect(active.has("eyes")).toBe(true);
91919292await ctrl.restoreInitial();
9393expect(active.has("eyes")).toBe(true);
@@ -117,6 +117,50 @@ describe("Slack status reaction lifecycle", () => {
117117expect(active.has(DEFAULT_EMOJIS.stallHard)).toBe(false);
118118});
119119120+it("restoreInitial removes extra active reactions when current emoji is already initial", async () => {
121+const { adapter, active } = createSlackMockAdapter();
122+const ctrl = createStatusReactionController({
123+enabled: true,
124+ adapter,
125+initialEmoji: "eyes",
126+timing: { debounceMs: 0, stallSoftMs: 99999, stallHardMs: 99999 },
127+});
128+129+void ctrl.setThinking();
130+await vi.advanceTimersByTimeAsync(10);
131+void ctrl.setQueued();
132+await vi.advanceTimersByTimeAsync(10);
133+expect(active.has(DEFAULT_EMOJIS.thinking)).toBe(true);
134+expect(active.has("eyes")).toBe(true);
135+136+await ctrl.restoreInitial();
137+138+expect(active.has("eyes")).toBe(true);
139+expect(active.has(DEFAULT_EMOJIS.thinking)).toBe(false);
140+});
141+142+it("restoreInitial removes only tracked active reactions", async () => {
143+const { adapter, active } = createSlackMockAdapter();
144+const ctrl = createStatusReactionController({
145+enabled: true,
146+ adapter,
147+initialEmoji: "eyes",
148+timing: { debounceMs: 0, stallSoftMs: 99999, stallHardMs: 99999 },
149+});
150+151+void ctrl.setQueued();
152+await vi.advanceTimersByTimeAsync(10);
153+await ctrl.setDone();
154+155+await ctrl.restoreInitial();
156+157+expect(active.has("eyes")).toBe(true);
158+expect(active.has(DEFAULT_EMOJIS.done)).toBe(false);
159+expect(adapter.removeReaction).toHaveBeenCalledTimes(1);
160+expect(adapter.removeReaction).toHaveBeenCalledWith(DEFAULT_EMOJIS.done);
161+expect(adapter.removeReaction).not.toHaveBeenCalledWith(DEFAULT_EMOJIS.thinking);
162+});
163+120164it("restoreInitial still applies initial emoji when it is only debounced", async () => {
121165const { adapter, active } = createSlackMockAdapter();
122166const ctrl = createStatusReactionController({
@@ -134,14 +178,14 @@ describe("Slack status reaction lifecycle", () => {
134178void ctrl.setTool("web_search");
135179await vi.advanceTimersByTimeAsync(25);
136180expect(active.has(DEFAULT_EMOJIS.web)).toBe(true);
137-expect(active.has("eyes")).toBe(false);
181+expect(active.has("eyes")).toBe(true);
138182139183void ctrl.setThinking();
140184await ctrl.restoreInitial();
141185142186expect(active.has("eyes")).toBe(true);
143187expect(active.has(DEFAULT_EMOJIS.web)).toBe(false);
144-expect(adapter.setReaction).toHaveBeenCalledTimes(3);
188+expect(adapter.setReaction).toHaveBeenCalledTimes(2);
145189});
146190147191it("restoreInitial re-applies initial emoji after an in-flight debounced transition", async () => {
@@ -212,6 +256,6 @@ describe("Slack status reaction lifecycle", () => {
212256void ctrl.setTool("exec");
213257await vi.advanceTimersByTimeAsync(10);
214258expect(active.has(DEFAULT_EMOJIS.coding)).toBe(true);
215-expect(active.has("eyes")).toBe(false);
259+expect(active.has("eyes")).toBe(true);
216260});
217261});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。