'use strict'; const test = require('node:test'); const assert = require('node:assert'); const { parseBotsFromEnv, sanitizeId, normalizePort } = require('../src/config/botsConfig'); test('MC_BOTS JSON 数组写法解析多个机器人', () => { const bots = parseBotsFromEnv({ MC_HOST: 'mc.example.com', MC_PORT: '25566', MC_VERSION: '1.21.1', MC_AUTH: 'offline', MC_BOTS: JSON.stringify([ { username: 'BotA', password: 'p1' }, { username: 'BotB', password: 'p2', label: '二号机' } ]) }); assert.strictEqual(bots.length, 2); assert.deepStrictEqual(bots.map((b) => b.username), ['BotA', 'BotB']); assert.strictEqual(bots[0].host, 'mc.example.com'); assert.strictEqual(bots[0].port, 25566); assert.strictEqual(bots[0].version, '1.21.1'); assert.strictEqual(bots[1].label, '二号机'); assert.strictEqual(bots[1].password, 'p2'); }); test('MC_BOTS 逗号分隔写法解析用户名与密码', () => { const bots = parseBotsFromEnv({ MC_BOTS: 'BotA:p1, BotB:p2' }); assert.deepStrictEqual(bots.map((b) => [b.username, b.password]), [['BotA', 'p1'], ['BotB', 'p2']]); }); test('MC_BOTS 中没有冒号的项视为「只有用户名」', () => { const bots = parseBotsFromEnv({ MC_BOTS: 'BotA' }); assert.strictEqual(bots.length, 1); assert.strictEqual(bots[0].password, ''); }); test('未配置 MC_BOTS 时回退到 MC_USERNAME / MC_PASSWORD', () => { const bots = parseBotsFromEnv({ MC_USERNAME: 'SoloBot', MC_PASSWORD: 'pw' }); assert.strictEqual(bots.length, 1); assert.strictEqual(bots[0].username, 'SoloBot'); assert.strictEqual(bots[0].password, 'pw'); }); test('MC_BOTS 解析失败(非法 JSON)时回退到单机器人兜底', () => { const bots = parseBotsFromEnv({ MC_BOTS: '[{bad json', MC_USERNAME: 'Fallback', MC_PASSWORD: 'p' }); assert.strictEqual(bots.length, 1); assert.strictEqual(bots[0].username, 'Fallback'); }); test('重名机器人被去重,空用户名被丢弃', () => { const bots = parseBotsFromEnv({ MC_BOTS: 'BotA:p1,BotA:p2,, ,BotB:p3' }); assert.deepStrictEqual(bots.map((b) => b.username), ['BotA', 'BotB']); assert.strictEqual(bots[0].password, 'p1', '应保留第一个同名条目'); }); test('id 由用户名安全化生成,可用于 URL 与文件名', () => { const bots = parseBotsFromEnv({ MC_BOTS: 'a/b:c:p1' }); assert.strictEqual(bots.length, 1); assert.strictEqual(bots[0].username, 'a/b'); assert.strictEqual(bots[0].id, 'a_b'); assert.strictEqual(sanitizeId('正常名字_123'), '正常名字_123'); }); test('端口非法时回退到 25565', () => { assert.strictEqual(normalizePort('abc'), 25565); assert.strictEqual(normalizePort('0'), 25565); assert.strictEqual(normalizePort('70000'), 25565); assert.strictEqual(normalizePort('25565'), 25565); const bots = parseBotsFromEnv({ MC_BOTS: 'BotA:p', MC_PORT: 'x' }); assert.strictEqual(bots[0].port, 25565); }); test('没有任何配置时返回空列表', () => { assert.deepStrictEqual(parseBotsFromEnv({}), []); });