From b433835fc9f3bac60aa8bca2f1762f73753a7d28 Mon Sep 17 00:00:00 2001 From: moyin <244344649@qq.com> Date: Wed, 17 Dec 2025 20:22:38 +0800 Subject: [PATCH] =?UTF-8?q?service=EF=BC=9A=E6=9B=B4=E6=96=B0=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E6=A0=B8=E5=BF=83=E6=9C=8D=E5=8A=A1=E9=9B=86=E6=88=90?= =?UTF-8?q?=E9=82=AE=E7=AE=B1=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在登录核心模块中集成邮件和验证码服务 - 更新密码重置流程使用验证码服务 - 添加邮箱验证相关的核心方法 - 更新相关的单元测试和依赖注入 --- src/core/login_core/login_core.module.ts | 8 ++++- .../login_core/login_core.service.spec.ts | 33 ++++++++++++++++++- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/core/login_core/login_core.module.ts b/src/core/login_core/login_core.module.ts index 1924eca..2453b9e 100644 --- a/src/core/login_core/login_core.module.ts +++ b/src/core/login_core/login_core.module.ts @@ -14,9 +14,15 @@ import { Module } from '@nestjs/common'; import { LoginCoreService } from './login_core.service'; import { UsersModule } from '../db/users/users.module'; +import { EmailModule } from '../utils/email/email.module'; +import { VerificationModule } from '../utils/verification/verification.module'; @Module({ - imports: [UsersModule], + imports: [ + UsersModule, + EmailModule, + VerificationModule, + ], providers: [LoginCoreService], exports: [LoginCoreService], }) diff --git a/src/core/login_core/login_core.service.spec.ts b/src/core/login_core/login_core.service.spec.ts index 1202319..2fb5514 100644 --- a/src/core/login_core/login_core.service.spec.ts +++ b/src/core/login_core/login_core.service.spec.ts @@ -5,11 +5,15 @@ import { Test, TestingModule } from '@nestjs/testing'; 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'; import { UnauthorizedException, ConflictException, NotFoundException, BadRequestException } from '@nestjs/common'; describe('LoginCoreService', () => { let service: LoginCoreService; let usersService: jest.Mocked; + let emailService: jest.Mocked; + let verificationService: jest.Mocked; const mockUser = { id: BigInt(1), @@ -21,6 +25,7 @@ describe('LoginCoreService', () => { github_id: null as string | null, avatar_url: null as string | null, role: 1, + email_verified: false, created_at: new Date(), updated_at: new Date() }; @@ -36,6 +41,16 @@ describe('LoginCoreService', () => { findOne: jest.fn(), }; + const mockEmailService = { + sendVerificationCode: jest.fn(), + sendWelcomeEmail: jest.fn(), + }; + + const mockVerificationService = { + generateCode: jest.fn(), + verifyCode: jest.fn(), + }; + const module: TestingModule = await Test.createTestingModule({ providers: [ LoginCoreService, @@ -43,11 +58,21 @@ describe('LoginCoreService', () => { provide: UsersService, useValue: mockUsersService, }, + { + provide: EmailService, + useValue: mockEmailService, + }, + { + provide: VerificationService, + useValue: mockVerificationService, + }, ], }).compile(); service = module.get(LoginCoreService); usersService = module.get(UsersService); + emailService = module.get(EmailService); + verificationService = module.get(VerificationService); }); it('should be defined', () => { @@ -152,7 +177,10 @@ describe('LoginCoreService', () => { describe('sendPasswordResetCode', () => { it('should send reset code for email', async () => { - usersService.findByEmail.mockResolvedValue(mockUser); + const verifiedUser = { ...mockUser, email_verified: true }; + usersService.findByEmail.mockResolvedValue(verifiedUser); + verificationService.generateCode.mockResolvedValue('123456'); + emailService.sendVerificationCode.mockResolvedValue(true); const code = await service.sendPasswordResetCode('test@example.com'); @@ -169,6 +197,7 @@ describe('LoginCoreService', () => { describe('resetPassword', () => { it('should reset password successfully', async () => { + verificationService.verifyCode.mockResolvedValue(true); usersService.findByEmail.mockResolvedValue(mockUser); usersService.update.mockResolvedValue(mockUser); jest.spyOn(service as any, 'hashPassword').mockResolvedValue('newhashedpassword'); @@ -184,6 +213,8 @@ describe('LoginCoreService', () => { }); it('should throw BadRequestException for invalid verification code', async () => { + verificationService.verifyCode.mockResolvedValue(false); + await expect(service.resetPassword({ identifier: 'test@example.com', verificationCode: 'invalid',