























@@ -1,10 +1,17 @@
1-import { describe, expect, it } from "vitest";
1+import { afterEach, describe, expect, it, vi } from "vitest";
22import {
33createDiscordActionGate,
4+isDiscordAccountEnabledForRuntime,
5+listEnabledDiscordAccounts,
46resolveDiscordAccount,
7+resolveDiscordAccountDisabledReason,
58resolveDiscordMaxLinesPerMessage,
69} from "./accounts.js";
71011+afterEach(() => {
12+vi.unstubAllEnvs();
13+});
14+815describe("resolveDiscordAccount allowFrom precedence", () => {
916it("uses configured defaultAccount when accountId is omitted", () => {
1017const resolved = resolveDiscordAccount({
@@ -161,3 +168,80 @@ describe("resolveDiscordMaxLinesPerMessage", () => {
161168expect(resolved).toBe(80);
162169});
163170});
171+172+describe("Discord duplicate-token account filtering", () => {
173+it("keeps the config-token account over default env fallback when tokens collide", () => {
174+vi.stubEnv("DISCORD_BOT_TOKEN", "same-token");
175+const cfg = {
176+channels: {
177+discord: {
178+accounts: {
179+work: {
180+token: "same-token",
181+},
182+},
183+},
184+},
185+};
186+187+const defaultAccount = resolveDiscordAccount({ cfg, accountId: "default" });
188+const workAccount = resolveDiscordAccount({ cfg, accountId: "work" });
189+190+expect(isDiscordAccountEnabledForRuntime(defaultAccount, cfg)).toBe(false);
191+expect(resolveDiscordAccountDisabledReason(defaultAccount, cfg)).toBe(
192+'duplicate bot token; using account "work"',
193+);
194+expect(isDiscordAccountEnabledForRuntime(workAccount, cfg)).toBe(true);
195+expect(listEnabledDiscordAccounts(cfg).map((account) => account.accountId)).toEqual(["work"]);
196+});
197+198+it("keeps the first enabled account when duplicate tokens have the same source", () => {
199+const cfg = {
200+channels: {
201+discord: {
202+accounts: {
203+first: {
204+token: "same-token",
205+},
206+second: {
207+token: "same-token",
208+},
209+},
210+},
211+},
212+};
213+214+const firstAccount = resolveDiscordAccount({ cfg, accountId: "first" });
215+const secondAccount = resolveDiscordAccount({ cfg, accountId: "second" });
216+217+expect(isDiscordAccountEnabledForRuntime(firstAccount, cfg)).toBe(true);
218+expect(isDiscordAccountEnabledForRuntime(secondAccount, cfg)).toBe(false);
219+expect(resolveDiscordAccountDisabledReason(secondAccount, cfg)).toBe(
220+'duplicate bot token; using account "first"',
221+);
222+expect(listEnabledDiscordAccounts(cfg).map((account) => account.accountId)).toEqual(["first"]);
223+});
224+225+it("does not let disabled duplicate-token accounts suppress enabled accounts", () => {
226+const cfg = {
227+channels: {
228+discord: {
229+accounts: {
230+disabled: {
231+enabled: false,
232+token: "same-token",
233+},
234+active: {
235+token: "same-token",
236+},
237+},
238+},
239+},
240+};
241+242+const activeAccount = resolveDiscordAccount({ cfg, accountId: "active" });
243+244+expect(isDiscordAccountEnabledForRuntime(activeAccount, cfg)).toBe(true);
245+expect(listEnabledDiscordAccounts(cfg).map((account) => account.accountId)).toEqual(["active"]);
246+});
247+});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。