import assert from 'node:assert/strict'; import test from 'node:test'; import pino from 'pino'; import type { AppConfig } from '../config.js'; import { createSmsVerificationService } from './smsVerificationService.js'; function createAliyunSmsConfig(): AppConfig { return { smsAuth: { enabled: true, provider: 'aliyun', endpoint: 'dypnsapi.aliyuncs.com', accessKeyId: 'test-access-key-id', accessKeySecret: 'test-access-key-secret', signName: '测试签名', templateCode: 'SMS_100001', templateParamKey: 'code', countryCode: '86', schemeName: '', codeLength: 6, codeType: 1, validTimeSeconds: 300, intervalSeconds: 60, duplicatePolicy: 1, caseAuthPolicy: 1, returnVerifyCode: false, mockVerifyCode: '123456', maxSendPerPhonePerDay: 20, maxSendPerIpPerHour: 30, maxVerifyFailuresPerPhonePerHour: 12, maxVerifyFailuresPerIpPerHour: 24, captchaTtlSeconds: 180, captchaTriggerVerifyFailuresPerPhone: 3, captchaTriggerVerifyFailuresPerIp: 5, blockPhoneFailureThreshold: 6, blockIpFailureThreshold: 10, blockPhoneDurationMinutes: 30, blockIpDurationMinutes: 30, }, } as AppConfig; } test('createSmsVerificationService initializes aliyun sdk client under tsx esm runtime', () => { const service = createSmsVerificationService( createAliyunSmsConfig(), pino({ enabled: false }), ); assert.equal(typeof service.sendLoginCode, 'function'); assert.equal(typeof service.verifyLoginCode, 'function'); }); test('mock sms service reports delivered tracking metadata', async () => { const config = createAliyunSmsConfig(); config.smsAuth.provider = 'mock'; config.smsAuth.accessKeyId = ''; config.smsAuth.accessKeySecret = ''; const service = createSmsVerificationService( config, pino({ enabled: false }), ); const result = await service.sendLoginCode({ e164: '+8613800138000', nationalNumber: '13800138000', maskedNationalNumber: '138****8000', }); assert.equal(result.provider, 'mock'); assert.equal(result.deliveryStatus, 'delivered'); assert.equal(result.providerRequestId, 'mock-request-id'); assert.equal(result.providerOutId, 'mock-out-id'); });