diff --git a/src/categories/services/categories.service.spec.ts b/src/categories/services/categories.service.spec.ts index 065e66e4bbd12a8b0774cc9a7180f66ec9a337d2..125760f11ae8bc904623916b72cbaa18d758912c 100644 --- a/src/categories/services/categories.service.spec.ts +++ b/src/categories/services/categories.service.spec.ts @@ -39,7 +39,8 @@ describe('CategoriesService', () => { { id: 'categoryId', theme: 'Public', name: 'test', modules: [{ id: 'Test', name: 'Text du test' }] }, { id: 'categoryId', theme: 'Public', name: 'test2', modules: [{ id: 'Test2', name: 'Text du test test 2' }] }, ]; - mockCategoriesModel.find.mockResolvedValueOnce(data); + mockCategoriesModel.find.mockReturnThis(); + mockCategoriesModel.exec.mockResolvedValueOnce(data); expect(await service.findAll()).toEqual(data); }); it('should findOneComplete structures', async () => { diff --git a/src/categories/services/categories.service.ts b/src/categories/services/categories.service.ts index e411dc53174efc122f95b1841cab9f3e9fd72c4c..0cec6afbf3c07bf31fdb50eaff3e1937b6b84a09 100644 --- a/src/categories/services/categories.service.ts +++ b/src/categories/services/categories.service.ts @@ -17,7 +17,7 @@ export class CategoriesService { public async findAll(): Promise<Categories[]> { this.logger.debug(`findAll`); - return this.categoriesModel.find(); + return this.categoriesModel.find().exec(); } public findOneComplete(categoryId: string): Promise<Categories> { @@ -57,7 +57,7 @@ export class CategoriesService { }); } - await this.categoriesModel.updateOne({ id: 'ctm' }, [{ $set: newDocCTM }], { upsert: true }); + await this.categoriesModel.updateOne({ id: 'ctm' }, [{ $set: newDocCTM }], { upsert: true }).exec(); return newDocCTM; } } diff --git a/src/newsletter/newsletter.service.spec.ts b/src/newsletter/newsletter.service.spec.ts index 60c91fd90203b6e8ecb7172ef76e38c8dc179a7b..88b588dd5b158a12cffff59f86bf8a2c378545a1 100644 --- a/src/newsletter/newsletter.service.spec.ts +++ b/src/newsletter/newsletter.service.spec.ts @@ -115,6 +115,8 @@ describe('NewsletterService', () => { describe('newsletterUnsubscribe', () => { it('it should not remove subscription for email test@test.com : does not exist', async () => { mailchimp.lists.getListMember.mockRejectedValueOnce({ status: 404 }); + mockNewsletterModel.findOne.mockReturnThis(); + mockNewsletterModel.exec.mockResolvedValueOnce(undefined); try { await service.newsletterUnsubscribe('test@test.com'); // Fail test if above expression doesn't throw anything. @@ -143,13 +145,15 @@ describe('NewsletterService', () => { describe('findOne', () => { it('it should not find a subscription with email test@test.com', async () => { - mockNewsletterModel.findOne.mockResolvedValueOnce(undefined); + mockNewsletterModel.findOne.mockReturnThis(); + mockNewsletterModel.exec.mockResolvedValueOnce(undefined); const findOneEmail = await service.findOne('test@test.com'); expect(findOneEmail).toEqual(undefined); }); it('it should find a subscription with email test2@test.com', async () => { const _doc = { _id: 'a1aaaaa1a1', email: 'test2@test.com' } as INewsletterSubscription; - mockNewsletterModel.findOne.mockResolvedValueOnce(_doc); + mockNewsletterModel.findOne.mockReturnThis(); + mockNewsletterModel.exec.mockResolvedValueOnce(_doc); const findOneEmail = await service.findOne('test2@test.com'); expect(findOneEmail).toEqual(_doc); }); @@ -157,7 +161,8 @@ describe('NewsletterService', () => { describe('findAll', () => { it('it should find all', async () => { const _docs = [{ _id: 'a1aaaaa1a1', email: 'test2@test.com' } as INewsletterSubscription]; - mockNewsletterModel.find.mockResolvedValueOnce(_docs); + mockNewsletterModel.find.mockReturnThis(); + mockNewsletterModel.exec.mockResolvedValueOnce(_docs); const findOneEmail = await service.findAll(); expect(findOneEmail).toEqual(_docs); }); diff --git a/src/newsletter/newsletter.service.ts b/src/newsletter/newsletter.service.ts index c6f2e752c14288f078c33e830caebfcb9b53402c..4d44ac9441880c1978cf9219fde5b899f551b72c 100644 --- a/src/newsletter/newsletter.service.ts +++ b/src/newsletter/newsletter.service.ts @@ -104,11 +104,11 @@ export class NewsletterService { public async findOne(mail: string): Promise<INewsletterSubscription | undefined> { this.logger.debug('findOne'); - return this.newsletterSubscriptionModel.findOne({ email: mail }); + return this.newsletterSubscriptionModel.findOne({ email: mail }).exec(); } public async findAll(): Promise<NewsletterSubscription[]> { this.logger.debug('findAll'); - return this.newsletterSubscriptionModel.find(); + return this.newsletterSubscriptionModel.find().exec(); } } diff --git a/src/online-mediation/onlineMediation.service.spec.ts b/src/online-mediation/onlineMediation.service.spec.ts index eff0f8dd3f411d335adc3dfc8392ff119d6dd2de..d1a530a8266564237375c6b4e22b75c5865d28f7 100644 --- a/src/online-mediation/onlineMediation.service.spec.ts +++ b/src/online-mediation/onlineMediation.service.spec.ts @@ -86,7 +86,8 @@ describe('userRegistryService', () => { it('should send the mail and reset db', async () => { mockConfigService.isProdConf.mockReturnValueOnce(true); mockOnlineMediationModel.exec.mockResolvedValueOnce(onlineMediationMockData); - mockOnlineMediationModel.deleteMany.mockResolvedValueOnce(onlineMediationMockData.length); + mockOnlineMediationModel.deleteMany.mockReturnThis(); + mockOnlineMediationModel.exec.mockResolvedValueOnce(onlineMediationMockData.length); mockMailService.loadJsonConfig.mockReturnValueOnce({ subject: 'Teste Mail' }); ejsSpy.mockResolvedValueOnce('coucou'); const response = await service.sendMailAndResetDb(); @@ -96,7 +97,8 @@ describe('userRegistryService', () => { it('should send the mail and reset db', async () => { mockConfigService.isProdConf.mockReturnValueOnce(false); mockOnlineMediationModel.exec.mockResolvedValueOnce(onlineMediationMockData); - mockOnlineMediationModel.deleteMany.mockResolvedValueOnce(onlineMediationMockData.length); + mockOnlineMediationModel.deleteMany.mockReturnThis(); + mockOnlineMediationModel.exec.mockResolvedValueOnce(onlineMediationMockData.length); const response = await service.sendMailAndResetDb(); expect(mailerSpy).toHaveBeenCalledTimes(0); expect(response).toBe(onlineMediationMockData.length); diff --git a/src/online-mediation/onlineMediation.service.ts b/src/online-mediation/onlineMediation.service.ts index 8341c348d86fb1164d0c609a0d99d31d308bafee..ae44246a535041ec0b394d6936ed8bebab4f5866 100644 --- a/src/online-mediation/onlineMediation.service.ts +++ b/src/online-mediation/onlineMediation.service.ts @@ -61,7 +61,7 @@ export class OnlineMediationService { } //reset docs this.logger.debug('deletedocs'); - return this.OnlineMediationModel.deleteMany({ _id: { $in: docs.map((doc) => doc._id) } }); + return this.OnlineMediationModel.deleteMany({ _id: { $in: docs.map((doc) => doc._id) } }).exec(); } } } diff --git a/src/parameters/parameters.service.spec.ts b/src/parameters/parameters.service.spec.ts index fc5df4eda2443d363a368c2754105daf8ff45f51..aba665562985592bcc1560c89a00e9d647d7c7c5 100644 --- a/src/parameters/parameters.service.spec.ts +++ b/src/parameters/parameters.service.spec.ts @@ -9,6 +9,7 @@ describe('ParametersService', () => { const parametersModelMock = { findOne: jest.fn(), + exec: jest.fn(), }; beforeEach(async () => { @@ -35,7 +36,8 @@ describe('ParametersService', () => { describe('getParameters', () => { it('should get parameters', async () => { const spyer = jest.spyOn(parametersModelMock, 'findOne'); - parametersModelMock.findOne.mockResolvedValueOnce({ lockdownInfoDisplay: false }); + parametersModelMock.findOne.mockReturnThis(); + parametersModelMock.exec.mockResolvedValueOnce({ lockdownInfoDisplay: false }); const result = await service.getParameters(); expect(spyer).toBeCalledTimes(1); @@ -44,7 +46,8 @@ describe('ParametersService', () => { it('should throw error because parameters was not found', async () => { const spyer = jest.spyOn(parametersModelMock, 'findOne'); - parametersModelMock.findOne.mockResolvedValueOnce(null); + parametersModelMock.findOne.mockReturnThis(); + parametersModelMock.exec.mockResolvedValueOnce(null); try { await service.getParameters(); @@ -60,7 +63,8 @@ describe('ParametersService', () => { describe('setParameters', () => { it('should set parameters', async () => { const spyer = jest.spyOn(parametersModelMock, 'findOne'); - parametersModelMock.findOne.mockResolvedValueOnce({ lockdownInfoDisplay: false, save: jest.fn() }); + parametersModelMock.findOne.mockReturnThis(); + parametersModelMock.exec.mockResolvedValueOnce({ lockdownInfoDisplay: false, save: jest.fn() }); const result = await service.setParameterLockdownInfoDisplay(true); expect(spyer).toBeCalledTimes(1); @@ -69,7 +73,8 @@ describe('ParametersService', () => { it('should throw error because parameters was not found', async () => { const spyer = jest.spyOn(parametersModelMock, 'findOne'); - parametersModelMock.findOne.mockResolvedValueOnce(null); + parametersModelMock.findOne.mockReturnThis(); + parametersModelMock.exec.mockResolvedValueOnce(null); try { await service.setParameterLockdownInfoDisplay(true); diff --git a/src/parameters/parameters.service.ts b/src/parameters/parameters.service.ts index 671066506308233fdac87e9b373363439d7c3784..634b4f4b509620f888ff26b33f9f59d6496abc64 100644 --- a/src/parameters/parameters.service.ts +++ b/src/parameters/parameters.service.ts @@ -9,7 +9,7 @@ export class ParametersService { constructor(@InjectModel(Parameters.name) private parametersModel: Model<IParameters>) {} public async getParameters(): Promise<Parameters> { - const parameters = await this.parametersModel.findOne(); + const parameters = await this.parametersModel.findOne().exec(); if (!parameters) { throw new HttpException('Parameters not found', HttpStatus.NOT_FOUND); } @@ -17,7 +17,7 @@ export class ParametersService { } public async setParameterLockdownInfoDisplay(lockdownInfoDisplay: boolean): Promise<Parameters> { - const parameters = await this.parametersModel.findOne(); + const parameters = await this.parametersModel.findOne().exec(); if (!parameters) { throw new HttpException('Parameters not found', HttpStatus.NOT_FOUND); } diff --git a/src/structures/services/structures.service.ts b/src/structures/services/structures.service.ts index 9d5af0f27b38dd672f6e79c1ea127b02237995a9..76dd53860967e36d47d862218055e586fb652e6e 100644 --- a/src/structures/services/structures.service.ts +++ b/src/structures/services/structures.service.ts @@ -776,9 +776,11 @@ export class StructuresService { structures.forEach((structure) => { if (structureIds.includes(structure.id)) { this.logger.debug(`cancel structure soft-delete : ${structure.structureName} (${structure._id})`); - this.structureModel.findByIdAndUpdate(new Types.ObjectId(structure.id), { - toBeDeletedAt: null, - }); + this.structureModel + .findByIdAndUpdate(new Types.ObjectId(structure.id), { + toBeDeletedAt: null, + }) + .exec(); } else { this.deleteOne(structure); } diff --git a/src/structures/structure-type/structure-type.service.ts b/src/structures/structure-type/structure-type.service.ts index ed7bb7d005ea64e899a0a60b23a5c73820d8d141..59a0b05ac7a7c8c5a08f7b6e80002b6cb334736f 100644 --- a/src/structures/structure-type/structure-type.service.ts +++ b/src/structures/structure-type/structure-type.service.ts @@ -12,10 +12,10 @@ export class StructureTypeService { } public async find(id: string): Promise<StructureTypeDocument> { - return this.structureTypeModel.findOne({ _id: id }); + return this.structureTypeModel.findOne({ _id: id }).exec(); } public async findByValue(value: string): Promise<StructureTypeDocument> { - return this.structureTypeModel.findOne({ value: value }); + return this.structureTypeModel.findOne({ value: value }).exec(); } } diff --git a/src/tcl/tclStopPoint.service.ts b/src/tcl/tclStopPoint.service.ts index 30b8fcdf0ef22840841f3feda232220fa6d29da5..ae1967c6eaaabe5d6ffec3258bd14199ddeb7474 100644 --- a/src/tcl/tclStopPoint.service.ts +++ b/src/tcl/tclStopPoint.service.ts @@ -35,10 +35,8 @@ export class TclStopPointService { this.logger.debug('updateStopPoints'); await this.getUpdatedData(); const newStopPoints = await this.processReceivedStopPoints(this.receivedStopPoints); - - this.tclStopPointModel.deleteMany({}, () => { - this.tclStopPointModel.insertMany(newStopPoints); - }); + await this.tclStopPointModel.deleteMany({}).exec(); + await this.tclStopPointModel.insertMany(newStopPoints); } /** diff --git a/src/temp-user/temp-user.service.spec.ts b/src/temp-user/temp-user.service.spec.ts index 141391ea3b2c78f0d2a0bdb9e08b880a60a0ffa3..458b7c32fcf911d9c2aeea16d56c82dd016ad16b 100644 --- a/src/temp-user/temp-user.service.spec.ts +++ b/src/temp-user/temp-user.service.spec.ts @@ -40,7 +40,8 @@ describe('TempUserService', () => { describe('create', () => { const tmpUser = { email: 'test@test.com', pendingStructuresLink: [] }; it('should not create temporary user: already exist', async () => { - tempUserModelMock.findOne.mockResolvedValueOnce(tmpUser); + tempUserModelMock.findOne.mockReturnThis(); + tempUserModelMock.exec.mockResolvedValueOnce(tmpUser); try { await service.create(tmpUser, 'PIMMS Framboise'); expect(true).toBe(false); @@ -50,32 +51,38 @@ describe('TempUserService', () => { } }); it('should create temporary user', async () => { - tempUserModelMock.findOne.mockResolvedValueOnce(null).mockResolvedValueOnce(tmpUser); + tempUserModelMock.findOne.mockReturnThis(); + tempUserModelMock.exec.mockResolvedValueOnce(null).mockResolvedValueOnce(tmpUser); tempUserModelMock.create.mockResolvedValueOnce(tmpUser); expect(await service.create(tmpUser, 'PIMMS Framboise')).toEqual(tmpUser); }); }); it('should find one', async () => { const tmpUser = { email: 'test2@test.com', pendingStructuresLink: [] }; - tempUserModelMock.findOne.mockResolvedValueOnce(tmpUser); + tempUserModelMock.findOne.mockReturnThis(); + tempUserModelMock.exec.mockResolvedValueOnce(tmpUser); expect(await service.findOne('test2@test.com')).toEqual(tmpUser); }); it('should find one by id', async () => { const tmpUser = { email: 'test2@test.com', pendingStructuresLink: [] }; - tempUserModelMock.findById.mockResolvedValueOnce(tmpUser); + tempUserModelMock.findById.mockReturnThis(); + tempUserModelMock.exec.mockResolvedValueOnce(tmpUser); expect(await service.findById('5fbb92e480a5c257dc0161f0')).toEqual(tmpUser); }); describe('delete', () => { it('should delete a temp user', async () => { const tmpUser = { email: 'test2@test.com', pendingStructuresLink: [] }; - tempUserModelMock.findOne.mockResolvedValueOnce(tmpUser); - tempUserModelMock.deleteOne.mockImplementationOnce(() => ({})); + tempUserModelMock.findOne.mockReturnThis(); + tempUserModelMock.exec.mockResolvedValueOnce(tmpUser); + tempUserModelMock.deleteOne.mockReturnThis(); + tempUserModelMock.exec.mockImplementationOnce(() => ({})); expect(await service.delete('toto@test.com')).toEqual(tmpUser); }); it('should return an error : user does not exist', async () => { - tempUserModelMock.findOne.mockResolvedValueOnce(null); + tempUserModelMock.findOne.mockReturnThis(); + tempUserModelMock.exec.mockResolvedValueOnce(null); try { await service.delete('toto@test.com'); expect(true).toBe(false); diff --git a/src/temp-user/temp-user.service.ts b/src/temp-user/temp-user.service.ts index e43f10fd0691dc8394f16f85a27fe6d50e659178..0059bb434618a5d66cf5a3d9f06867b13e00502a 100644 --- a/src/temp-user/temp-user.service.ts +++ b/src/temp-user/temp-user.service.ts @@ -30,11 +30,11 @@ export class TempUserService { } public async findOne(mail: string): Promise<ITempUser> { - return this.tempUserModel.findOne({ email: mail }); + return this.tempUserModel.findOne({ email: mail }).exec(); } public async findById(id: string): Promise<TempUser> { - return this.tempUserModel.findById(new Types.ObjectId(id)); + return this.tempUserModel.findById(new Types.ObjectId(id)).exec(); } public async delete(mail: string): Promise<TempUser> { @@ -42,7 +42,7 @@ export class TempUserService { if (!userInDb) { throw new HttpException('User does not exists', HttpStatus.BAD_REQUEST); } - await this.tempUserModel.deleteOne({ email: mail }); + await this.tempUserModel.deleteOne({ email: mail }).exec(); return userInDb; } diff --git a/src/users/services/employer.service.spec.ts b/src/users/services/employer.service.spec.ts index 456ac964c30996f475a09c98772187b7ad4de867..ee6e05392aeee2cdbe9ca6bcd9b04d04d70aabc4 100644 --- a/src/users/services/employer.service.spec.ts +++ b/src/users/services/employer.service.spec.ts @@ -31,6 +31,7 @@ describe('EmployerService', () => { deleteOne: jest.fn(), find: jest.fn(() => mockEmployerModel), sort: jest.fn(() => mockEmployerModel), + exec: jest.fn(), }; const mockUserService = { replaceEmployers: jest.fn(), @@ -69,7 +70,8 @@ describe('EmployerService', () => { }); it('findAll', async () => { - mockEmployerModel.sort.mockResolvedValueOnce([ + mockEmployerModel.sort.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce([ { _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'Metro', @@ -85,7 +87,8 @@ describe('EmployerService', () => { expect(reply.length).toBe(2); }); it('findOne', async () => { - mockEmployerModel.findById.mockResolvedValueOnce({ + mockEmployerModel.findById.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce({ _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'Sopra', validated: true, @@ -94,7 +97,8 @@ describe('EmployerService', () => { expect(reply).toBeTruthy(); }); it('findAllValidated', async () => { - mockEmployerModel.find.mockResolvedValueOnce([ + mockEmployerModel.find.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce([ { _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'Sopra', @@ -106,7 +110,8 @@ describe('EmployerService', () => { }); it('findAllUnvalidated', async () => { - mockEmployerModel.find.mockResolvedValueOnce([ + mockEmployerModel.find.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce([ { _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'Sopra', @@ -118,7 +123,8 @@ describe('EmployerService', () => { }); it('finds all unvalidated employers', async () => { - mockEmployerModel.find.mockResolvedValueOnce([ + mockEmployerModel.find.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce([ { _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'Metro', @@ -130,7 +136,8 @@ describe('EmployerService', () => { }); it('finds all validated employers', async () => { - mockEmployerModel.find.mockResolvedValueOnce([ + mockEmployerModel.find.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce([ { _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'Metro', @@ -147,7 +154,8 @@ describe('EmployerService', () => { }); it('findByName', async () => { - mockEmployerModel.findOne.mockResolvedValue({ + mockEmployerModel.findOne.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce({ _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'Sopra', validated: true, @@ -163,7 +171,8 @@ describe('EmployerService', () => { name: 'Sopra', validated: false, }); - mockEmployerModel.findOne.mockResolvedValue({ + mockEmployerModel.findOne.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce({ _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'Sopra', validated: false, @@ -183,7 +192,8 @@ describe('EmployerService', () => { name: 'Sopra', validated: false, }); - mockEmployerModel.findOne.mockResolvedValue({ + mockEmployerModel.findOne.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce({ _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'Sopra', validated: false, @@ -197,12 +207,14 @@ describe('EmployerService', () => { }); it('delete', async () => { - mockEmployerModel.findOne.mockResolvedValueOnce({ + mockEmployerModel.findOne.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce({ _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'Sopra', validated: true, }); - mockEmployerModel.deleteOne.mockResolvedValueOnce({ + mockEmployerModel.deleteOne.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce({ n: 1, ok: 1, deletedCount: 1, @@ -222,7 +234,8 @@ describe('EmployerService', () => { it('initEmployerIndex', async () => { mockEmployerSearchService.dropIndex.mockResolvedValueOnce({}); mockEmployerSearchService.createEmployerIndex.mockResolvedValueOnce({}); - mockEmployerModel.sort.mockResolvedValueOnce([ + mockEmployerModel.sort.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce([ { _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'Metro', @@ -258,7 +271,8 @@ describe('EmployerService', () => { name: 'Metro', validated: true, }; - mockEmployerModel.findById + mockEmployerModel.findById.mockReturnThis(); + mockEmployerModel.exec .mockResolvedValueOnce({ _id: new Types.ObjectId('623aed68c5d45b6fbbaa7e60'), name: 'Sopra', @@ -283,7 +297,8 @@ describe('EmployerService', () => { name: 'Metro', validated: true, }; - mockEmployerModel.findById.mockResolvedValueOnce(null).mockResolvedValueOnce(result); + mockEmployerModel.findById.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce(null).mockResolvedValueOnce(result); jest.spyOn(service, 'deleteInvalidEmployer').mockRejectedValueOnce({}); mockUserService.replaceEmployers.mockResolvedValueOnce(null); try { @@ -345,7 +360,8 @@ describe('EmployerService', () => { describe('validate', () => { it('should validate employer', async () => { - mockEmployerModel.findById.mockResolvedValueOnce({ + mockEmployerModel.findById.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce({ _id: new Types.ObjectId('623aed68c5d45b6fbbaa7e60'), name: 'Sopra', validated: false, @@ -355,7 +371,8 @@ describe('EmployerService', () => { expect(employer.validated).toBe(true); }); it('should throw exception', async () => { - mockEmployerModel.findById.mockResolvedValueOnce(null); + mockEmployerModel.findById.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce(null); try { await service.validate('623aed68c5d45b6fbbaa7e60'); expect(true).toBe(false); @@ -368,7 +385,8 @@ describe('EmployerService', () => { describe('update', () => { it('should update employer', async () => { - mockEmployerModel.findById.mockResolvedValueOnce({ + mockEmployerModel.findById.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce({ _id: new Types.ObjectId('623aed68c5d45b6fbbaa7e60'), name: 'Sopraaa', validated: false, @@ -378,7 +396,8 @@ describe('EmployerService', () => { expect(employer.name).toBe('Sopra'); }); it('should throw exception', async () => { - mockEmployerModel.findById.mockResolvedValueOnce(null); + mockEmployerModel.findById.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce(null); try { await service.update('623aed68c5d45b6fbbaa7e60', { name: 'Sopra' }); expect(true).toBe(false); @@ -391,14 +410,16 @@ describe('EmployerService', () => { describe('deleteInvalidEmployer', () => { it('should delete invalid employer', async () => { - mockEmployerModel.findById.mockResolvedValueOnce({ + mockEmployerModel.findById.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce({ _id: new Types.ObjectId('623aed68c5d45b6fbbaa7e60'), name: 'Sopra', validated: false, save: jest.fn().mockResolvedValueOnce(null), }); mockEmployerSearchService.deleteIndex.mockResolvedValueOnce(null); - mockEmployerModel.deleteOne.mockResolvedValueOnce({ + mockEmployerModel.deleteOne.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce({ _id: new Types.ObjectId('623aed68c5d45b6fbbaa7e60'), name: 'Sopra', validated: false, @@ -412,7 +433,8 @@ describe('EmployerService', () => { describe('deleteOneId', () => { it('should delete ', async () => { - mockEmployerModel.findOne.mockResolvedValueOnce({ + mockEmployerModel.findOne.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce({ _id: '6231aefe76598527c8d0b5bc', validationToken: 'cf1c74c22cedb6b575945098db42d2f493fb759c9142c6aff7980f252886f36ee086574ee99a06bc99119079257116c959c8ec870949cebdef2b293666dbca42', @@ -450,7 +472,8 @@ describe('EmployerService', () => { }); }); it('should throw an error ', async () => { - mockEmployerModel.findOne.mockResolvedValueOnce(null); + mockEmployerModel.findOne.mockReturnThis(); + mockEmployerModel.exec.mockResolvedValueOnce(null); try { expect(await service.deleteOneId('6231aefe76598527c8d0b5bc')).toStrictEqual({ diff --git a/src/users/services/employer.service.ts b/src/users/services/employer.service.ts index 991cda54d791657ae592a6831f34e9b26a9142c2..e3806bf1e672192eaeebc4714dc5d7dc7fbc7b94 100644 --- a/src/users/services/employer.service.ts +++ b/src/users/services/employer.service.ts @@ -24,27 +24,27 @@ export class EmployerService { public async findAll(): Promise<Employer[]> { this.logger.debug('findAll'); - return this.employerModel.find().sort({ name: 1 }); + return this.employerModel.find().sort({ name: 1 }).exec(); } public async findOne(idParam: string): Promise<EmployerDocument> { this.logger.debug('findOne'); - return this.employerModel.findById(new Types.ObjectId(idParam)); + return this.employerModel.findById(new Types.ObjectId(idParam)).exec(); } public async findAllUnvalidated(): Promise<Employer[]> { this.logger.debug('findAllUnvalidated'); - return this.employerModel.find({ validated: false }); + return this.employerModel.find({ validated: false }).exec(); } public async findAllValidated(): Promise<IEmployer[]> { this.logger.debug(`findAllValidated`); - return this.employerModel.find({ validated: true }); + return this.employerModel.find({ validated: true }).exec(); } public async findByName(name: string): Promise<EmployerDocument> { this.logger.debug('findByName'); - return this.employerModel.findOne({ name }); + return this.employerModel.findOne({ name }).exec(); } public async create(employer: CreateEmployerDto, validated = false, sendAdminNotification = true): Promise<Employer> { @@ -82,7 +82,7 @@ export class EmployerService { public async validate(employerId: string): Promise<Employer> { this.logger.debug(`validateEmployer: ${employerId}`); - const employer = await this.employerModel.findById(new Types.ObjectId(employerId)); + const employer = await this.employerModel.findById(new Types.ObjectId(employerId)).exec(); if (employer) { employer.validated = true; employer.save(); @@ -94,7 +94,7 @@ export class EmployerService { public async update(employerId: string, newEmployer: CreateEmployerDto): Promise<Employer> { this.logger.debug(`editEmployer: ${employerId}`); - const employer = await this.employerModel.findById(new Types.ObjectId(employerId)); + const employer = await this.employerModel.findById(new Types.ObjectId(employerId)).exec(); if (employer) { employer.name = newEmployer.name; employer.save(); @@ -109,8 +109,8 @@ export class EmployerService { targetEmployerId, }: MergeEmployerDto): Promise<Employer | HttpException> { this.logger.debug(`mergeEmployer: ${sourceEmployerId} into ${targetEmployerId}`); - const sourceEmployer = await this.employerModel.findById(new Types.ObjectId(sourceEmployerId)); - const targetEmployer = await this.employerModel.findById(new Types.ObjectId(targetEmployerId)); + const sourceEmployer = await this.employerModel.findById(new Types.ObjectId(sourceEmployerId)).exec(); + const targetEmployer = await this.employerModel.findById(new Types.ObjectId(targetEmployerId)).exec(); if (targetEmployer && sourceEmployer) { await this.userService.replaceEmployers(sourceEmployer, targetEmployer); if (!sourceEmployer.validated) { @@ -124,13 +124,13 @@ export class EmployerService { public async deleteInvalidEmployer(id: string): Promise<mongodb.DeleteResult> { this.logger.debug(`deleteInvalidEmployer: ${id}`); - const document = await this.employerModel.findById(new Types.ObjectId(id)); + const document = await this.employerModel.findById(new Types.ObjectId(id)).exec(); this.employerSearchService.deleteIndex(document, document._id); - return this.employerModel.deleteOne({ _id: id }); + return this.employerModel.deleteOne({ _id: id }).exec(); } public async deleteOneId(id: string): Promise<Employer> { - const employer = await this.employerModel.findOne({ _id: id }); + const employer = await this.employerModel.findOne({ _id: id }).exec(); if (!employer) { throw new HttpException('Invalid employer id', HttpStatus.BAD_REQUEST); } @@ -141,7 +141,7 @@ export class EmployerService { this.logger.debug(`deleteByname: ${name}`); const document = await this.findByName(name); this.employerSearchService.deleteIndex(document, document._id); - return this.employerModel.deleteOne({ name }); + return this.employerModel.deleteOne({ name }).exec(); } // SEARCH diff --git a/src/users/services/jobs.service.spec.ts b/src/users/services/jobs.service.spec.ts index fe36c9fb8ecdba05aee9448ae92ef79aa92e7216..9d53daca0de9d26aa775d9942959dee707606fa1 100644 --- a/src/users/services/jobs.service.spec.ts +++ b/src/users/services/jobs.service.spec.ts @@ -24,10 +24,10 @@ describe('JobsService', () => { populate: jest.fn().mockReturnThis(), collation: jest.fn().mockReturnThis(), sort: jest.fn().mockReturnThis(), - exec: jest.fn().mockReturnThis(), - findOne: jest.fn(), - findById: jest.fn(), - deleteOne: jest.fn(), + exec: jest.fn(), + findOne: jest.fn().mockReturnThis(), + findById: jest.fn().mockReturnThis(), + deleteOne: jest.fn().mockReturnThis(), }; const mockJobsGroupModel = { @@ -109,7 +109,7 @@ describe('JobsService', () => { }); it('findUnvalidated', async () => { - mockJobModel.find.mockResolvedValue([ + mockJobModel.exec.mockResolvedValueOnce([ { _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'CNFS', @@ -123,7 +123,7 @@ describe('JobsService', () => { }); it('findByName', async () => { - mockJobModel.findOne.mockResolvedValue({ + mockJobModel.exec.mockResolvedValueOnce({ _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'CNFS', validated: true, @@ -134,7 +134,7 @@ describe('JobsService', () => { expect(reply).toBeTruthy(); }); it('findOne', async () => { - mockJobModel.findById.mockResolvedValue({ + mockJobModel.exec.mockResolvedValueOnce({ _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'CNFS', validated: true, @@ -147,7 +147,7 @@ describe('JobsService', () => { describe('createJob', () => { it('create', async () => { - mockJobModel.create.mockResolvedValue({ + mockJobModel.create.mockResolvedValueOnce({ _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'Dev', validated: false, @@ -198,7 +198,7 @@ describe('JobsService', () => { }); it('createFromAdmin', async () => { - mockJobModel.create.mockResolvedValue({ + mockJobModel.create.mockResolvedValueOnce({ _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'Dev', validated: true, @@ -271,7 +271,7 @@ describe('JobsService', () => { describe('validate', () => { it('should validate job', async () => { - mockJobModel.findById.mockResolvedValueOnce({ + mockJobModel.exec.mockResolvedValueOnce({ _id: new Types.ObjectId('623aed68c5d45b6fbbaa7e60'), name: 'Dev', validated: false, @@ -281,7 +281,7 @@ describe('JobsService', () => { expect(job.validated).toBe(true); }); it('should throw exception', async () => { - mockJobModel.findById.mockResolvedValueOnce(null); + mockJobModel.exec.mockResolvedValueOnce(null); try { await service.validate('623aed68c5d45b6fbbaa7e60'); expect(true).toBe(false); @@ -301,7 +301,7 @@ describe('JobsService', () => { hasPersonalOffer: false, jobsGroup: null, }; - mockJobModel.findById + mockJobModel.exec .mockResolvedValueOnce({ _id: new Types.ObjectId('623aed68c5d45b6fbbaa7e60'), name: 'Dev', @@ -322,7 +322,7 @@ describe('JobsService', () => { } }); it('should throw error if target job is not validated', async () => { - mockJobModel.findById + mockJobModel.exec .mockResolvedValueOnce({ _id: new Types.ObjectId('623aed68c5d45b6fbbaa7e60'), name: 'Dev', @@ -340,7 +340,7 @@ describe('JobsService', () => { } }); it('should throw error if no source or target job', async () => { - mockJobModel.findById.mockResolvedValueOnce(null).mockResolvedValueOnce({ + mockJobModel.exec.mockResolvedValueOnce(null).mockResolvedValueOnce({ _id: new Types.ObjectId('623aed68c5d45b6fbbaa7e60'), name: 'Dev', validated: false, @@ -358,7 +358,7 @@ describe('JobsService', () => { }); it('deleteInvalidJob', async () => { - mockJobModel.deleteOne.mockResolvedValueOnce(null); + mockJobModel.exec.mockResolvedValueOnce(null); const spyer = jest.spyOn(service, 'deleteInvalidJob'); await service.deleteInvalidJob('623aed68c5d45b6fbbaa7e60'); expect(spyer.mock.calls.length).toEqual(1); @@ -366,7 +366,7 @@ describe('JobsService', () => { describe('deleteOneId', () => { it('should delete ', async () => { - mockJobModel.findOne.mockResolvedValueOnce({ + mockJobModel.exec.mockResolvedValueOnce({ _id: new Types.ObjectId('623aed68c5d45b6fbbaa7e60'), name: 'Dev', validated: false, @@ -376,7 +376,7 @@ describe('JobsService', () => { expect(reply).toBe('toto'); }); it('should delete ', async () => { - mockJobModel.findOne.mockResolvedValueOnce(null); + mockJobModel.exec.mockResolvedValueOnce(null); try { await service.deleteOneId('623aed68c5d45b6fbbaa7e60'); expect(true).toBe(false); @@ -401,7 +401,7 @@ describe('JobsService', () => { hasPersonalOffer: true, jobsGroup: null, }; - mockJobModel.findById.mockResolvedValue({ + mockJobModel.exec.mockResolvedValueOnce({ _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'CNFS old', validated: true, @@ -421,7 +421,7 @@ describe('JobsService', () => { hasPersonalOffer: true, jobsGroup: null, }; - mockJobModel.findById.mockResolvedValue(null); + mockJobModel.exec.mockResolvedValueOnce(null); try { await service.update('623aed68c5d45b6fbbaa7e60', newJobDto); expect(true).toBe(false); diff --git a/src/users/services/jobs.service.ts b/src/users/services/jobs.service.ts index c9c1fe472aa5d3b4caa7ef749e2e2c9fb2edf25a..1f2d0cab10d1e3bbf8332acd30c7df5595a1853c 100644 --- a/src/users/services/jobs.service.ts +++ b/src/users/services/jobs.service.ts @@ -37,17 +37,17 @@ export class JobsService { public async findByName(name: string): Promise<JobDocument> { this.logger.debug('findByName'); - return this.jobModel.findOne({ name }); + return this.jobModel.findOne({ name }).exec(); } public async findOne(idParam: string): Promise<JobDocument> { this.logger.debug('findOne'); - return this.jobModel.findById(new Types.ObjectId(idParam)); + return this.jobModel.findById(new Types.ObjectId(idParam)).exec(); } public async findAllUnvalidated(): Promise<IJob[]> { this.logger.debug('findAllUnvalidated'); - return this.jobModel.find({ validated: false }); + return this.jobModel.find({ validated: false }).exec(); } public async create( @@ -91,7 +91,7 @@ export class JobsService { public async validate(jobId: string): Promise<Job> { this.logger.debug(`validateJob: ${jobId}`); - const job = await this.jobModel.findById(new Types.ObjectId(jobId)); + const job = await this.jobModel.findById(new Types.ObjectId(jobId)).exec(); if (job) { job.validated = true; job.save(); @@ -103,8 +103,8 @@ export class JobsService { public async mergeJob({ sourceJobId, targetJobId }: MergeJobDto): Promise<Job | HttpException> { this.logger.debug(`mergeJob: ${sourceJobId} into ${targetJobId}`); - const sourceJob = await this.jobModel.findById(new Types.ObjectId(sourceJobId)); - const targetJob = await this.jobModel.findById(new Types.ObjectId(targetJobId)); + const sourceJob = await this.jobModel.findById(new Types.ObjectId(sourceJobId)).exec(); + const targetJob = await this.jobModel.findById(new Types.ObjectId(targetJobId)).exec(); if (targetJob && sourceJob) { this.logger.debug(`Both jobs : ${JSON.stringify(sourceJob)}, ${JSON.stringify(targetJob)}`); await this.userService.replaceJobs(sourceJob, targetJob); @@ -119,11 +119,11 @@ export class JobsService { public async deleteInvalidJob(id: string): Promise<mongodb.DeleteResult> { this.logger.debug(`deleteInvalidJob: ${id}`); - return this.jobModel.deleteOne({ _id: id }); + return this.jobModel.deleteOne({ _id: id }).exec(); } public async deleteOneId(id: string): Promise<Job> { - const job = await this.jobModel.findOne({ _id: id }); + const job = await this.jobModel.findOne({ _id: id }).exec(); if (!job) { throw new HttpException('Invalid job id', HttpStatus.BAD_REQUEST); } @@ -132,7 +132,7 @@ export class JobsService { public async update(jobId: string, newJob: CreateJobDto): Promise<Job> { this.logger.debug(`editJob: ${jobId}`); - const job = await this.jobModel.findById(new Types.ObjectId(jobId)); + const job = await this.jobModel.findById(new Types.ObjectId(jobId)).exec(); if (job) { job.name = newJob.name; job.hasPersonalOffer = newJob.hasPersonalOffer; diff --git a/src/users/services/jobsGroups.service.spec.ts b/src/users/services/jobsGroups.service.spec.ts index 2288802605c8e0d2531a19778c205f74952d7865..ee25b30ddf2196b67351dfb80629611f4b52ebcf 100644 --- a/src/users/services/jobsGroups.service.spec.ts +++ b/src/users/services/jobsGroups.service.spec.ts @@ -18,10 +18,10 @@ describe('JobsGroupsService', () => { find: jest.fn().mockReturnThis(), collation: jest.fn().mockReturnThis(), sort: jest.fn().mockReturnThis(), - exec: jest.fn().mockReturnThis(), - findOne: jest.fn(), - findById: jest.fn(), - deleteOne: jest.fn(), + exec: jest.fn(), + findOne: jest.fn().mockReturnThis(), + findById: jest.fn().mockReturnThis(), + deleteOne: jest.fn().mockReturnThis(), }; const mockJobModel = { @@ -93,7 +93,7 @@ describe('JobsGroupsService', () => { }); it('findByName', async () => { - mockJobsGroupsModel.findOne.mockResolvedValue({ + mockJobsGroupsModel.exec.mockResolvedValueOnce({ _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'Technique', }); @@ -101,7 +101,7 @@ describe('JobsGroupsService', () => { expect(reply).toBeTruthy(); }); it('findOne', async () => { - mockJobsGroupsModel.findById.mockResolvedValue({ + mockJobsGroupsModel.exec.mockResolvedValueOnce({ _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'Technique', }); @@ -111,7 +111,7 @@ describe('JobsGroupsService', () => { describe('createJobsGroups', () => { it('create', async () => { - mockJobsGroupsModel.create.mockResolvedValue({ + mockJobsGroupsModel.create.mockResolvedValueOnce({ _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'Technique', }); @@ -132,7 +132,7 @@ describe('JobsGroupsService', () => { _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'Technique', }; - mockJobsGroupsModel.findById.mockResolvedValue({ + mockJobsGroupsModel.exec.mockResolvedValueOnce({ _id: new Types.ObjectId('6231aefe76598527c8d0b5bc'), name: 'Technique old', save: jest.fn().mockResolvedValueOnce(newJobsGroups), @@ -146,7 +146,7 @@ describe('JobsGroupsService', () => { const newJobsGroupsDto = { name: 'Technique', }; - mockJobsGroupsModel.findById.mockResolvedValue(null); + mockJobsGroupsModel.exec.mockResolvedValueOnce(null); try { await service.update('623aed68c5d45b6fbbaa7e60', newJobsGroupsDto); expect(true).toBe(false); diff --git a/src/users/services/jobsGroups.service.ts b/src/users/services/jobsGroups.service.ts index c763a58622ff43b07ba18a72bd67efbe5779f7e7..aa88edde02e46f609c7571ac6b7d8b5f2b4ea52d 100644 --- a/src/users/services/jobsGroups.service.ts +++ b/src/users/services/jobsGroups.service.ts @@ -33,12 +33,12 @@ export class JobsGroupsService { public async findByName(name: string): Promise<JobsGroupsDocument> { this.logger.debug(`findByName jobsGroups: ${name}`); - return this.jobsGroupsModel.findOne({ name }); + return this.jobsGroupsModel.findOne({ name }).exec(); } public async findOne(idParam: string): Promise<JobsGroupsDocument> { this.logger.debug(`findOne jobsGroups: ${idParam}`); - return this.jobsGroupsModel.findById(new Types.ObjectId(idParam)); + return this.jobsGroupsModel.findById(new Types.ObjectId(idParam)).exec(); } public async populateJobsGroupsWithJobs(jobsGroups: JobsGroupsDocument[]) { @@ -64,7 +64,7 @@ export class JobsGroupsService { public async update(jobsGroupId: string, newJobsGroup: CreateJobsGroupsDto): Promise<JobsGroups> { this.logger.debug(`edit JobsGroup: ${jobsGroupId}`); - const jobsGroups = await this.jobsGroupsModel.findById(new Types.ObjectId(jobsGroupId)); + const jobsGroups = await this.jobsGroupsModel.findById(new Types.ObjectId(jobsGroupId)).exec(); if (!jobsGroups) { throw new HttpException('Jobs group not found', HttpStatus.NOT_FOUND); } diff --git a/src/users/services/users.service.spec.ts b/src/users/services/users.service.spec.ts index b503bb146dea557380aa3d544a431992b8c85a5c..71c895d0638bf171a3a3e3fbf541c7ac40a55039 100644 --- a/src/users/services/users.service.spec.ts +++ b/src/users/services/users.service.spec.ts @@ -8,7 +8,7 @@ import * as bcrypt from 'bcrypt'; import { Types } from 'mongoose'; import { employersMockData } from '../../../test/mock/data/employers.mock.data'; import { personalOffersDataMock } from '../../../test/mock/data/personalOffers.mock.data'; -import { userDetails, usersMockData } from '../../../test/mock/data/users.mock.data'; +import { userDetails, userRegistryMockData, usersMockData } from '../../../test/mock/data/users.mock.data'; import { MailerMockService } from '../../../test/mock/services/mailer.mock.service'; import { LoginDto } from '../../auth/login-dto'; import { ConfigurationModule } from '../../configuration/configuration.module'; @@ -417,15 +417,18 @@ describe('UsersService', () => { it('should updateUserProfile', async () => { const spyer = jest.spyOn(mockUserRegistrySearchService, 'update'); - mockUserModel.findOne.mockReturnThis(); - mockUserModel.findByIdAndUpdate.mockResolvedValueOnce(usersMockData[0]); + const spyerFindPopulate = jest + .spyOn(service, 'findPopulatedUserRegistryById') + .mockImplementationOnce(async () => userRegistryMockData); + mockUserModel.exec.mockResolvedValueOnce(usersMockData[0]); const result = await service.updateUserProfile(new Types.ObjectId('627b85aea0466f0f132e1599'), employer, job); expect(spyer).toBeCalledTimes(1); + expect(spyerFindPopulate).toBeCalledTimes(1); expect(result).toEqual(usersMockData[0]); }); it('should not updateUserProfile', async () => { const spyer = jest.spyOn(mockUserRegistrySearchService, 'update'); - mockUserModel.findByIdAndUpdate.mockResolvedValueOnce(null); + mockUserModel.exec.mockResolvedValueOnce(null); const result = await service.updateUserProfile(new Types.ObjectId('627b85aea0466f0f132e1599'), employer, job); expect(spyer).toBeCalledTimes(0); expect(result).toEqual(null); @@ -440,15 +443,18 @@ describe('UsersService', () => { } as JobDocument; it('should updateUserJob', async () => { const spyer = jest.spyOn(mockUserRegistrySearchService, 'update'); - mockUserModel.findByIdAndUpdate.mockResolvedValueOnce(usersMockData[0]); - mockUserModel.findOne.mockReturnThis(); + const spyerFindPopulate = jest + .spyOn(service, 'findPopulatedUserRegistryById') + .mockImplementationOnce(async () => userRegistryMockData); + mockUserModel.exec.mockResolvedValueOnce(usersMockData[0]); const result = await service.updateUserJob(new Types.ObjectId('627b85aea0466f0f132e1599'), job); expect(spyer).toBeCalledTimes(1); + expect(spyerFindPopulate).toBeCalledTimes(1); expect(result).toEqual(usersMockData[0]); }); it('should not updateUserJob', async () => { const spyer = jest.spyOn(mockUserRegistrySearchService, 'update'); - mockUserModel.findByIdAndUpdate.mockResolvedValueOnce(null); + mockUserModel.exec.mockResolvedValueOnce(null); const result = await service.updateUserJob(new Types.ObjectId('627b85aea0466f0f132e1599'), job); expect(spyer).toBeCalledTimes(0); expect(result).toEqual(null); @@ -463,14 +469,18 @@ describe('UsersService', () => { } as EmployerDocument; it('should updateUserEmployer', async () => { const spyer = jest.spyOn(mockUserRegistrySearchService, 'update'); - mockUserModel.findByIdAndUpdate.mockResolvedValueOnce(usersMockData[0]); + const spyerFindPopulate = jest + .spyOn(service, 'findPopulatedUserRegistryById') + .mockImplementationOnce(async () => userRegistryMockData); + mockUserModel.exec.mockResolvedValueOnce(usersMockData[0]); const result = await service.updateUserEmployer(new Types.ObjectId('627b85aea0466f0f132e1599'), employer); expect(spyer).toBeCalledTimes(1); + expect(spyerFindPopulate).toBeCalledTimes(1); expect(result).toEqual(usersMockData[0]); }); it('should not updateUserEmployer', async () => { const spyer = jest.spyOn(mockUserRegistrySearchService, 'update'); - mockUserModel.findByIdAndUpdate.mockResolvedValueOnce(null); + mockUserModel.exec.mockResolvedValueOnce(null); const result = await service.updateUserEmployer(new Types.ObjectId('627b85aea0466f0f132e1599'), employer); expect(spyer).toBeCalledTimes(0); expect(result).toEqual(null); @@ -481,16 +491,19 @@ describe('UsersService', () => { it('should update user details', async () => { const user = usersMockData[0]; const detailsDto: UpdateDetailsDto = { name: 'Michel', surname: 'Chelmi', phone: '0601020304' }; - mockUserModel.findByIdAndUpdate.mockResolvedValueOnce({ ...user, ...detailsDto }); - mockUserModel.findPopulatedUserRegistryById.mockResolvedValueOnce({ ...user, ...detailsDto }); - mockUserModel.findOne.mockReturnThis(); + mockUserModel.exec.mockResolvedValueOnce({ ...user, ...detailsDto }); + const spyerFindPopulate = jest + .spyOn(service, 'findPopulatedUserRegistryById') + .mockImplementationOnce(async () => userRegistryMockData); const updatedUser = await service.updateUserDetails('', { name: '', surname: '', phone: '' }); + expect(spyerFindPopulate).toBeCalledTimes(1); expect(updatedUser.name).toBe(detailsDto.name); expect(updatedUser.surname).toBe(detailsDto.surname); expect(updatedUser.phone).toBe(detailsDto.phone); }); it('should not found a user', async () => { - mockUserModel.findByIdAndUpdate.mockResolvedValueOnce(null); + mockUserModel.findByIdAndUpdate.mockReturnThis(); + mockUserModel.exec.mockResolvedValueOnce(null); try { await service.updateUserDetails('', { name: '', surname: '', phone: '' }); expect(true).toBe(false); @@ -505,12 +518,16 @@ describe('UsersService', () => { it('should update user description', async () => { const user = usersMockData[0]; const updatedDescription: DescriptionDto = { description: 'hello friend' }; - mockUserModel.findByIdAndUpdate.mockResolvedValueOnce({ ...user, ...updatedDescription }); + mockUserModel.exec.mockResolvedValueOnce({ ...user, ...updatedDescription }); + const spyerFindPopulate = jest + .spyOn(service, 'findPopulatedUserRegistryById') + .mockImplementationOnce(async () => userRegistryMockData); const updatedUser = await service.updateDescription('', { description: '' }); + expect(spyerFindPopulate).toBeCalledTimes(1); expect(updatedUser.description).toBe(updatedDescription.description); }); it('should not found a user', async () => { - mockUserModel.findByIdAndUpdate.mockResolvedValueOnce(null); + mockUserModel.exec.mockResolvedValueOnce(null); try { await service.updateDescription('', { description: '' }); expect(true).toBe(false); diff --git a/src/users/services/users.service.ts b/src/users/services/users.service.ts index e1c2243fd05f46d84d1715aac2ca7619a2509341..b2bd10a5fca0e72d49853c142a2096d8138cff7e 100644 --- a/src/users/services/users.service.ts +++ b/src/users/services/users.service.ts @@ -779,10 +779,9 @@ export class UsersService { */ public async updateUserProfile(userId: Types.ObjectId, employer: EmployerDocument, job: JobDocument): Promise<IUser> { this.logger.debug(`updateUserProfile | ${userId}`); - const updated = await this.userModel.findByIdAndUpdate( - { _id: userId }, - { $set: { employer: employer._id, job: job._id } } - ); + const updated = await this.userModel + .findByIdAndUpdate({ _id: userId }, { $set: { employer: employer._id, job: job._id } }) + .exec(); if (updated) { const populatedResult = await this.findPopulatedUserRegistryById(updated._id); this.userRegistrySearchService.update(populatedResult); @@ -797,7 +796,7 @@ export class UsersService { */ public async updateUserJob(userId: Types.ObjectId, job: JobDocument): Promise<IUser> { this.logger.debug(`updateUserProfile - Job | ${userId}`); - const updated = await this.userModel.findByIdAndUpdate({ _id: userId }, { $set: { job: job._id } }); + const updated = await this.userModel.findByIdAndUpdate({ _id: userId }, { $set: { job: job._id } }).exec(); if (updated) { const populatedResult = await this.findPopulatedUserRegistryById(updated._id); this.userRegistrySearchService.update(populatedResult); @@ -826,7 +825,9 @@ export class UsersService { */ public async updateUserEmployer(userId: Types.ObjectId, employer: EmployerDocument): Promise<IUser> { this.logger.debug(`updateUserProfile - Employer | ${userId}`); - const updated = await this.userModel.findByIdAndUpdate({ _id: userId }, { $set: { employer: employer._id } }); + const updated = await this.userModel + .findByIdAndUpdate({ _id: userId }, { $set: { employer: employer._id } }) + .exec(); if (updated) { const populatedResult = await this.findPopulatedUserRegistryById(updated._id); this.userRegistrySearchService.update(populatedResult); @@ -855,7 +856,7 @@ export class UsersService { */ public async updateUserDetails(userId: string, updatedDetails: UpdateDetailsDto): Promise<IUser> { this.logger.debug(`updateUserDetails | ${userId}`); - const result = await this.userModel.findByIdAndUpdate(userId, updatedDetails, { new: true }); + const result = await this.userModel.findByIdAndUpdate(userId, updatedDetails, { new: true }).exec(); if (!result) { throw new HttpException('User not found', HttpStatus.BAD_REQUEST); } @@ -871,7 +872,7 @@ export class UsersService { */ public async updateDescription(userId: string, description: DescriptionDto) { this.logger.debug(`updateUserDescription | ${userId}`); - const result = await this.userModel.findByIdAndUpdate(userId, description, { new: true }); + const result = await this.userModel.findByIdAndUpdate(userId, description, { new: true }).exec(); if (!result) { throw new HttpException('User not found', HttpStatus.BAD_REQUEST); } diff --git a/test/mock/data/users.mock.data.ts b/test/mock/data/users.mock.data.ts index 8c012955f191a663cc77f108bb37b85448286104..1e884cdbd1b3267c8b91748d265aabcfd1c5ebfa 100644 --- a/test/mock/data/users.mock.data.ts +++ b/test/mock/data/users.mock.data.ts @@ -1,5 +1,6 @@ import { Types } from 'mongoose'; import { IUser } from '../../../src/users/interfaces/user.interface'; +import { IUserRegistry } from '../../../src/users/interfaces/userRegistry.interface'; export const usersMockData: IUser[] = [ { @@ -211,3 +212,12 @@ export const multipleUsers: IUser[] = [ }, }, ] as IUser[]; + +export const userRegistryMockData: IUserRegistry = { + resetPasswordToken: null, + _id: '6036721022462b001334c4bb', + name: 'Xavier', + surname: 'NIEL', + __v: 1, + save: jest.fn(), +} as any;