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',