/** * 环境变量 Mock 工具 * 用于在测试中模拟和管理环境变量 */ /** * Mock 环境变量 * * @param {object} envVars - 要设置的环境变量 * @returns {Function} 恢复函数 */ export function mockEnvVars(envVars) { const originalEnv = {}; // 保存原始值 for (const key in envVars) { originalEnv[key] = process.env[key]; process.env[key] = envVars[key]; } // 返回恢复函数 return () => { for (const key in envVars) { if (originalEnv[key] === undefined) { delete process.env[key]; } else { process.env[key] = originalEnv[key]; } } }; } /** * 创建标准的 Action 环境变量 * * @param {object} overrides - 覆盖的环境变量 * @returns {object} 环境变量对象 */ export function createActionEnv(overrides = {}) { return { INPUT_WEBHOOK_URL: 'https://oapi.dingtalk.com/robot/send?access_token=test123', INPUT_MESSAGE_TYPE: 'text', INPUT_CONTENT: 'Test message', INPUT_TITLE: '', INPUT_AT_MOBILES: '', INPUT_AT_ALL: 'false', INPUT_LINK_URL: '', INPUT_PIC_URL: '', INPUT_BTN_ORIENTATION: '0', INPUT_SINGLE_TITLE: '', INPUT_SINGLE_URL: '', INPUT_BUTTONS: '', INPUT_FEED_LINKS: '', ...overrides, }; } /** * 清理所有 INPUT_ 开头的环境变量 * * @returns {Function} 恢复函数 */ export function clearActionEnv() { const originalEnv = {}; const inputKeys = Object.keys(process.env).filter(key => key.startsWith('INPUT_')); inputKeys.forEach(key => { originalEnv[key] = process.env[key]; delete process.env[key]; }); return () => { Object.assign(process.env, originalEnv); }; } /** * 创建测试用的环境变量快照 * * @returns {object} 当前环境变量的副本 */ export function createEnvSnapshot() { return { ...process.env }; } /** * 恢复环境变量到指定快照 * * @param {object} snapshot - 环境变量快照 */ export function restoreEnvSnapshot(snapshot) { // 清除当前环境变量 for (const key in process.env) { if (!(key in snapshot)) { delete process.env[key]; } } // 恢复快照中的环境变量 Object.assign(process.env, snapshot); } /** * 创建环境变量 Mock(别名函数) * * @param {object} envVars - 要设置的环境变量 * @returns {Function} 恢复函数 */ export function createEnvMock(envVars) { return mockEnvVars(envVars); }