diff --git a/src/core/login_core/login_core.module.spec.ts b/src/core/login_core/login_core.module.spec.ts index 2d7fb37..23d2c57 100644 --- a/src/core/login_core/login_core.module.spec.ts +++ b/src/core/login_core/login_core.module.spec.ts @@ -1,8 +1,42 @@ +/** + * 登录核心模块测试套件 + * + * 功能描述: + * - 测试LoginCoreModule的模块配置和依赖注入 + * - 验证服务提供者的正确注册和实例化 + * - 确保JWT配置的正确加载和访问 + * - 测试模块导出和依赖关系 + * + * 测试覆盖范围: + * - 模块定义:模块实例化和配置验证 + * - 服务提供者:LoginCoreService和ConfigService的注入 + * - JWT配置:JWT密钥和过期时间的配置访问 + * - 模块依赖:依赖模块的正确导入 + * - 模块导出:服务的正确导出和可用性 + * + * 测试策略: + * - 单元测试:独立测试模块配置 + * - Mock测试:模拟所有外部依赖服务 + * - 配置测试:验证配置项的正确读取 + * + * 依赖模块: + * - Jest: 测试框架和Mock功能 + * - NestJS Testing: 提供测试模块和依赖注入 + * + * 最近修改: + * - 2026-01-15: 代码规范优化 - 清理未使用的导入(UsersService) (修改者: moyin) + * - 2026-01-15: 代码规范优化 - 添加文件头注释 (修改者: moyin) + * + * @author moyin + * @version 1.0.2 + * @since 2025-12-17 + * @lastModified 2026-01-15 + */ + import { Test, TestingModule } from '@nestjs/testing'; import { ConfigService } from '@nestjs/config'; import { JwtService } from '@nestjs/jwt'; import { LoginCoreService } from './login_core.service'; -import { UsersService } from '../db/users/users.service'; import { EmailService } from '../utils/email/email.service'; import { VerificationService } from '../utils/verification/verification.service'; diff --git a/src/core/login_core/login_core.service.ts b/src/core/login_core/login_core.service.ts index ab9ff21..1f8c10b 100644 --- a/src/core/login_core/login_core.service.ts +++ b/src/core/login_core/login_core.service.ts @@ -12,16 +12,16 @@ * - 为business层提供可复用的服务 * * 最近修改: + * - 2026-01-15: 代码规范优化 - 提取手机号查找为私有方法消除重复代码 (修改者: moyin) * - 2026-01-12: 代码规范优化 - 提取魔法数字为常量,拆分过长方法,消除代码重复 (修改者: moyin) * - 2026-01-12: 代码规范优化 - 添加LoginCoreService类注释,完善类职责和方法说明 (修改者: moyin) * - 2026-01-12: 代码规范优化 - 处理TODO项,移除短信发送相关的TODO注释 (修改者: moyin) * - 2025-01-07: 代码规范优化 - 清理未使用的导入(EmailSendResult, crypto) - * - 2025-01-07: 代码规范优化 - 修复常量命名(saltRounds -> SALT_ROUNDS) * * @author moyin - * @version 1.1.0 + * @version 1.1.1 * @since 2025-12-17 - * @lastModified 2026-01-12 + * @lastModified 2026-01-15 */ import { Injectable, UnauthorizedException, ConflictException, NotFoundException, BadRequestException, ForbiddenException, Inject } from '@nestjs/common'; @@ -243,8 +243,7 @@ export class LoginCoreService { // 如果邮箱未找到,尝试手机号查找(简单验证) if (!user && this.isPhoneNumber(identifier)) { - const users = await this.usersService.findAll(); - user = users.find((u: Users) => u.phone === identifier) || null; + user = await this.findUserByPhone(identifier); } // 用户不存在 @@ -340,9 +339,8 @@ export class LoginCoreService { // 检查手机号是否已存在 if (phone) { - const users = await this.usersService.findAll(); - const existingPhone = users.find((u: Users) => u.phone === phone); - if (existingPhone) { + const phoneExists = await this.isPhoneExists(phone); + if (phoneExists) { throw new ConflictException('手机号已存在'); } } @@ -555,8 +553,7 @@ export class LoginCoreService { throw new BadRequestException('邮箱未验证,无法重置密码'); } } else if (this.isPhoneNumber(identifier)) { - const users = await this.usersService.findAll(); - user = users.find((u: Users) => u.phone === identifier) || null; + user = await this.findUserByPhone(identifier); } if (!user) { @@ -616,8 +613,7 @@ export class LoginCoreService { if (this.isEmail(identifier)) { user = await this.usersService.findByEmail(identifier); } else if (this.isPhoneNumber(identifier)) { - const users = await this.usersService.findAll(); - user = users.find((u: Users) => u.phone === identifier) || null; + user = await this.findUserByPhone(identifier); } if (!user) { @@ -847,6 +843,30 @@ export class LoginCoreService { return phoneRegex.test(str.replace(/\s/g, '')); } + /** + * 通过手机号查找用户 + * + * @param phone 手机号 + * @returns 用户信息或null + * @private + */ + private async findUserByPhone(phone: string): Promise { + const users = await this.usersService.findAll(); + return users.find((u: Users) => u.phone === phone) || null; + } + + /** + * 检查手机号是否已存在 + * + * @param phone 手机号 + * @returns 是否存在 + * @private + */ + private async isPhoneExists(phone: string): Promise { + const user = await this.findUserByPhone(phone); + return user !== null; + } + /** * 验证码登录 * @@ -888,8 +908,7 @@ export class LoginCoreService { } } else if (this.isPhoneNumber(identifier)) { // 手机号登录 - const users = await this.usersService.findAll(); - user = users.find((u: Users) => u.phone === identifier) || null; + user = await this.findUserByPhone(identifier); verificationType = VerificationCodeType.SMS_VERIFICATION; } else { throw new BadRequestException('请提供有效的邮箱或手机号'); @@ -964,8 +983,7 @@ export class LoginCoreService { throw new BadRequestException('邮箱未验证,无法使用验证码登录'); } } else if (this.isPhoneNumber(identifier)) { - const users = await this.usersService.findAll(); - user = users.find((u: Users) => u.phone === identifier) || null; + user = await this.findUserByPhone(identifier); verificationType = VerificationCodeType.SMS_VERIFICATION; } else { throw new BadRequestException('请提供有效的邮箱或手机号');