import { HttpModule } from '@nestjs/axios'; import { getModelToken } from '@nestjs/mongoose'; import { Test, TestingModule } from '@nestjs/testing'; import * as ejs from 'ejs'; import { onlineMediationMockData } from '../../test/mock/data/onlineMediation.mock.data'; import { ConfigurationService } from '../configuration/configuration.service'; import { MailerModule } from '../mailer/mailer.module'; import { MailerService } from '../mailer/mailer.service'; import { OnlineMediationService } from './onlineMediation.service'; jest.mock('ejs'); describe('userRegistryService', () => { let onlineMediationService: OnlineMediationService; const mockOnlineMediationModel = { find: jest.fn(() => mockOnlineMediationModel), create: jest.fn(() => mockOnlineMediationModel), sort: jest.fn(() => mockOnlineMediationModel), exec: jest.fn(() => mockOnlineMediationModel), deleteMany: jest.fn(() => mockOnlineMediationModel), }; const mockMailService = { send: jest.fn(), getTemplateLocation: jest.fn(), loadJsonConfig: jest.fn(), config: { templates: { sosTechEMail: { ejs: 'sosTechEmail.ejs', json: 'sosTechEmail.json', }, }, }, }; const mockConfigService = { isProdConf: jest.fn(), }; const ejsSpy = jest.spyOn(ejs, 'renderFile'); const mailerSpy = jest.spyOn(mockMailService, 'send'); beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ imports: [MailerModule, HttpModule], providers: [ OnlineMediationService, { provide: ConfigurationService, useValue: mockConfigService }, { provide: MailerService, useValue: mockMailService }, { provide: getModelToken('OnlineMediation'), useValue: mockOnlineMediationModel, }, ], }).compile(); onlineMediationService = module.get<OnlineMediationService>(OnlineMediationService); }); it('should be defined', () => { expect(onlineMediationService).toBeDefined(); }); describe('findAll', () => { it('should findAll entries', async () => { mockOnlineMediationModel.exec.mockResolvedValueOnce(onlineMediationMockData); expect(await onlineMediationService.getAll()).toBe(onlineMediationMockData); }); }); describe('create', () => { it('should create an entry', async () => { const res = { accompanimentType: 'RDV Conseiller Numérique', dateSlot: { day: 'Vendredi', hours: '15h00-17h00' }, name: 'test', onlineDemarcheType: ['Démarches Métropolitaines'], phone: '65 65', surname: 'teztrfzegfv', preferredLanguage: 'Français', }; mockOnlineMediationModel.create.mockResolvedValueOnce(res); expect(await onlineMediationService.create(res)).toStrictEqual(res); }); }); describe('sendMailAndResetDb', () => { beforeEach(() => { jest.clearAllMocks(); }); it('should send the mail and reset db', async () => { mockConfigService.isProdConf.mockReturnValueOnce(true); mockOnlineMediationModel.exec.mockResolvedValueOnce(onlineMediationMockData); mockOnlineMediationModel.deleteMany.mockReturnThis(); mockOnlineMediationModel.exec.mockResolvedValueOnce(onlineMediationMockData.length); mockMailService.loadJsonConfig.mockReturnValueOnce({ subject: 'Teste Mail' }); ejsSpy.mockResolvedValueOnce('coucou'); const response = await onlineMediationService.sendMailAndResetDb(); expect(mailerSpy).toHaveBeenCalledTimes(1); expect(response).toBe(onlineMediationMockData.length); }); it('should send the mail and reset db', async () => { mockConfigService.isProdConf.mockReturnValueOnce(false); mockOnlineMediationModel.exec.mockResolvedValueOnce(onlineMediationMockData); mockOnlineMediationModel.deleteMany.mockReturnThis(); mockOnlineMediationModel.exec.mockResolvedValueOnce(onlineMediationMockData.length); const response = await onlineMediationService.sendMailAndResetDb(); expect(mailerSpy).toHaveBeenCalledTimes(0); expect(response).toBe(onlineMediationMockData.length); }); }); });