From dc50a61adce9c1862ed4cdd0b9715378be121795 Mon Sep 17 00:00:00 2001 From: Manon Palin Date: Thu, 13 Jun 2024 13:21:30 +0200 Subject: [PATCH 1/8] COM-3719 - add trainerAnswerList in PUT /questionnairehistories/{id} --- src/helpers/questionnaireHistories.js | 27 +++++++++++++++++-- src/models/QuestionnaireHistory.js | 1 + .../preHandlers/questionnaireHistories.js | 9 +++++++ src/routes/questionnaireHistories.js | 2 +- .../questionnaireHistories.test.js | 5 +++- 5 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/helpers/questionnaireHistories.js b/src/helpers/questionnaireHistories.js index 988623ad8..5a5d5951c 100644 --- a/src/helpers/questionnaireHistories.js +++ b/src/helpers/questionnaireHistories.js @@ -13,6 +13,7 @@ const { } = require('./constants'); const CourseHistoriesHelper = require('./courseHistories'); const QuestionnaireHelper = require('./questionnaires'); +const UtilsHelper = require('./utils'); const translate = require('./translate'); const { language } = translate; @@ -50,11 +51,33 @@ exports.addQuestionnaireHistory = async (payload) => { }; exports.updateQuestionnaireHistory = async (questionnaireHistoryId, payload) => { - const { trainerComment } = payload; + const { trainerComment, trainerAnswers } = payload; + const questionnaireHistory = await QuestionnaireHistory.findOne({ _id: questionnaireHistoryId }).lean(); + + const questionnaireAnswersList = []; + for (const trainerAnswer of trainerAnswers) { + const qa = questionnaireHistory.questionnaireAnswersList + .find(q => UtilsHelper.areObjectIdsEquals(q.card, trainerAnswer.card)); + + if (!trainerAnswer.answer) { + questionnaireAnswersList.push(qa); + continue; + } + + const updatedQuestionnaireAnswers = { ...qa, trainerAnswerList: [trainerAnswer.answer] }; + + questionnaireAnswersList.push(updatedQuestionnaireAnswers); + } return QuestionnaireHistory .updateOne( { _id: questionnaireHistoryId }, - { $set: { isValidated: true, ...(trainerComment && { trainerComment }) } } + { + $set: { + isValidated: true, + ...(trainerComment && { trainerComment }), + ...(questionnaireAnswersList && { questionnaireAnswersList }), + }, + } ); }; diff --git a/src/models/QuestionnaireHistory.js b/src/models/QuestionnaireHistory.js index d0a8e5652..0e711284d 100644 --- a/src/models/QuestionnaireHistory.js +++ b/src/models/QuestionnaireHistory.js @@ -9,6 +9,7 @@ const QuestionnaireHistorySchema = mongoose.Schema({ questionnaireAnswersList: [{ card: { type: mongoose.Schema.Types.ObjectId, ref: 'Card' }, answerList: { type: [String] }, + trainerAnswerList: { type: [String] }, }], company: { type: mongoose.Schema.Types.ObjectId, ref: 'Company', required: true }, origin: { type: String, enum: ORIGIN_OPTIONS, required: true, immutable: true, default: MOBILE }, diff --git a/src/routes/preHandlers/questionnaireHistories.js b/src/routes/preHandlers/questionnaireHistories.js index 579e4e8df..8ba87ab61 100644 --- a/src/routes/preHandlers/questionnaireHistories.js +++ b/src/routes/preHandlers/questionnaireHistories.js @@ -43,11 +43,20 @@ exports.authorizeQuestionnaireHistoryUpdate = async (req) => { const cardIds = trainerAnswers.map(answer => answer.card); const questionnaire = await Questionnaire .findOne({ _id: questionnaireHistory.questionnaire, cards: { $in: cardIds } }) + .populate({ path: 'cards', select: 'labels' }) .lean(); if (!questionnaire) throw Boom.notFound(); const answersHasGoodLength = trainerAnswers.length === questionnaireHistory.questionnaireAnswersList.length; if (!answersHasGoodLength) throw Boom.badRequest(); + const everyAnswerIsAuthorized = trainerAnswers.every((a) => { + const card = questionnaire.cards.find(c => UtilsHelper.areObjectIdsEquals(c._id, a.card)); + const labels = get(card, 'labels'); + + return a.answer ? Object.keys(labels).includes(a.answer) : true; + }); + if (!everyAnswerIsAuthorized) throw Boom.badRequest(); + return null; }; diff --git a/src/routes/questionnaireHistories.js b/src/routes/questionnaireHistories.js index c910ffa07..a8b623dd8 100644 --- a/src/routes/questionnaireHistories.js +++ b/src/routes/questionnaireHistories.js @@ -40,7 +40,7 @@ exports.plugin = { validate: { params: Joi.object({ _id: Joi.objectId().required() }), payload: Joi.object({ - trainerAnswers: Joi.array().items(Joi.object({ card: Joi.objectId() })), + trainerAnswers: Joi.array().items(Joi.object({ card: Joi.objectId(), answer: Joi.string() })), trainerComment: Joi.string(), }), }, diff --git a/tests/integration/questionnaireHistories.test.js b/tests/integration/questionnaireHistories.test.js index 929c6a8fd..77c34c26b 100644 --- a/tests/integration/questionnaireHistories.test.js +++ b/tests/integration/questionnaireHistories.test.js @@ -453,7 +453,10 @@ describe('QUESTIONNAIRE HISTORIES ROUTES - PUT /questionnairehistories/{_id}', ( }); it('should update questionnaireHistory', async () => { - const payload = { trainerAnswers: [{ card: cardsList[1]._id }], trainerComment: 'Appréciation du formateur' }; + const payload = { + trainerAnswers: [{ card: cardsList[1]._id, answer: '1' }], + trainerComment: 'Appréciation du formateur', + }; const response = await app.inject({ method: 'PUT', url: `/questionnairehistories/${endSelfPositionningQuestionnaireHistoryId}`, From b4e55edae3c9b01c1275f8810070331495de9d10 Mon Sep 17 00:00:00 2001 From: Manon Palin Date: Thu, 13 Jun 2024 13:25:06 +0200 Subject: [PATCH 2/8] COM-3719 - add integration tests --- tests/integration/questionnaireHistories.test.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/tests/integration/questionnaireHistories.test.js b/tests/integration/questionnaireHistories.test.js index 77c34c26b..c1aeaeca3 100644 --- a/tests/integration/questionnaireHistories.test.js +++ b/tests/integration/questionnaireHistories.test.js @@ -524,6 +524,21 @@ describe('QUESTIONNAIRE HISTORIES ROUTES - PUT /questionnairehistories/{_id}', ( expect(response.statusCode).toBe(400); }); + + it('should return 400 if a trainerAnswer is not allowed', async () => { + const payload = { + trainerAnswers: [{ card: cardsList[1]._id, answer: 'test' }], + trainerComment: 'Appréciation du formateur', + }; + const response = await app.inject({ + method: 'PUT', + url: `/questionnairehistories/${endSelfPositionningQuestionnaireHistoryId}`, + payload, + headers: { Cookie: `alenvi_token=${authToken}` }, + }); + + expect(response.statusCode).toBe(400); + }); }); describe('OTHER ROLES', () => { From f3550caa04d444236533470bea140e7d762b3779 Mon Sep 17 00:00:00 2001 From: Manon Palin Date: Thu, 13 Jun 2024 14:02:12 +0200 Subject: [PATCH 3/8] COM-3719 - edit updateQuestionnaireHistory + add unit tests --- src/helpers/questionnaireHistories.js | 40 ++++++-------- .../helpers/questionnaireHistories.test.js | 55 ++++++++++++++++++- 2 files changed, 71 insertions(+), 24 deletions(-) diff --git a/src/helpers/questionnaireHistories.js b/src/helpers/questionnaireHistories.js index 5a5d5951c..2e7acdfa0 100644 --- a/src/helpers/questionnaireHistories.js +++ b/src/helpers/questionnaireHistories.js @@ -52,32 +52,28 @@ exports.addQuestionnaireHistory = async (payload) => { exports.updateQuestionnaireHistory = async (questionnaireHistoryId, payload) => { const { trainerComment, trainerAnswers } = payload; - const questionnaireHistory = await QuestionnaireHistory.findOne({ _id: questionnaireHistoryId }).lean(); - const questionnaireAnswersList = []; - for (const trainerAnswer of trainerAnswers) { - const qa = questionnaireHistory.questionnaireAnswersList - .find(q => UtilsHelper.areObjectIdsEquals(q.card, trainerAnswer.card)); + let setFields = { isValidated: true, ...(trainerComment && { trainerComment }) }; + if (trainerAnswers.some(a => a.answer)) { + const questionnaireHistory = await QuestionnaireHistory.findOne({ _id: questionnaireHistoryId }).lean(); - if (!trainerAnswer.answer) { - questionnaireAnswersList.push(qa); - continue; - } + const questionnaireAnswersList = []; + for (const trainerAnswer of trainerAnswers) { + const qa = questionnaireHistory.questionnaireAnswersList + .find(q => UtilsHelper.areObjectIdsEquals(q.card, trainerAnswer.card)); + + if (!trainerAnswer.answer) { + questionnaireAnswersList.push(qa); + continue; + } - const updatedQuestionnaireAnswers = { ...qa, trainerAnswerList: [trainerAnswer.answer] }; + const updatedQuestionnaireAnswers = { ...qa, trainerAnswerList: [trainerAnswer.answer] }; - questionnaireAnswersList.push(updatedQuestionnaireAnswers); + questionnaireAnswersList.push(updatedQuestionnaireAnswers); + } + + setFields = { ...setFields, questionnaireAnswersList }; } - return QuestionnaireHistory - .updateOne( - { _id: questionnaireHistoryId }, - { - $set: { - isValidated: true, - ...(trainerComment && { trainerComment }), - ...(questionnaireAnswersList && { questionnaireAnswersList }), - }, - } - ); + return QuestionnaireHistory.updateOne({ _id: questionnaireHistoryId }, { $set: setFields }); }; diff --git a/tests/unit/helpers/questionnaireHistories.test.js b/tests/unit/helpers/questionnaireHistories.test.js index c534c75e3..3358d2914 100644 --- a/tests/unit/helpers/questionnaireHistories.test.js +++ b/tests/unit/helpers/questionnaireHistories.test.js @@ -306,30 +306,81 @@ describe('addQuestionnaireHistory', () => { describe('updateQuestionnaireHistory', () => { const questionnaireHistoryId = new ObjectId(); let updateOne; + let findOne; beforeEach(() => { updateOne = sinon.stub(QuestionnaireHistory, 'updateOne'); + findOne = sinon.stub(QuestionnaireHistory, 'findOne'); }); afterEach(() => { updateOne.restore(); + findOne.restore(); }); it('should update questionnaireHistory', async () => { - const payload = { trainerAnswers: [{ _id: new ObjectId() }], trainerComment: '' }; + const payload = { trainerAnswers: [{ card: new ObjectId() }], trainerComment: '' }; + await QuestionnaireHistoriesHelper.updateQuestionnaireHistory(questionnaireHistoryId, payload); + sinon.assert.notCalled(findOne); sinon.assert.calledWithExactly(updateOne, { _id: questionnaireHistoryId }, { $set: { isValidated: true } }); }); it('should update questionnaireHistory with trainer comment', async () => { - const payload = { trainerAnswers: [{ _id: new ObjectId() }], trainerComment: 'Test avec un commentaire' }; + const payload = { trainerAnswers: [{ card: new ObjectId() }], trainerComment: 'Test avec un commentaire' }; + await QuestionnaireHistoriesHelper.updateQuestionnaireHistory(questionnaireHistoryId, payload); + sinon.assert.notCalled(findOne); sinon.assert.calledWithExactly( updateOne, { _id: questionnaireHistoryId }, { $set: { isValidated: true, trainerComment: payload.trainerComment } } ); }); + + it('should update questionnaireHistory with trainer answers', async () => { + const cardIds = [new ObjectId(), new ObjectId(), new ObjectId()]; + const payload = { + trainerAnswers: [ + { card: cardIds[0], answer: '4' }, + { card: cardIds[1] }, + { card: cardIds[2], answer: '5' }, + ], + }; + const questionnaireHistory = { + _id: questionnaireHistoryId, + questionnaire: new ObjectId(), + user: new ObjectId(), + timeline: END_COURSE, + questionnaireAnswersList: [ + { card: cardIds[0], answerList: ['3'] }, + { card: cardIds[1], answerList: ['4'] }, + { card: cardIds[2], answerList: ['4'] }, + ], + }; + findOne.returns(SinonMongoose.stubChainedQueries(questionnaireHistory, ['lean'])); + + await QuestionnaireHistoriesHelper.updateQuestionnaireHistory(questionnaireHistoryId, payload); + + SinonMongoose.calledOnceWithExactly( + findOne, + [{ query: 'findOne', args: [{ _id: questionnaireHistoryId }] }, { query: 'lean' }] + ); + sinon.assert.calledWithExactly( + updateOne, + { _id: questionnaireHistoryId }, + { + $set: { + isValidated: true, + questionnaireAnswersList: [ + { card: cardIds[0], answerList: ['3'], trainerAnswerList: ['4'] }, + { card: cardIds[1], answerList: ['4'] }, + { card: cardIds[2], answerList: ['4'], trainerAnswerList: ['5'] }, + ], + }, + } + ); + }); }); From e04d043875919122adaf82b3231f7796218feed6 Mon Sep 17 00:00:00 2001 From: Manon Palin Date: Thu, 13 Jun 2024 17:19:54 +0200 Subject: [PATCH 4/8] COM-3719 - use keyBY --- src/helpers/questionnaireHistories.js | 13 +++++++------ src/routes/preHandlers/questionnaireHistories.js | 7 ++++--- 2 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/helpers/questionnaireHistories.js b/src/helpers/questionnaireHistories.js index 2e7acdfa0..b24757857 100644 --- a/src/helpers/questionnaireHistories.js +++ b/src/helpers/questionnaireHistories.js @@ -1,4 +1,5 @@ const Boom = require('@hapi/boom'); +const keyBy = require('lodash/keyBy'); const QuestionnaireHistory = require('../models/QuestionnaireHistory'); const Questionnaire = require('../models/Questionnaire'); const { @@ -13,7 +14,6 @@ const { } = require('./constants'); const CourseHistoriesHelper = require('./courseHistories'); const QuestionnaireHelper = require('./questionnaires'); -const UtilsHelper = require('./utils'); const translate = require('./translate'); const { language } = translate; @@ -56,18 +56,19 @@ exports.updateQuestionnaireHistory = async (questionnaireHistoryId, payload) => let setFields = { isValidated: true, ...(trainerComment && { trainerComment }) }; if (trainerAnswers.some(a => a.answer)) { const questionnaireHistory = await QuestionnaireHistory.findOne({ _id: questionnaireHistoryId }).lean(); + const questionnaireAnswersByCard = keyBy(questionnaireHistory.questionnaireAnswersList, 'card'); const questionnaireAnswersList = []; for (const trainerAnswer of trainerAnswers) { - const qa = questionnaireHistory.questionnaireAnswersList - .find(q => UtilsHelper.areObjectIdsEquals(q.card, trainerAnswer.card)); - if (!trainerAnswer.answer) { - questionnaireAnswersList.push(qa); + questionnaireAnswersList.push(questionnaireAnswersByCard[trainerAnswer.card]); continue; } - const updatedQuestionnaireAnswers = { ...qa, trainerAnswerList: [trainerAnswer.answer] }; + const updatedQuestionnaireAnswers = { + ...questionnaireAnswersByCard[trainerAnswer.card], + trainerAnswerList: [trainerAnswer.answer], + }; questionnaireAnswersList.push(updatedQuestionnaireAnswers); } diff --git a/src/routes/preHandlers/questionnaireHistories.js b/src/routes/preHandlers/questionnaireHistories.js index 8ba87ab61..19835db29 100644 --- a/src/routes/preHandlers/questionnaireHistories.js +++ b/src/routes/preHandlers/questionnaireHistories.js @@ -1,5 +1,6 @@ const Boom = require('@hapi/boom'); const get = require('lodash/get'); +const keyBy = require('lodash/keyBy'); const Questionnaire = require('../../models/Questionnaire'); const User = require('../../models/User'); const Course = require('../../models/Course'); @@ -50,11 +51,11 @@ exports.authorizeQuestionnaireHistoryUpdate = async (req) => { const answersHasGoodLength = trainerAnswers.length === questionnaireHistory.questionnaireAnswersList.length; if (!answersHasGoodLength) throw Boom.badRequest(); + const cardsById = keyBy(questionnaire.cards, '_id'); const everyAnswerIsAuthorized = trainerAnswers.every((a) => { - const card = questionnaire.cards.find(c => UtilsHelper.areObjectIdsEquals(c._id, a.card)); - const labels = get(card, 'labels'); + const labels = get(cardsById[a.card], 'labels'); - return a.answer ? Object.keys(labels).includes(a.answer) : true; + return !a.answer || Object.keys(labels).includes(a.answer); }); if (!everyAnswerIsAuthorized) throw Boom.badRequest(); From d5149400966eff1f7a6128694d104771315928a6 Mon Sep 17 00:00:00 2001 From: Manon Palin Date: Fri, 14 Jun 2024 09:53:55 +0200 Subject: [PATCH 5/8] COM-3719 - set undefined default value for trainerAnswerList in QuestionnaireHistory model --- src/models/QuestionnaireHistory.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/models/QuestionnaireHistory.js b/src/models/QuestionnaireHistory.js index 0e711284d..bed2e5609 100644 --- a/src/models/QuestionnaireHistory.js +++ b/src/models/QuestionnaireHistory.js @@ -9,7 +9,7 @@ const QuestionnaireHistorySchema = mongoose.Schema({ questionnaireAnswersList: [{ card: { type: mongoose.Schema.Types.ObjectId, ref: 'Card' }, answerList: { type: [String] }, - trainerAnswerList: { type: [String] }, + trainerAnswerList: { type: [String], default: undefined }, }], company: { type: mongoose.Schema.Types.ObjectId, ref: 'Company', required: true }, origin: { type: String, enum: ORIGIN_OPTIONS, required: true, immutable: true, default: MOBILE }, From 849bd906caa729ffa37849866f763f2e2de833b8 Mon Sep 17 00:00:00 2001 From: Manon Palin Date: Mon, 17 Jun 2024 15:20:10 +0200 Subject: [PATCH 6/8] COM-3719 - fix reviews --- src/helpers/questionnaireHistories.js | 15 ++++++--------- src/routes/preHandlers/questionnaireHistories.js | 8 +------- tests/integration/questionnaireHistories.test.js | 2 +- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/src/helpers/questionnaireHistories.js b/src/helpers/questionnaireHistories.js index b24757857..033a70a06 100644 --- a/src/helpers/questionnaireHistories.js +++ b/src/helpers/questionnaireHistories.js @@ -55,22 +55,19 @@ exports.updateQuestionnaireHistory = async (questionnaireHistoryId, payload) => let setFields = { isValidated: true, ...(trainerComment && { trainerComment }) }; if (trainerAnswers.some(a => a.answer)) { + const trainerAnswersByCard = keyBy(trainerAnswers, 'card'); const questionnaireHistory = await QuestionnaireHistory.findOne({ _id: questionnaireHistoryId }).lean(); - const questionnaireAnswersByCard = keyBy(questionnaireHistory.questionnaireAnswersList, 'card'); const questionnaireAnswersList = []; - for (const trainerAnswer of trainerAnswers) { + for (const bddAnswer of questionnaireHistory.questionnaireAnswersList) { + const trainerAnswer = trainerAnswersByCard[bddAnswer.card]; + if (!trainerAnswer.answer) { - questionnaireAnswersList.push(questionnaireAnswersByCard[trainerAnswer.card]); + questionnaireAnswersList.push(bddAnswer); continue; } - const updatedQuestionnaireAnswers = { - ...questionnaireAnswersByCard[trainerAnswer.card], - trainerAnswerList: [trainerAnswer.answer], - }; - - questionnaireAnswersList.push(updatedQuestionnaireAnswers); + questionnaireAnswersList.push({ ...bddAnswer, trainerAnswerList: [trainerAnswer.answer] }); } setFields = { ...setFields, questionnaireAnswersList }; diff --git a/src/routes/preHandlers/questionnaireHistories.js b/src/routes/preHandlers/questionnaireHistories.js index 19835db29..64a25dbec 100644 --- a/src/routes/preHandlers/questionnaireHistories.js +++ b/src/routes/preHandlers/questionnaireHistories.js @@ -1,6 +1,5 @@ const Boom = require('@hapi/boom'); const get = require('lodash/get'); -const keyBy = require('lodash/keyBy'); const Questionnaire = require('../../models/Questionnaire'); const User = require('../../models/User'); const Course = require('../../models/Course'); @@ -51,12 +50,7 @@ exports.authorizeQuestionnaireHistoryUpdate = async (req) => { const answersHasGoodLength = trainerAnswers.length === questionnaireHistory.questionnaireAnswersList.length; if (!answersHasGoodLength) throw Boom.badRequest(); - const cardsById = keyBy(questionnaire.cards, '_id'); - const everyAnswerIsAuthorized = trainerAnswers.every((a) => { - const labels = get(cardsById[a.card], 'labels'); - - return !a.answer || Object.keys(labels).includes(a.answer); - }); + const everyAnswerIsAuthorized = trainerAnswers.every(a => !a.answer || ['1', '2', '3', '4', '5'].includes(a.answer)); if (!everyAnswerIsAuthorized) throw Boom.badRequest(); return null; diff --git a/tests/integration/questionnaireHistories.test.js b/tests/integration/questionnaireHistories.test.js index c1aeaeca3..b62fad5bb 100644 --- a/tests/integration/questionnaireHistories.test.js +++ b/tests/integration/questionnaireHistories.test.js @@ -527,7 +527,7 @@ describe('QUESTIONNAIRE HISTORIES ROUTES - PUT /questionnairehistories/{_id}', ( it('should return 400 if a trainerAnswer is not allowed', async () => { const payload = { - trainerAnswers: [{ card: cardsList[1]._id, answer: 'test' }], + trainerAnswers: [{ card: cardsList[1]._id, answer: 'mauvaiseReponse' }], trainerComment: 'Appréciation du formateur', }; const response = await app.inject({ From 6374a1b8daea45975efca88e4de4a132d1dd4caf Mon Sep 17 00:00:00 2001 From: Manon Palin Date: Tue, 18 Jun 2024 12:04:22 +0200 Subject: [PATCH 7/8] COM-3719 - add seed Verifications --- tests/integration/seed/questionnairesSeed.js | 4 +-- .../seed/seedsVerification.test.js | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/tests/integration/seed/questionnairesSeed.js b/tests/integration/seed/questionnairesSeed.js index 4af750f01..492702a11 100644 --- a/tests/integration/seed/questionnairesSeed.js +++ b/tests/integration/seed/questionnairesSeed.js @@ -282,8 +282,8 @@ const questionnaireHistories = [ questionnaire: questionnairesList[3]._id, user: traineeList[0]._id, questionnaireAnswersList: [ - { card: cardsList[1]._id, answerList: ['test'] }, - { card: cardsList[3]._id, answerList: ['blabla2'] }, + { card: cardsList[1]._id, answerList: ['3'] }, + { card: cardsList[3]._id, answerList: ['4'] }, ], timeline: START_COURSE, }, diff --git a/tests/integration/seed/seedsVerification.test.js b/tests/integration/seed/seedsVerification.test.js index 5bf78404c..80bf26b31 100644 --- a/tests/integration/seed/seedsVerification.test.js +++ b/tests/integration/seed/seedsVerification.test.js @@ -2083,6 +2083,31 @@ describe('SEEDS VERIFICATION', () => { expect(everySelfPositionningHistoryHasTimeline).toBeTruthy(); }); + + it('should pass if every trainee\'s answer is authorized (SELF POSITIONNING QUESTIONNAIRE)', () => { + const everySelfPositionningHistoryHasAuthorizedTraineeAnswer = questionnaireHistoryList + .filter(qh => qh.questionnaire.type === SELF_POSITIONNING) + .every(qh => qh.questionnaireAnswersList.every(a => ['1', '2', '3', '4', '5'].includes(a.answerList[0]))); + + expect(everySelfPositionningHistoryHasAuthorizedTraineeAnswer).toBeTruthy(); + }); + + it('should pass if every trainer\'s answer is authorized (SELF POSITIONNING QUESTIONNAIRE)', () => { + const everySelfPositionningHistoryHasAuthorizedTrainerAnswer = questionnaireHistoryList + .filter(qh => qh.questionnaire.type === SELF_POSITIONNING) + .every(qh => qh.questionnaireAnswersList + .every(a => !a.trainerAnswerList || ['1', '2', '3', '4', '5'].includes(a.trainerAnswerList[0]))); + + expect(everySelfPositionningHistoryHasAuthorizedTrainerAnswer).toBeTruthy(); + }); + + it('should pass if validated histories are linked to end self-positioning questionnaire', () => { + const everySelfPositionningHistoryHasAuthorizedTrainerAnswer = questionnaireHistoryList + .filter(qh => qh.isValidated) + .every(qh => qh.questionnaire.type === SELF_POSITIONNING && qh.timeline === END_COURSE); + + expect(everySelfPositionningHistoryHasAuthorizedTrainerAnswer).toBeTruthy(); + }); }); describe('Collection SectorHistory', () => { From 64924567a6a914971a8f156cc1c36baad226f61d Mon Sep 17 00:00:00 2001 From: Manon Palin Date: Tue, 18 Jun 2024 16:26:39 +0200 Subject: [PATCH 8/8] COM-3719 - select field + remove useless populate --- src/helpers/questionnaireHistories.js | 4 +++- src/routes/preHandlers/questionnaireHistories.js | 4 +--- tests/unit/helpers/questionnaireHistories.test.js | 5 ++++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/helpers/questionnaireHistories.js b/src/helpers/questionnaireHistories.js index 033a70a06..545067854 100644 --- a/src/helpers/questionnaireHistories.js +++ b/src/helpers/questionnaireHistories.js @@ -56,7 +56,9 @@ exports.updateQuestionnaireHistory = async (questionnaireHistoryId, payload) => let setFields = { isValidated: true, ...(trainerComment && { trainerComment }) }; if (trainerAnswers.some(a => a.answer)) { const trainerAnswersByCard = keyBy(trainerAnswers, 'card'); - const questionnaireHistory = await QuestionnaireHistory.findOne({ _id: questionnaireHistoryId }).lean(); + const questionnaireHistory = await QuestionnaireHistory + .findOne({ _id: questionnaireHistoryId }, { questionnaireAnswersList: 1 }) + .lean(); const questionnaireAnswersList = []; for (const bddAnswer of questionnaireHistory.questionnaireAnswersList) { diff --git a/src/routes/preHandlers/questionnaireHistories.js b/src/routes/preHandlers/questionnaireHistories.js index 64a25dbec..225d47ef3 100644 --- a/src/routes/preHandlers/questionnaireHistories.js +++ b/src/routes/preHandlers/questionnaireHistories.js @@ -42,9 +42,7 @@ exports.authorizeQuestionnaireHistoryUpdate = async (req) => { const cardIds = trainerAnswers.map(answer => answer.card); const questionnaire = await Questionnaire - .findOne({ _id: questionnaireHistory.questionnaire, cards: { $in: cardIds } }) - .populate({ path: 'cards', select: 'labels' }) - .lean(); + .countDocuments({ _id: questionnaireHistory.questionnaire, cards: { $in: cardIds } }); if (!questionnaire) throw Boom.notFound(); const answersHasGoodLength = trainerAnswers.length === questionnaireHistory.questionnaireAnswersList.length; diff --git a/tests/unit/helpers/questionnaireHistories.test.js b/tests/unit/helpers/questionnaireHistories.test.js index 3358d2914..6cebc77a6 100644 --- a/tests/unit/helpers/questionnaireHistories.test.js +++ b/tests/unit/helpers/questionnaireHistories.test.js @@ -366,7 +366,10 @@ describe('updateQuestionnaireHistory', () => { SinonMongoose.calledOnceWithExactly( findOne, - [{ query: 'findOne', args: [{ _id: questionnaireHistoryId }] }, { query: 'lean' }] + [ + { query: 'findOne', args: [{ _id: questionnaireHistoryId }, { questionnaireAnswersList: 1 }] }, + { query: 'lean' }, + ] ); sinon.assert.calledWithExactly( updateOne,