






























@@ -186,11 +186,47 @@ describe("server-channels auto restart", () => {
186186const account = snapshot.channelAccounts.discord?.[DEFAULT_ACCOUNT_ID];
187187expect(account?.running).toBe(false);
188188expect(account?.reconnectAttempts).toBe(11);
189+expect(account?.lastError).toBe("channel exited without an error");
189190190191await vi.advanceTimersByTimeAsync(200);
191192expect(startAccount).toHaveBeenCalledTimes(11);
192193});
193194195+it("records a clean channel monitor exit before auto-restart", async () => {
196+const startAccount = vi.fn(async () => {});
197+installTestRegistry(createTestPlugin({ startAccount }));
198+const manager = createManager();
199+200+await manager.startChannels();
201+await vi.advanceTimersByTimeAsync(0);
202+203+const snapshot = manager.getRuntimeSnapshot();
204+const account = snapshot.channelAccounts.discord?.[DEFAULT_ACCOUNT_ID];
205+expect(startAccount).toHaveBeenCalled();
206+expect(account?.running).toBe(false);
207+expect(account?.restartPending).toBe(true);
208+expect(account?.lastError).toBe("channel exited without an error");
209+});
210+211+it("does not record a clean-exit error for manual abort stops", async () => {
212+const startAccount = vi.fn(
213+async ({ abortSignal }: { abortSignal: AbortSignal }) =>
214+await new Promise<void>((resolve) => {
215+abortSignal.addEventListener("abort", () => resolve(), { once: true });
216+}),
217+);
218+installTestRegistry(createTestPlugin({ startAccount }));
219+const manager = createManager();
220+221+await manager.startChannels();
222+await manager.stopChannel("discord", DEFAULT_ACCOUNT_ID);
223+224+const snapshot = manager.getRuntimeSnapshot();
225+const account = snapshot.channelAccounts.discord?.[DEFAULT_ACCOUNT_ID];
226+expect(account?.running).toBe(false);
227+expect(account?.lastError).toBeNull();
228+});
229+194230it("does not auto-restart after manual stop during backoff", async () => {
195231const startAccount = vi.fn(async () => {});
196232installTestRegistry(
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。