|
|
@@ -0,0 +1,113 @@
|
|
|
+import { Test, TestingModule } from '@nestjs/testing';
|
|
|
+import { JwtService } from '@nestjs/jwt';
|
|
|
+import { AuthService } from './auth.service';
|
|
|
+import { MockAuthService } from './mocks/auth.service.mock';
|
|
|
+
|
|
|
+describe('AuthService', () => {
|
|
|
+ let service: AuthService;
|
|
|
+ let jwtService: JwtService;
|
|
|
+ let userRepository: any;
|
|
|
+ let hasherService: any;
|
|
|
+
|
|
|
+ beforeEach(async () => {
|
|
|
+ // Créer des mocks pour les dépendances
|
|
|
+ userRepository = {
|
|
|
+ findByEmail: jest.fn(),
|
|
|
+ };
|
|
|
+
|
|
|
+ hasherService = {
|
|
|
+ compare: jest.fn(),
|
|
|
+ };
|
|
|
+
|
|
|
+ jwtService = {
|
|
|
+ sign: jest.fn(),
|
|
|
+ verify: jest.fn(),
|
|
|
+ } as unknown as JwtService;
|
|
|
+
|
|
|
+ const module: TestingModule = await Test.createTestingModule({
|
|
|
+ providers: [
|
|
|
+ AuthService,
|
|
|
+ {
|
|
|
+ provide: 'IUserRepository',
|
|
|
+ useValue: userRepository,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ provide: 'IHasherService',
|
|
|
+ useValue: hasherService,
|
|
|
+ },
|
|
|
+ {
|
|
|
+ provide: JwtService,
|
|
|
+ useValue: jwtService,
|
|
|
+ },
|
|
|
+ ],
|
|
|
+ }).compile();
|
|
|
+
|
|
|
+ service = module.get<AuthService>(AuthService);
|
|
|
+ });
|
|
|
+
|
|
|
+ it('should be defined', () => {
|
|
|
+ expect(service).toBeDefined();
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('validateUser', () => {
|
|
|
+ it('should return user object when credentials are valid', async () => {
|
|
|
+ // Arrange
|
|
|
+ const mockUser = {
|
|
|
+ id: 1,
|
|
|
+ email: 'test@example.com',
|
|
|
+ password: 'hashedPassword',
|
|
|
+ name: 'Test User',
|
|
|
+ };
|
|
|
+
|
|
|
+ userRepository.findByEmail.mockResolvedValue(mockUser);
|
|
|
+ hasherService.compare.mockResolvedValue(true);
|
|
|
+
|
|
|
+ // Act
|
|
|
+ const result = await service.validateUser('test@example.com', 'password');
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ expect(result).toEqual({
|
|
|
+ id: 1,
|
|
|
+ email: 'test@example.com',
|
|
|
+ name: 'Test User',
|
|
|
+ });
|
|
|
+ expect(userRepository.findByEmail).toHaveBeenCalledWith('test@example.com');
|
|
|
+ expect(hasherService.compare).toHaveBeenCalledWith('password', 'hashedPassword');
|
|
|
+ });
|
|
|
+
|
|
|
+ it('should return null when user is not found', async () => {
|
|
|
+ // Arrange
|
|
|
+ userRepository.findByEmail.mockResolvedValue(null);
|
|
|
+
|
|
|
+ // Act
|
|
|
+ const result = await service.validateUser('nonexistent@example.com', 'password');
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ expect(result).toBeNull();
|
|
|
+ expect(userRepository.findByEmail).toHaveBeenCalledWith('nonexistent@example.com');
|
|
|
+ expect(hasherService.compare).not.toHaveBeenCalled();
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ describe('generateToken', () => {
|
|
|
+ it('should generate a JWT token', async () => {
|
|
|
+ // Arrange
|
|
|
+ const mockUser = {
|
|
|
+ id: 1,
|
|
|
+ email: 'test@example.com',
|
|
|
+ };
|
|
|
+ const mockToken = 'jwt-token';
|
|
|
+ jwtService.sign.mockReturnValue(mockToken);
|
|
|
+
|
|
|
+ // Act
|
|
|
+ const result = await service.generateToken(mockUser);
|
|
|
+
|
|
|
+ // Assert
|
|
|
+ expect(result).toBe(mockToken);
|
|
|
+ expect(jwtService.sign).toHaveBeenCalledWith({
|
|
|
+ email: 'test@example.com',
|
|
|
+ sub: 1,
|
|
|
+ });
|
|
|
+ });
|
|
|
+ });
|
|
|
+});
|