// 回归测试 #1 / #4:生产环境下,忘记密码/短信验证码绝不出现在响应里(fail-closed)。 // NODE_ENV 必须在 import config 之前设定,故用动态 import。 process.env.NODE_ENV = 'production'; process.env.EMAIL_PROVIDER = 'stub'; // 无真实邮件 provider process.env.SMS_PROVIDER = 'stub'; // 无真实短信 provider // ⚠ 必须显式钉死:开发机的 .env 里常有 ALLOW_STUB_LOGIN=true(内测放开手机/微信登录), // dotenv 不覆盖已存在的 process.env,但【没设过的】变量会被 .env 灌进来 → // 这条回归测试会被本地 .env 污染:它本想验证"没开 stub 时必须 fail-closed", // 结果读到 allowStubLogin=true 走了另一条分支,长期红着、没人当回事。 process.env.ALLOW_STUB_LOGIN = 'false'; import { test } from 'node:test'; import assert from 'node:assert/strict'; const { sendResetCode, sendSmsCode } = await import('../src/services/altauth.js'); test('prod: 忘记密码验证码不回传(无 devCode),fail-closed', async () => { const r = await sendResetCode('victim@example.com'); assert.ok(!('devCode' in r) || !r.devCode, `不应泄露 devCode,实际:${JSON.stringify(r)}`); assert.equal(r.error, 'email-send-failed'); }); test('prod: 短信验证码不回传(无 devCode),fail-closed', async () => { const r = await sendSmsCode('13800138000'); assert.ok(!('devCode' in r) || !r.devCode, `不应泄露 devCode,实际:${JSON.stringify(r)}`); assert.equal(r.error, 'sms-send-failed'); });