Skip to content

Commit fb387d4

Browse files
alexandrecoinyaf
authored andcommitted
bugfix(api): add script to re-finalize not fully finalized ession
1 parent 9d8503d commit fb387d4

File tree

2 files changed

+128
-0
lines changed

2 files changed

+128
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import 'dotenv/config';
2+
3+
import { usecases } from '../../src/certification/session-management/domain/usecases/index.js';
4+
import * as sessionRepository from '../../src/certification/session-management/infrastructure/repositories/session-repository.js';
5+
import * as certificationReportRepository from '../../src/certification/shared/infrastructure/repositories/certification-report-repository.js';
6+
import { Script } from '../../src/shared/application/scripts/script.js';
7+
import { ScriptRunner } from '../../src/shared/application/scripts/script-runner.js';
8+
import { DomainTransaction } from '../../src/shared/domain/DomainTransaction.js';
9+
10+
export class FixNotFullyFinalizedSession extends Script {
11+
constructor() {
12+
super({
13+
description: 'Re-finalize session without finalized-session entry',
14+
permanent: false,
15+
options: {
16+
sessionId: {
17+
type: 'integer',
18+
describe: 'Id of the session to be finalized',
19+
demandOption: true,
20+
requiresArg: true,
21+
},
22+
},
23+
});
24+
}
25+
26+
async handle({
27+
options,
28+
logger,
29+
finalizeSession = usecases.finalizeSession,
30+
unfinalizeSession = usecases.unfinalizeSession,
31+
processAutoJury = usecases.processAutoJury,
32+
registerPublishableSession = usecases.registerPublishableSession,
33+
} = {}) {
34+
await DomainTransaction.execute(async () => {
35+
const { sessionId } = options;
36+
this.logger = logger;
37+
38+
this.logger.info(`Updating session ${sessionId}.`);
39+
40+
await unfinalizeSession({ sessionId });
41+
42+
const { examinerGlobalComment, hasIncident, hasJoiningIssue } = await sessionRepository.get({ id: sessionId });
43+
const certificationReports = await certificationReportRepository.findBySessionId({ sessionId });
44+
45+
const sessionFinalized = await finalizeSession({
46+
sessionId,
47+
certificationReports,
48+
examinerGlobalComment,
49+
hasIncident,
50+
hasJoiningIssue,
51+
});
52+
53+
const autoJuryDone = await processAutoJury({ sessionFinalized });
54+
55+
await registerPublishableSession({ autoJuryDone });
56+
57+
this.logger.info(`${sessionId} finalized`);
58+
59+
return 0;
60+
});
61+
}
62+
}
63+
64+
await ScriptRunner.execute(import.meta.url, FixNotFullyFinalizedSession);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import { FixNotFullyFinalizedSession } from '../../../../scripts/certification/fix-not-fully-finalized-session.js';
2+
import { databaseBuilder, expect, knex, sinon } from '../../../test-helper.js';
3+
4+
describe('Integration | Scripts | Certification | fix not fully finalized session', function () {
5+
let assessment, certificationCourse, session, fixNotFullyFinalizedSessionScript, logger;
6+
7+
beforeEach(async function () {
8+
session = databaseBuilder.factory.buildSession({
9+
version: 2,
10+
finalizedAt: new Date('2024-01-02T00:00:00Z'),
11+
});
12+
const user = databaseBuilder.factory.buildUser();
13+
databaseBuilder.factory.buildCertificationCandidate({
14+
sessionId: session.id,
15+
userId: user.id,
16+
});
17+
certificationCourse = databaseBuilder.factory.buildCertificationCourse({
18+
createdAt: new Date('2024-02-01T00:00:00Z'),
19+
sessionId: session.id,
20+
userId: user.id,
21+
completedAt: new Date('2024-02-01T08:00:00Z'),
22+
isPublished: false,
23+
isCancelled: false,
24+
abortReason: null,
25+
version: 2,
26+
isRejectedForFraud: false,
27+
endedAt: null,
28+
});
29+
assessment = databaseBuilder.factory.buildAssessment({
30+
certificationCourseId: certificationCourse.id,
31+
userId: user.id,
32+
type: 'CERTIFICATION',
33+
state: 'completed',
34+
method: 'CERTIFICATION_DETERMINED',
35+
});
36+
databaseBuilder.factory.buildAssessmentResult({
37+
assessmentId: assessment.id,
38+
userId: user.id,
39+
type: 'CERTIFICATION',
40+
status: 'validated',
41+
});
42+
43+
await databaseBuilder.commit();
44+
45+
logger = { info: sinon.stub() };
46+
fixNotFullyFinalizedSessionScript = new FixNotFullyFinalizedSession();
47+
});
48+
49+
it('creates a finalized session', async function () {
50+
// when
51+
await fixNotFullyFinalizedSessionScript.handle({
52+
options: { sessionId: session.id },
53+
logger,
54+
});
55+
56+
// then
57+
const { count: finalizedSessionCount } = await knex('finalized-sessions')
58+
.where({ sessionId: session.id })
59+
.count()
60+
.first();
61+
62+
expect(finalizedSessionCount).to.equal(1);
63+
});
64+
});

0 commit comments

Comments
 (0)