This commit is contained in:
张成
2025-12-19 23:50:39 +08:00
parent 264df638af
commit 6cdc0120d2
2 changed files with 354 additions and 6 deletions

View File

@@ -408,6 +408,7 @@ module.exports = {
const hashedPassword = await hashPassword(password);
// 创建新用户(使用统一的小写邮箱和加密密码)
// 新用户注册赠送3天试用期
const newUser = await pla_account.create({
name: email_normalized.split('@')[0], // 默认使用邮箱用户名作为名称
sn_code: sn_code,
@@ -418,8 +419,8 @@ module.exports = {
keyword: '',
is_enabled: 1,
is_delete: 0,
authorization_date: null,
authorization_days: 0
authorization_date: new Date(), // 新用户从注册日期开始
authorization_days: 3 // 赠送3天试用期
});
// 给邀请人增加3天试用期
@@ -428,19 +429,26 @@ module.exports = {
const currentAuthDate = inviterData.authorization_date;
const currentAuthDays = inviterData.authorization_days || 0;
let newAuthDate = currentAuthDate;
let newAuthDays = currentAuthDays + 3; // 增加3天
let newAuthDate;
let newAuthDays;
// 如果当前没有授权日期,则从今天开始
if (!currentAuthDate) {
newAuthDate = new Date();
newAuthDays = currentAuthDays + 3; // 累加3天
} else {
// 如果当前授权已过期,从今天开始计算
// 检查当前授权是否已过期
const currentEndDate = dayjs(currentAuthDate).add(currentAuthDays, 'day');
const now = dayjs();
if (currentEndDate.isBefore(now)) {
// 授权已过期重新激活并给予3天试用期
newAuthDate = new Date();
newAuthDays = 3; // 重新设置为3天
newAuthDays = 3; // 过期后重新激活给3天
} else {
// 授权未过期在现有基础上累加3天
newAuthDate = currentAuthDate;
newAuthDays = currentAuthDays + 3; // 累加3天
}
}

View File

@@ -0,0 +1,340 @@
/**
* 邀请注册功能测试
* 测试新用户注册试用期和邀请人奖励逻辑
*/
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 };