diff --git a/api/lib/domain/usecases/stages/handle-stage-acquisition.js b/api/lib/domain/usecases/stages/handle-stage-acquisition.js index 2ba9f6ba6d2..f20b6aa5779 100644 --- a/api/lib/domain/usecases/stages/handle-stage-acquisition.js +++ b/api/lib/domain/usecases/stages/handle-stage-acquisition.js @@ -35,7 +35,7 @@ const handleStageAcquisition = async function ({ getMasteryPercentageService = defaultGetMasteryPercentageService, convertLevelStagesIntoThresholdsService = defaultConvertLevelStagesIntoThresholdsService, }) { - if (!assessment.isForCampaign()) return; + if (!assessment.isForCampaign() && !assessment.isExam()) return; const campaignParticipation = await campaignParticipationRepository.get(assessment.campaignParticipationId); diff --git a/api/tests/unit/domain/usecases/handle-stage-acquisition_test.js b/api/tests/unit/domain/usecases/handle-stage-acquisition_test.js index 5e33385e393..c66db3ff54b 100644 --- a/api/tests/unit/domain/usecases/handle-stage-acquisition_test.js +++ b/api/tests/unit/domain/usecases/handle-stage-acquisition_test.js @@ -47,7 +47,7 @@ describe('Unit | UseCase | handleStageAcquisition', function () { }; }); - context('when assessment is not of type campaign', function () { + context('when assessment is not of type campaign or exam', function () { it('should not attempt to create any stages acquisition', async function () { // given campaignParticipationRepository.get.rejects('I should not be called'); @@ -164,4 +164,103 @@ describe('Unit | UseCase | handleStageAcquisition', function () { }); }); }); + + context('when assessment is of type exam', function () { + context('no stages are associated with this campaign', function () { + it('should not attempt to create any stages acquisition', async function () { + const assessment = domainBuilder.buildAssessment.ofTypeExam(); + const campaignParticipation = { + id: 1, + }; + + // given + campaignParticipationRepository.get + .withArgs(assessment.campaignParticipationId) + .resolves(campaignParticipation); + stageRepository.getByCampaignParticipationId.withArgs(campaignParticipation.id).resolves([]); + stageAcquisitionRepository.getStageIdsByCampaignParticipation.withArgs(campaignParticipation.id).resolves([]); + + // when + await handleStageAcquisition({ ...dependencies, assessment }); + + // then + expect(stageAcquisitionRepository.saveStages).to.not.have.been.called; + }); + }); + + context('there are associated stages', function () { + it('it should attempt to create new stages', async function () { + const assessment = domainBuilder.buildAssessment.ofTypeExam(); + const campaign = domainBuilder.buildCampaign({}); + const stages = [ + domainBuilder.buildStage({ targetProfileId: campaign.targetProfileId }), + domainBuilder.buildStage({ targetProfileId: campaign.targetProfileId }), + ]; + const campaignParticipation = domainBuilder.buildCampaignParticipation({ campaign: campaign }); + const knowledgeElements = [ + domainBuilder.buildKnowledgeElement({ id: 1, assessmentId: assessment.id, skillId: '1' }), + domainBuilder.buildKnowledgeElement({ id: 2, assessmentId: assessment.id, skillId: '2' }), + ]; + + // given + campaignParticipationRepository.get + .withArgs(assessment.campaignParticipationId) + .resolves(campaignParticipation); + stageRepository.getByCampaignParticipationId.withArgs(campaignParticipation.id).resolves(stages); + getNewAcquiredStagesService.getNewAcquiredStages.returns(stages); + stageAcquisitionRepository.getStageIdsByCampaignParticipation.withArgs(campaignParticipation.id).resolves([]); + knowledgeElementRepository.findUniqByUserId.withArgs({ userId: assessment.userId }).resolves(knowledgeElements); + campaignRepository.findSkillIdsByCampaignParticipationId + .withArgs({ + campaignParticipationId: assessment.campaignParticipationId, + }) + .resolves([1, 2, 3]); + + // when + await handleStageAcquisition({ ...dependencies, assessment }); + + // then + expect(stageAcquisitionRepository.saveStages).to.have.been.called; + }); + }); + + context('stages have levels', function () { + it('it should call convertLevelStagesIntoThresholdsService service', async function () { + const assessment = domainBuilder.buildAssessment.ofTypeExam(); + const campaign = domainBuilder.buildCampaign({}); + const skills = Symbol('skills'); + skillRepository.findOperativeByIds.returns(skills); + const stages = [ + domainBuilder.buildStage({ targetProfileId: campaign.targetProfileId, level: 1, threshold: null }), + domainBuilder.buildStage({ targetProfileId: campaign.targetProfileId, level: 2, threshold: null }), + ]; + const campaignParticipation = domainBuilder.buildCampaignParticipation({ campaign: campaign }); + const knowledgeElements = [ + domainBuilder.buildKnowledgeElement({ id: 1, assessmentId: assessment.id, skillId: '1' }), + domainBuilder.buildKnowledgeElement({ id: 2, assessmentId: assessment.id, skillId: '2' }), + ]; + campaignParticipationRepository.get + .withArgs(assessment.campaignParticipationId) + .resolves(campaignParticipation); + stageRepository.getByCampaignParticipationId.withArgs(campaignParticipation.id).resolves(stages); + getNewAcquiredStagesService.getNewAcquiredStages.returns(stages); + stageAcquisitionRepository.getStageIdsByCampaignParticipation.withArgs(campaignParticipation.id).resolves([]); + knowledgeElementRepository.findUniqByUserId.withArgs({ userId: assessment.userId }).resolves(knowledgeElements); + campaignRepository.findSkillIdsByCampaignParticipationId + .withArgs({ + campaignParticipationId: assessment.campaignParticipationId, + }) + .resolves([1, 2, 3]); + + // when + await handleStageAcquisition({ ...dependencies, assessment }); + + // then + expect(convertLevelStagesIntoThresholdsService.convertLevelStagesIntoThresholds).to.have.been.calledWithExactly( + stages, + skills, + ); + }); + }); + }); });