import { describe, it, expect } from 'vitest'; import { validateBotToken, parseAdminIds, validateRunTime, telegramApiBase, renderMessageTemplate, buildBotConfigSummary, } from './telegram'; const VALID_TOKEN = '123456789:AAH-abcdefghijklmnopqrstuvwxyz0123456'; describe('validateBotToken', () => { it('accepts a BotFather-format token and extracts the bot id', () => { const r = validateBotToken(VALID_TOKEN); expect(r.valid).toBe(true); expect(r.botId).toBe('123456789'); }); it('rejects a token with no colon', () => { expect(validateBotToken('123456789AAH').valid).toBe(false); }); it('rejects a too-short secret', () => { expect(validateBotToken('123:short').valid).toBe(false); }); it('rejects an empty token', () => { expect(validateBotToken(' ').valid).toBe(false); }); }); describe('parseAdminIds', () => { it('splits a comma list into integer ids', () => { expect(parseAdminIds('111, 222')).toEqual({ ids: [111, 222], invalid: [] }); }); it('accepts negative group ids and captures invalid entries', () => { expect(parseAdminIds('-1001234567, abc, 42')).toEqual({ ids: [-1001234567, 42], invalid: ['abc'] }); }); it('returns empty for blank input', () => { expect(parseAdminIds(' ')).toEqual({ ids: [], invalid: [] }); }); }); describe('validateRunTime', () => { it('accepts the @daily macro', () => { expect(validateRunTime('@daily')).toMatchObject({ valid: true, kind: 'macro' }); }); it('accepts an @every duration', () => { expect(validateRunTime('@every 8h')).toMatchObject({ valid: true, kind: 'every' }); }); it('accepts a 5-field cron', () => { expect(validateRunTime('0 0 * * *')).toMatchObject({ valid: true, kind: 'cron' }); }); it('accepts a 6-field cron', () => { expect(validateRunTime('*/30 * * * * *')).toMatchObject({ valid: true, kind: 'cron' }); }); it('rejects an unknown macro', () => { expect(validateRunTime('@bogus').valid).toBe(false); }); it('rejects a malformed @every duration', () => { expect(validateRunTime('@every 8x').valid).toBe(false); }); }); describe('telegramApiBase', () => { it('builds the bot API base URL', () => { expect(telegramApiBase(VALID_TOKEN)).toBe(`https://api.telegram.org/bot${VALID_TOKEN}`); }); }); describe('renderMessageTemplate', () => { it('substitutes known variables', () => { expect(renderMessageTemplate('Host {{host}} up {{uptime}}', { host: 'srv', uptime: '3d' })).toBe( 'Host srv up 3d', ); }); it('leaves unknown variables literal', () => { expect(renderMessageTemplate('{{a}} {{b}}', { a: 'x' })).toBe('x {{b}}'); }); }); describe('buildBotConfigSummary', () => { it('emits the panel settings keys with admin ids joined', () => { const s = buildBotConfigSummary({ token: VALID_TOKEN, adminIds: '111, 222', runTime: '@daily' }); expect(s.tgBotEnable).toBe(true); expect(s.tgBotToken).toBe(VALID_TOKEN); expect(s.tgBotChatId).toBe('111,222'); expect(s.tgRunTime).toBe('@daily'); }); });