Skip to content

Commit

Permalink
feat(api): make stage acquisition work for exam
Browse files Browse the repository at this point in the history
  • Loading branch information
laura-bergoens committed Feb 28, 2025
1 parent ece23eb commit 515b299
Show file tree
Hide file tree
Showing 2 changed files with 101 additions and 2 deletions.
2 changes: 1 addition & 1 deletion api/lib/domain/usecases/stages/handle-stage-acquisition.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
101 changes: 100 additions & 1 deletion api/tests/unit/domain/usecases/handle-stage-acquisition_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down Expand Up @@ -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,
);
});
});
});
});

0 comments on commit 515b299

Please sign in to comment.