






























@@ -50,6 +50,7 @@ function createTestPlugin(params?: {
5050order?: number;
5151account?: TestAccount;
5252startAccount?: NonNullable<ChannelPlugin<TestAccount>["gateway"]>["startAccount"];
53+listAccountIds?: ChannelPlugin<TestAccount>["config"]["listAccountIds"];
5354includeDescribeAccount?: boolean;
5455describeAccount?: ChannelPlugin<TestAccount>["config"]["describeAccount"];
5556resolveAccount?: ChannelPlugin<TestAccount>["config"]["resolveAccount"];
@@ -59,7 +60,7 @@ function createTestPlugin(params?: {
5960const account = params?.account ?? { enabled: true, configured: true };
6061const includeDescribeAccount = params?.includeDescribeAccount !== false;
6162const config: ChannelPlugin<TestAccount>["config"] = {
62-listAccountIds: () => [DEFAULT_ACCOUNT_ID],
63+listAccountIds: params?.listAccountIds ?? (() => [DEFAULT_ACCOUNT_ID]),
6364resolveAccount: params?.resolveAccount ?? (() => account),
6465isEnabled: (resolved) => resolved.enabled !== false,
6566 ...(params?.isConfigured ? { isConfigured: params.isConfigured } : {}),
@@ -436,6 +437,35 @@ describe("server-channels auto restart", () => {
436437expect(succeedingStart).toHaveBeenCalledTimes(1);
437438});
438439440+it("evicts stale account lifecycle state during whole-channel reload", async () => {
441+let accountIds = [DEFAULT_ACCOUNT_ID];
442+const startAccount = vi.fn(
443+async ({ abortSignal }: { abortSignal: AbortSignal }) =>
444+await new Promise<void>((resolve) => {
445+abortSignal.addEventListener("abort", () => resolve(), { once: true });
446+}),
447+);
448+installTestRegistry(createTestPlugin({ startAccount, listAccountIds: () => accountIds }));
449+const manager = createManager();
450+451+await manager.startChannel("discord");
452+453+accountIds = [];
454+await manager.stopChannel("discord");
455+await manager.startChannel("discord");
456+457+accountIds = [DEFAULT_ACCOUNT_ID];
458+await manager.startChannel("discord");
459+460+const snapshot = manager.getRuntimeSnapshot();
461+const account = snapshot.channelAccounts.discord?.[DEFAULT_ACCOUNT_ID];
462+expect(startAccount).toHaveBeenCalledTimes(2);
463+expect(account?.reconnectAttempts).toBe(0);
464+expect(account?.lastStopAt).toBeUndefined();
465+466+await manager.stopChannel("discord");
467+});
468+439469it("reuses plugin account resolution for health monitor overrides", () => {
440470installTestRegistry(
441471createTestPlugin({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。