import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime" ;
import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/setup" ;
import { describe, expect, it, vi } from "vitest" ;
import {
buildTelegramDmAccessWarningLines,
ensureTelegramDefaultGroupMentionGate,
shouldShowTelegramDmAccessWarning,
telegramSetupDmPolicy,
} from "./setup-surface.helpers.js" ;
import { telegramSetupWizard } from "./setup-surface.js" ;
describe("ensureTelegramDefaultGroupMentionGate" , () => {
it('adds groups["*"].requireMention=true for fresh setups' , async () => {
const cfg = ensureTelegramDefaultGroupMentionGate(
{
channels: {
telegram: {
botToken: "tok" ,
},
},
},
DEFAULT_ACCOUNT_ID,
);
expect(cfg.channels?.telegram?.groups).toEqual({
"*" : { requireMention: true },
});
});
it("preserves an explicit wildcard group mention setting" , async () => {
const cfg = ensureTelegramDefaultGroupMentionGate(
{
channels: {
telegram: {
botToken: "tok" ,
groups: {
"*" : { requireMention: false },
},
},
},
},
DEFAULT_ACCOUNT_ID,
);
expect(cfg.channels?.telegram?.groups).toEqual({
"*" : { requireMention: false },
});
});
});
describe("telegram DM access warning helpers" , () => {
it("shows global config commands for the default account" , () => {
const lines = buildTelegramDmAccessWarningLines(DEFAULT_ACCOUNT_ID);
expect(lines.join("\n" )).toContain(
'openclaw config set channels.telegram.dmPolicy "allowlist"' ,
);
expect(lines.join("\n" )).toContain(
`openclaw config set channels.telegram.allowFrom '["YOUR_USER_ID"]' `,
);
});
it("shows account-scoped config commands for named accounts" , () => {
const lines = buildTelegramDmAccessWarningLines("alerts" );
expect(lines.join("\n" )).toContain(
'openclaw config set channels.telegram.accounts.alerts.dmPolicy "allowlist"' ,
);
expect(lines.join("\n" )).toContain(
`openclaw config set channels.telegram.accounts.alerts.allowFrom '["YOUR_USER_ID"]' `,
);
});
it("skips the warning when an allowFrom entry already exists" , () => {
expect(
shouldShowTelegramDmAccessWarning(
{
channels: {
telegram: {
botToken: "tok" ,
allowFrom: ["123" ],
},
},
},
DEFAULT_ACCOUNT_ID,
),
).toBe(false );
});
});
describe("telegramSetupDmPolicy" , () => {
it("reads the named-account DM policy instead of the channel root" , () => {
expect(
telegramSetupDmPolicy.getCurrent?.(
{
channels: {
telegram: {
dmPolicy: "disabled" ,
accounts: {
alerts: {
dmPolicy: "allowlist" ,
botToken: "tok" ,
},
},
},
},
},
"alerts" ,
),
).toBe("allowlist" );
});
it("reports account-scoped config keys for named accounts" , () => {
expect(telegramSetupDmPolicy.resolveConfigKeys?.({}, "alerts" )).toEqual({
policyKey: "channels.telegram.accounts.alerts.dmPolicy" ,
allowFromKey: "channels.telegram.accounts.alerts.allowFrom" ,
});
});
it("uses configured defaultAccount for omitted DM policy account context" , () => {
const cfg: OpenClawConfig = {
channels: {
telegram: {
defaultAccount: "alerts" ,
dmPolicy: "disabled" ,
allowFrom: ["123" ],
accounts: {
alerts: {
dmPolicy: "allowlist" ,
botToken: "tok" ,
},
},
},
},
};
expect(telegramSetupDmPolicy.getCurrent?.(cfg)).toBe("allowlist" );
expect(telegramSetupDmPolicy.resolveConfigKeys?.(cfg)).toEqual({
policyKey: "channels.telegram.accounts.alerts.dmPolicy" ,
allowFromKey: "channels.telegram.accounts.alerts.allowFrom" ,
});
const next = telegramSetupDmPolicy.setPolicy?.(cfg, "open" );
expect(next?.channels?.telegram?.dmPolicy).toBe("disabled" );
expect(next?.channels?.telegram?.accounts?.alerts?.dmPolicy).toBe("open" );
});
it('writes open policy state to the named account and preserves inherited allowFrom with "*"' , () => {
const cfg: OpenClawConfig = {
channels: {
telegram: {
allowFrom: ["123" ],
accounts: {
alerts: {
botToken: "tok" ,
},
},
},
},
};
const next = telegramSetupDmPolicy.setPolicy?.(cfg, "open" , "alerts" );
expect(next?.channels?.telegram?.dmPolicy).toBeUndefined();
expect(next?.channels?.telegram?.accounts?.alerts?.dmPolicy).toBe("open" );
expect(next?.channels?.telegram?.accounts?.alerts?.allowFrom).toEqual(["123" , "*" ]);
});
});
describe("telegramSetupWizard allowFrom" , () => {
it("accepts numeric sender ids only" , async () => {
const globalFetch = vi.fn(async () => {
throw new Error("global fetch should not be called" );
});
vi.stubGlobal("fetch" , globalFetch);
try {
const resolved = await telegramSetupWizard.allowFrom?.resolveEntries({
cfg: {},
accountId: DEFAULT_ACCOUNT_ID,
credentialValues: { token: "tok" },
entries: ["@user" ],
});
expect(telegramSetupWizard.allowFrom?.message).toBe("Telegram allowFrom (numeric sender id)" );
expect(telegramSetupWizard.allowFrom?.placeholder).toBe("123456789" );
expect(resolved).toEqual([{ input: "@user" , resolved: false , id: null }]);
expect(globalFetch).not.toHaveBeenCalled();
} finally {
vi.unstubAllGlobals();
}
});
});
Messung V0.5 in Prozent C=98 H=100 G=98
¤ Dauer der Verarbeitung: 0.10 Sekunden
(vorverarbeitet am 2026-06-13)
¤
*© Formatika GbR, Deutschland