Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions __tests__/shared/utils/mm-review-summations.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -182,4 +182,72 @@ describe('buildMmSubmissionData', () => {
}),
]);
});

it('does not treat example summations as provisional or final scores', () => {
const reviewSummations = [
{
aggregateScore: 73.14798973137148,
id: 'summation-system',
isFinal: true,
metadata: {
testType: 'system',
},
reviewedDate: '2026-05-26T06:52:08.038Z',
submissionId: 'submission-latest',
submitterHandle: 'topacc_four',
submitterId: '1004',
},
{
aggregateScore: 76.16139684222824,
id: 'summation-example',
isExample: true,
metadata: {
testType: 'example',
},
reviewedDate: '2026-05-26T06:04:39.123Z',
submissionId: 'submission-latest',
submitterHandle: 'topacc_four',
submitterId: '1004',
},
{
aggregateScore: 69.13482014723114,
id: 'summation-provisional',
isProvisional: true,
metadata: {
testType: 'provisional',
},
reviewedDate: '2026-05-26T06:03:55.171Z',
submissionId: 'submission-latest',
submitterHandle: 'topacc_four',
submitterId: '1004',
},
];

const rawSubmissions = [
{
createdAt: '2026-05-26T06:02:59.385Z',
id: 'submission-latest',
isLatest: true,
memberId: '1004',
registrant: {
memberHandle: 'topacc_four',
memberId: '1004',
},
},
];

const result = buildMmSubmissionData(reviewSummations, rawSubmissions);

expect(result).toHaveLength(1);
expect(result[0].submissions).toEqual([
expect.objectContaining({
finalScore: 73.14798973137148,
provisionalScore: 69.13482014723114,
reviewSummations: expect.arrayContaining([
expect.objectContaining({ id: 'summation-example' }),
]),
submissionId: 'submission-latest',
}),
]);
});
});
29 changes: 20 additions & 9 deletions src/shared/utils/mm-review-summations.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,21 +28,29 @@ function getSummationScoreClassification(summation) {
const type = _.toLower(_.toString(_.get(summation, 'type', '')).trim());
const stage = _.toLower(_.toString(_.get(metadata, 'stage', '')).trim());
const testType = _.toLower(_.toString(_.get(metadata, 'testType', '')).trim());

const isProvisional = Boolean(
const isExample = Boolean(
_.get(summation, 'isExample')
|| _.get(summation, 'is_example')
|| type === 'example'
|| testType === 'example',
);
const hasProvisionalMarker = Boolean(
_.get(summation, 'isProvisional')
|| _.get(summation, 'is_provisional')
|| type === 'provisional'
|| testType === 'provisional',
);
const isFinal = Boolean(
const hasFinalMarker = Boolean(
_.get(summation, 'isFinal')
|| _.get(summation, 'is_final')
|| type === 'final'
|| stage === 'final',
);
const isProvisional = !isExample && hasProvisionalMarker;
const isFinal = !isExample && hasFinalMarker;

return {
isExample,
isProvisional,
isFinal,
};
Expand Down Expand Up @@ -263,6 +271,7 @@ function updateSubmissionEntry(
timestampValue,
normalizedScore,
summation,
isFinal,
isProvisional,
isLatest,
},
Expand Down Expand Up @@ -302,14 +311,14 @@ function updateSubmissionEntry(
)
: { meta: baseEntry.provisionalMeta, value: baseEntry.provisionalScore };

const finalResult = isProvisional
? { meta: baseEntry.finalMeta, value: baseEntry.finalScore }
: mergeScoreData(
const finalResult = isFinal
? mergeScoreData(
baseEntry.finalMeta,
baseEntry.finalScore,
normalizedScore,
timestampValue,
);
)
: { meta: baseEntry.finalMeta, value: baseEntry.finalScore };

const reviewSummations = [...baseEntry.reviewSummations, summation];

Expand Down Expand Up @@ -577,8 +586,9 @@ export function buildMmSubmissionData(reviewSummations = [], rawSubmissions = []
);
const scoreType = getSummationScoreClassification(summation);
// Most MM review summations are provisional updates; if an entry does not
// explicitly identify itself as final, treat it as provisional.
const isProvisional = scoreType.isProvisional || !scoreType.isFinal;
// explicitly identify itself as final or example, treat it as provisional.
const isProvisional = scoreType.isProvisional
|| (!scoreType.isFinal && !scoreType.isExample);
const isLatest = _.isNil(summation.isLatest)
? null
: Boolean(summation.isLatest);
Expand All @@ -591,6 +601,7 @@ export function buildMmSubmissionData(reviewSummations = [], rawSubmissions = []
timestampValue,
normalizedScore,
summation,
isFinal: scoreType.isFinal,
isProvisional,
isLatest,
},
Expand Down
Loading