Skip to content

Commit

Permalink
[FEATURE] Mise à jour du wording lors du défocus pour candidats avec …
Browse files Browse the repository at this point in the history
…besoins d'ajustements (PIX-14428). (#10258)

Co-authored-by: Guillaume Lagorce <[email protected]>
  • Loading branch information
alexandrecoin and HEYGUL authored Oct 9, 2024
1 parent bcbfaf1 commit 58c6592
Show file tree
Hide file tree
Showing 25 changed files with 714 additions and 80 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ const retrieveLastOrCreateCertificationCourse = async function ({
);

if (existingCertificationCourse) {
existingCertificationCourse.adjustForAccessibility(certificationCandidate.accessibilityAdjustmentNeeded);

return {
created: false,
certificationCourse: existingCertificationCourse,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ const serialize = function (certificationCourse) {
'firstName',
'lastName',
'version',
'isAdjustedForAccessibility',
],
assessment: {
ref: 'id',
Expand Down
12 changes: 12 additions & 0 deletions api/src/certification/shared/domain/models/CertificationCourse.js
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ class CertificationCourse {
numberOfChallenges,
version = CERTIFICATION_VERSIONS.V2,
isRejectedForFraud = false,
isAdjustedForAccessibility,
lang,
} = {}) {
this._id = id;
Expand Down Expand Up @@ -69,6 +70,7 @@ class CertificationCourse {
this._abortReason = abortReason;
this._complementaryCertificationCourses = complementaryCertificationCourses;
this._isRejectedForFraud = isRejectedForFraud;
this._isAdjustedForAccessibility = isAdjustedForAccessibility;
this._numberOfChallenges = numberOfChallenges;
this._lang = lang;
}
Expand All @@ -95,6 +97,7 @@ class CertificationCourse {
sex: certificationCandidate.sex,
birthplace: certificationCandidate.birthCity,
externalId: certificationCandidate.externalId,
isAdjustedForAccessibility: certificationCandidate.accessibilityAdjustmentNeeded,
challenges,
numberOfChallenges,
verificationCode,
Expand Down Expand Up @@ -144,6 +147,14 @@ class CertificationCourse {
return this._isRejectedForFraud;
}

adjustForAccessibility(isAdjustmentNeeded) {
this._isAdjustedForAccessibility = !!isAdjustmentNeeded;
}

isAdjustementNeeded() {
return this._isAdjustedForAccessibility;
}

abort(reason) {
const { error } = Joi.string()
.valid(...Object.values(ABORT_REASONS))
Expand Down Expand Up @@ -303,6 +314,7 @@ class CertificationCourse {
completedAt: this._completedAt,
isPublished: this._isPublished,
isRejectedForFraud: this._isRejectedForFraud,
isAdjustedForAccessibility: this._isAdjustedForAccessibility,
verificationCode: this._verificationCode,
assessment: this._assessment,
challenges: this._challenges,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ async function get({ id }) {

const challengesDTO = await _findAllChallenges(id, knexConn);

let accessibilityAdjustmentNeeded;
if (certificationCourseDTO.version === 3) {
const configuration = await _getV3ConfigurationForCertificationCreationDate(
certificationCourseDTO.createdAt,
Expand All @@ -100,6 +101,14 @@ async function get({ id }) {

certificationCourseDTO.numberOfChallenges =
configuration?.maximumAssessmentLength ?? config.v3Certification.numberOfChallengesPerCourse;

({ accessibilityAdjustmentNeeded } = await knexConn('certification-candidates')
.select('accessibilityAdjustmentNeeded')
.where({
userId: certificationCourseDTO.userId,
sessionId: certificationCourseDTO.sessionId,
})
.first());
}

return _toDomain({
Expand All @@ -108,6 +117,7 @@ async function get({ id }) {
assessmentDTO,
complementaryCertificationCoursesDTO,
certificationIssueReportsDTO,
accessibilityAdjustmentNeeded,
});
}

Expand All @@ -117,6 +127,7 @@ function _toDomain({
assessmentDTO = {},
complementaryCertificationCoursesDTO = [],
certificationIssueReportsDTO = [],
accessibilityAdjustmentNeeded,
}) {
const complementaryCertificationCourses = complementaryCertificationCoursesDTO.map(
(complementaryCertificationCourseDTO) => new ComplementaryCertificationCourse(complementaryCertificationCourseDTO),
Expand All @@ -134,6 +145,7 @@ function _toDomain({
challenges: challengesDTO,
complementaryCertificationCourses,
certificationIssueReports,
isAdjustedForAccessibility: accessibilityAdjustmentNeeded,
});
}

Expand Down Expand Up @@ -243,6 +255,7 @@ function _adaptModelToDb(certificationCourse) {
'challenges',
'createdAt',
'numberOfChallenges',
'isAdjustedForAccessibility',
]);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ describe('Acceptance | API | Certification Course', function () {
'nb-challenges': 0,
'first-name': certificationCourse.firstName,
'last-name': certificationCourse.lastName,
'is-adjusted-for-accessibility': undefined,
version: certificationCourse.version,
},
relationships: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -426,13 +426,19 @@ describe('Integration | Certification | Application | jobs | CertificationComple
const limitDate = new Date('2020-01-01T00:00:00Z');
const certifiableUserId = databaseBuilder.factory.buildUser().id;

const certificationCourseId = databaseBuilder.factory.buildCertificationCourse({
const certificationCourse = databaseBuilder.factory.buildCertificationCourse({
userId: certifiableUserId,
createdAt: limitDate,
version: 3,
}).id;
});

databaseBuilder.factory.buildCertificationCandidate({
userId: certifiableUserId,
sessionId: certificationCourse.sessionId,
});

const certificationAssessment = databaseBuilder.factory.buildAssessment({
certificationCourseId,
certificationCourseId: certificationCourse.id,
userId: certifiableUserId,
state: Assessment.states.STARTED,
type: Assessment.types.CERTIFICATION,
Expand All @@ -441,14 +447,14 @@ describe('Integration | Certification | Application | jobs | CertificationComple

_buildValidAnswersAndCertificationChallenges({
assessmentId: certificationAssessment.id,
certificationCourseId,
certificationCourseId: certificationCourse.id,
});

await databaseBuilder.commit();

const data = new CertificationCompletedJob({
assessmentId: certificationAssessment.id,
certificationCourseId,
certificationCourseId: certificationCourse.id,
userId: certifiableUserId,
locale: LOCALE.FRENCH_FRANCE,
});
Expand All @@ -472,13 +478,19 @@ describe('Integration | Certification | Application | jobs | CertificationComple
const limitDate = new Date('2020-01-01T00:00:00Z');
const certifiableUserId = databaseBuilder.factory.buildUser().id;

const certificationCourseId = databaseBuilder.factory.buildCertificationCourse({
const certificationCourse = databaseBuilder.factory.buildCertificationCourse({
userId: certifiableUserId,
createdAt: limitDate,
version: 3,
}).id;
});

databaseBuilder.factory.buildCertificationCandidate({
userId: certifiableUserId,
sessionId: certificationCourse.sessionId,
});

const certificationAssessment = databaseBuilder.factory.buildAssessment({
certificationCourseId,
certificationCourseId: certificationCourse.id,
userId: certifiableUserId,
state: Assessment.states.STARTED,
type: Assessment.types.CERTIFICATION,
Expand All @@ -487,14 +499,14 @@ describe('Integration | Certification | Application | jobs | CertificationComple

_buildValidAnswersAndCertificationChallenges({
assessmentId: certificationAssessment.id,
certificationCourseId,
certificationCourseId: certificationCourse.id,
});

await databaseBuilder.commit();

const data = new CertificationCompletedJob({
assessmentId: certificationAssessment.id,
certificationCourseId,
certificationCourseId: certificationCourse.id,
userId: certifiableUserId,
locale: LOCALE.FRENCH_FRANCE,
});
Expand All @@ -510,7 +522,7 @@ describe('Integration | Certification | Application | jobs | CertificationComple
'certification-challenge-capacities.certificationChallengeId',
)
.where({
courseId: certificationCourseId,
courseId: certificationCourse.id,
});

expect(certificationChallengeCapacities.length).to.equal(9);
Expand All @@ -522,13 +534,19 @@ describe('Integration | Certification | Application | jobs | CertificationComple
const limitDate = new Date('2020-01-01T00:00:00Z');
const certifiableUserId = databaseBuilder.factory.buildUser().id;

const certificationCourseId = databaseBuilder.factory.buildCertificationCourse({
const certificationCourse = databaseBuilder.factory.buildCertificationCourse({
userId: certifiableUserId,
createdAt: limitDate,
version: 3,
}).id;
});

databaseBuilder.factory.buildCertificationCandidate({
userId: certifiableUserId,
sessionId: certificationCourse.sessionId,
});

const certificationAssessment = databaseBuilder.factory.buildAssessment({
certificationCourseId,
certificationCourseId: certificationCourse.id,
userId: certifiableUserId,
state: Assessment.states.STARTED,
type: Assessment.types.CERTIFICATION,
Expand All @@ -537,15 +555,15 @@ describe('Integration | Certification | Application | jobs | CertificationComple

_buildValidAnswersAndCertificationChallenges({
assessmentId: certificationAssessment.id,
certificationCourseId,
certificationCourseId: certificationCourse.id,
difficulty: 9,
});

await databaseBuilder.commit();

const data = new CertificationCompletedJob({
assessmentId: certificationAssessment.id,
certificationCourseId,
certificationCourseId: certificationCourse.id,
userId: certifiableUserId,
locale: LOCALE.FRENCH_FRANCE,
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
} from '../../../../test-helper.js';
import { createSuccessfulCertificationCourse } from '../../../shared/fixtures/certification-course.js';

describe('Certification | Session Management | Unit | Application | Routes | Certification Course', function () {
describe('Certification | Session Management | Acceptance | Application | Routes | Certification Course', function () {
describe('PATCH /api/admin/certification-courses/{certificationCourseId}', function () {
context('when the user does not have role super admin', function () {
it('should return 403 HTTP status code', async function () {
Expand Down Expand Up @@ -217,6 +217,11 @@ describe('Certification | Session Management | Unit | Application | Routes | Cer
version: 3,
});

databaseBuilder.factory.buildCertificationCandidate({
userId: userId,
sessionId: certificationCourse.sessionId,
});

const { assessment, assessmentResult } = await createSuccessfulCertificationCourse({
userId,
certificationCourse,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ describe('Integration | Repository | Certification Course', function () {
const userId = databaseBuilder.factory.buildUser().id;
const sessionId = databaseBuilder.factory.buildSession({ version: 3 }).id;

databaseBuilder.factory.buildCertificationCandidate({ userId, sessionId });
certificationCourse = domainBuilder.buildCertificationCourse.unpersisted({
userId,
sessionId,
Expand Down Expand Up @@ -221,7 +222,7 @@ describe('Integration | Repository | Certification Course', function () {
context('When the certification course is v3', function () {
it('should retrieve the number of challenges from the configuration', async function () {
const maximumAssessmentLength = 10;
const { expectedCertificationCourse } = _buildCertificationCourse({
const { expectedCertificationCourse, certificationCandidate } = _buildCertificationCourse({
description,
version: 3,
createdAt: new Date('2022-01-03'),
Expand Down Expand Up @@ -253,6 +254,9 @@ describe('Integration | Repository | Certification Course', function () {

// then
expect(actualCertificationCourse.getNumberOfChallenges()).to.equal(maximumAssessmentLength);
expect(actualCertificationCourse.isAdjustementNeeded()).to.equal(
certificationCandidate.accessibilityAdjustmentNeeded,
);
});
});
});
Expand Down Expand Up @@ -538,6 +542,11 @@ describe('Integration | Repository | Certification Course', function () {
function _buildCertificationCourse({ createdAt, description, version = 2 }) {
const userId = databaseBuilder.factory.buildUser().id;
const sessionId = databaseBuilder.factory.buildSession().id;
const certificationCandidate = databaseBuilder.factory.buildCertificationCandidate({
userId,
sessionId,
accessibilityAdjustmentNeeded: true,
});
const expectedCertificationCourse = databaseBuilder.factory.buildCertificationCourse({
userId,
sessionId,
Expand Down Expand Up @@ -605,5 +614,6 @@ function _buildCertificationCourse({ createdAt, description, version = 2 }) {
userId,
sessionId,
expectedCertificationCourse,
certificationCandidate,
};
}
Original file line number Diff line number Diff line change
Expand Up @@ -385,4 +385,34 @@ describe('Unit | Domain | Models | CertificationCourse', function () {
expect(isAvailable).to.be.false;
});
});

describe('#adjustForAccessibility', function () {
describe('when an adjustment is needed', function () {
it('sets the certification adjustment property to true', function () {
// given
const certificationCourse = new CertificationCourse();
const isAdjustmentNeeded = true;

// when
certificationCourse.adjustForAccessibility(isAdjustmentNeeded);

// then
expect(certificationCourse.isAdjustementNeeded()).to.be.true;
});
});

describe('when an adjustment is not needed', function () {
it('sets the certification adjustment property to false', function () {
// given
const certificationCourse = new CertificationCourse();
const isAdjustmentNeeded = false;

// when
certificationCourse.adjustForAccessibility(isAdjustmentNeeded);

// then
expect(certificationCourse.isAdjustementNeeded()).to.be.false;
});
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ function buildCertificationCourse({
complementaryCertificationCourses = [],
maxReachableLevelOnCertificationDate = 7,
numberOfChallenges = 20,
isAdjustedForAccessibility = false,
lang,
} = {}) {
const certificationIssueReports = [];
Expand Down Expand Up @@ -75,6 +76,7 @@ function buildCertificationCourse({
complementaryCertificationCourses,
maxReachableLevelOnCertificationDate,
numberOfChallenges,
isAdjustedForAccessibility,
lang,
});
}
Expand Down
Loading

0 comments on commit 58c6592

Please sign in to comment.