/** * 邀请注册功能测试 * 测试新用户注册试用期和邀请人奖励逻辑 */ const dayjs = require('dayjs'); // 模拟数据库模型 const mockModels = { pla_account: { findOne: null, create: null, update: null }, invite_record: { create: null } }; describe('邀请注册功能测试', () => { /** * 测试1: 新用户注册应该获得3天试用期 */ test('新用户注册应该获得3天试用期', () => { console.log('\n【测试1】新用户注册应该获得3天试用期'); // 模拟新用户数据 const newUserData = { name: 'testuser', sn_code: 'SN12345', device_id: '', platform_type: 'boss', login_name: 'test@example.com', pwd: 'hashed_password', keyword: '', is_enabled: 1, is_delete: 0, authorization_date: new Date(), authorization_days: 3 }; // 验证授权日期不为空 if (!newUserData.authorization_date) { throw new Error('❌ 失败: 新用户授权日期为空'); } // 验证授权天数为3 if (newUserData.authorization_days !== 3) { throw new Error(`❌ 失败: 新用户授权天数应为3天,实际为 ${newUserData.authorization_days} 天`); } console.log('✅ 通过: 新用户授权日期:', newUserData.authorization_date); console.log('✅ 通过: 新用户授权天数:', newUserData.authorization_days, '天'); }); /** * 测试2: 邀请人授权未过期时,应该累加3天 */ test('邀请人授权未过期时,应该累加3天', () => { console.log('\n【测试2】邀请人授权未过期时,应该累加3天'); // 模拟邀请人当前数据(还有5天有效期) const inviterData = { id: 1, authorization_date: dayjs().subtract(2, 'day').toDate(), // 2天前开始 authorization_days: 7 // 总共7天,还剩5天 }; // 计算当前剩余天数 const currentEndDate = dayjs(inviterData.authorization_date).add(inviterData.authorization_days, 'day'); const now = dayjs(); const remainingDays = currentEndDate.diff(now, 'day'); console.log('邀请人当前授权:', { 开始日期: dayjs(inviterData.authorization_date).format('YYYY-MM-DD'), 授权天数: inviterData.authorization_days, 剩余天数: remainingDays, 过期日期: currentEndDate.format('YYYY-MM-DD') }); // 模拟邀请逻辑:未过期应该累加 let newAuthDate = inviterData.authorization_date; let newAuthDays = inviterData.authorization_days + 3; if (!currentEndDate.isBefore(now)) { // 未过期,累加3天 console.log('✅ 通过: 授权未过期,累加3天'); console.log('新授权天数:', newAuthDays, '天 (原', inviterData.authorization_days, '天 + 3天)'); if (newAuthDays !== inviterData.authorization_days + 3) { throw new Error('❌ 失败: 授权天数计算错误'); } } else { throw new Error('❌ 失败: 测试场景错误,授权应该未过期'); } }); /** * 测试3: 邀请人授权已过期时,应该重新激活给3天 */ test('邀请人授权已过期时,应该重新激活给3天', () => { console.log('\n【测试3】邀请人授权已过期时,应该重新激活给3天'); // 模拟邀请人当前数据(已过期) const inviterData = { id: 2, authorization_date: dayjs().subtract(10, 'day').toDate(), // 10天前开始 authorization_days: 5 // 只有5天,早已过期 }; // 计算当前剩余天数 const currentEndDate = dayjs(inviterData.authorization_date).add(inviterData.authorization_days, 'day'); const now = dayjs(); const daysExpired = now.diff(currentEndDate, 'day'); console.log('邀请人当前授权:', { 开始日期: dayjs(inviterData.authorization_date).format('YYYY-MM-DD'), 授权天数: inviterData.authorization_days, 过期日期: currentEndDate.format('YYYY-MM-DD'), 已过期天数: daysExpired }); // 模拟邀请逻辑:已过期应该重新激活 let newAuthDate; let newAuthDays; if (currentEndDate.isBefore(now)) { // 已过期,重新激活 newAuthDate = new Date(); newAuthDays = 3; console.log('✅ 通过: 授权已过期,重新激活给3天'); console.log('新授权开始日期:', dayjs(newAuthDate).format('YYYY-MM-DD')); console.log('新授权天数:', newAuthDays, '天'); if (newAuthDays !== 3) { throw new Error('❌ 失败: 重新激活应该给3天'); } } else { throw new Error('❌ 失败: 测试场景错误,授权应该已过期'); } }); /** * 测试4: 邀请人没有授权日期时,应该从今天开始累加 */ test('邀请人没有授权日期时,应该从今天开始累加', () => { console.log('\n【测试4】邀请人没有授权日期时,应该从今天开始累加'); // 模拟邀请人当前数据(从未授权) const inviterData = { id: 3, authorization_date: null, authorization_days: 0 }; console.log('邀请人当前授权:', { 开始日期: '无', 授权天数: inviterData.authorization_days }); // 模拟邀请逻辑:没有授权日期,从今天开始 let newAuthDate; let newAuthDays; if (!inviterData.authorization_date) { newAuthDate = new Date(); newAuthDays = inviterData.authorization_days + 3; // 0 + 3 = 3 console.log('✅ 通过: 首次获得授权,从今天开始'); console.log('新授权开始日期:', dayjs(newAuthDate).format('YYYY-MM-DD')); console.log('新授权天数:', newAuthDays, '天'); if (newAuthDays !== 3) { throw new Error('❌ 失败: 首次授权应该给3天'); } if (!newAuthDate) { throw new Error('❌ 失败: 授权日期不能为空'); } } else { throw new Error('❌ 失败: 测试场景错误,授权日期应该为空'); } }); /** * 测试5: 邀请记录应该正确保存 */ test('邀请记录应该正确保存', () => { console.log('\n【测试5】邀请记录应该正确保存'); // 模拟邀请记录数据 const inviteRecordData = { inviter_id: 1, inviter_sn_code: 'SN_INVITER', invitee_id: 2, invitee_sn_code: 'SN_INVITEE', invitee_phone: 'invitee@example.com', invite_code: 'INV1_ABC123', register_time: new Date(), reward_status: 1, // 已发放 reward_type: 'trial_days', reward_value: 3, is_delete: 0 }; // 验证必要字段 if (!inviteRecordData.inviter_id) { throw new Error('❌ 失败: 邀请人ID不能为空'); } if (!inviteRecordData.invitee_id) { throw new Error('❌ 失败: 被邀请人ID不能为空'); } if (inviteRecordData.reward_status !== 1) { throw new Error('❌ 失败: 奖励状态应该为已发放(1)'); } if (inviteRecordData.reward_value !== 3) { throw new Error('❌ 失败: 奖励值应该为3天'); } if (inviteRecordData.reward_type !== 'trial_days') { throw new Error('❌ 失败: 奖励类型应该为trial_days'); } console.log('✅ 通过: 邀请记录字段验证通过'); console.log('邀请记录:', { 邀请人ID: inviteRecordData.inviter_id, 被邀请人ID: inviteRecordData.invitee_id, 邀请码: inviteRecordData.invite_code, 奖励状态: inviteRecordData.reward_status === 1 ? '已发放' : '未发放', 奖励类型: inviteRecordData.reward_type, 奖励值: inviteRecordData.reward_value + '天' }); }); }); // 运行所有测试 function runTests() { console.log('\n========================================'); console.log('开始测试邀请注册功能'); console.log('========================================'); const tests = [ { name: '新用户注册应该获得3天试用期', fn: () => { console.log('\n【测试1】新用户注册应该获得3天试用期'); const newUserData = { authorization_date: new Date(), authorization_days: 3 }; if (!newUserData.authorization_date) throw new Error('授权日期为空'); if (newUserData.authorization_days !== 3) throw new Error('授权天数不是3天'); console.log('✅ 通过'); }}, { name: '邀请人授权未过期时,应该累加3天', fn: () => { console.log('\n【测试2】邀请人授权未过期时,应该累加3天'); const inviterData = { authorization_date: dayjs().subtract(2, 'day').toDate(), authorization_days: 7 }; const currentEndDate = dayjs(inviterData.authorization_date).add(inviterData.authorization_days, 'day'); const now = dayjs(); if (currentEndDate.isBefore(now)) throw new Error('测试数据错误'); const newAuthDays = inviterData.authorization_days + 3; if (newAuthDays !== 10) throw new Error('累加计算错误'); console.log('✅ 通过: 7天 + 3天 = 10天'); }}, { name: '邀请人授权已过期时,应该重新激活给3天', fn: () => { console.log('\n【测试3】邀请人授权已过期时,应该重新激活给3天'); const inviterData = { authorization_date: dayjs().subtract(10, 'day').toDate(), authorization_days: 5 }; const currentEndDate = dayjs(inviterData.authorization_date).add(inviterData.authorization_days, 'day'); const now = dayjs(); if (!currentEndDate.isBefore(now)) throw new Error('测试数据错误'); const newAuthDays = 3; if (newAuthDays !== 3) throw new Error('重新激活计算错误'); console.log('✅ 通过: 过期后重新激活给3天'); }}, { name: '邀请人没有授权日期时,应该从今天开始累加', fn: () => { console.log('\n【测试4】邀请人没有授权日期时,应该从今天开始累加'); const inviterData = { authorization_date: null, authorization_days: 0 }; if (inviterData.authorization_date) throw new Error('测试数据错误'); const newAuthDate = new Date(); const newAuthDays = 3; if (!newAuthDate) throw new Error('授权日期为空'); if (newAuthDays !== 3) throw new Error('天数计算错误'); console.log('✅ 通过: 首次授权给3天'); }}, { name: '邀请记录应该正确保存', fn: () => { console.log('\n【测试5】邀请记录应该正确保存'); const record = { reward_status: 1, reward_type: 'trial_days', reward_value: 3 }; if (record.reward_status !== 1) throw new Error('奖励状态错误'); if (record.reward_type !== 'trial_days') throw new Error('奖励类型错误'); if (record.reward_value !== 3) throw new Error('奖励值错误'); console.log('✅ 通过'); }} ]; let passed = 0; let failed = 0; tests.forEach(test => { try { test.fn(); passed++; } catch (error) { failed++; console.error(`❌ 失败: ${error.message}`); } }); console.log('\n========================================'); console.log('测试完成'); console.log('========================================'); console.log(`通过: ${passed}/${tests.length}`); console.log(`失败: ${failed}/${tests.length}`); console.log('========================================\n'); return failed === 0; } // 如果直接运行此文件,执行测试 if (require.main === module) { const success = runTests(); process.exit(success ? 0 : 1); } module.exports = { runTests };