fix: distinguish missing career display contract

This commit is contained in:
Sai-karthik
2026-07-15 19:40:50 +00:00
parent 461b893fdc
commit fcbb93ca6a
2 changed files with 25 additions and 4 deletions

View File

@@ -174,6 +174,18 @@ assert.equal(reportWithMalformedDisplay.rqScore.display.status, "unavailable");
assert.equal(reportWithMalformedDisplay.rqScore.display.value, null);
assert.equal(reportWithMalformedDisplay.rqScore.display.reason, "display_contract_invalid");
const reportWithoutDisplay = buildCareerReportProjection({
profile: { status: "ready", data: {} },
qscore: { status: "ready", data: { ...qscore, breakdown: {} } },
qscoreHistory: { status: "ready", data: [] },
snapshots,
producerStatuses,
activity,
});
assert.equal(reportWithoutDisplay.rqScore.display.status, "unsupported");
assert.equal(reportWithoutDisplay.rqScore.display.value, null);
assert.equal(reportWithoutDisplay.rqScore.display.reason, "display_contract_missing");
const wrongCategoryId = structuredClone(displayFixture());
wrongCategoryId.categories[0].id = "not_a_canonical_category";
assert.equal(parseCareerReportDisplay(wrongCategoryId), null, "wrong category ids must be rejected");

View File

@@ -157,6 +157,10 @@ function unavailableField<T>(source: string, reason: string): CareerReportField<
return { status: "unavailable", source, value: null, updatedAt: null, reason };
}
function unsupportedField<T>(source: string, reason: string, updatedAt: string | null = null): CareerReportField<T> {
return { status: "unsupported", source, value: null, updatedAt, reason };
}
function scalarField(source: string, value: unknown, updatedAt: string | null = null): CareerReportField<string> {
if (value === undefined || value === null || (typeof value === "string" && !value.trim())) {
return { ...emptyField(source, null, "field_not_present"), updatedAt };
@@ -337,10 +341,15 @@ export function buildCareerReportProjection(input: {
let qscoreDisplay: CareerReportField<CareerReportDisplay>;
if (input.qscore.status === "ready") {
qscoreScore = readyField("qscore.current", input.qscore.data.rq_score, input.qscore.data.calculated_at || null);
const parsedDisplay = parseCareerReportDisplay(input.qscore.data.breakdown.display);
qscoreDisplay = parsedDisplay
? readyField("qscore.breakdown.display", parsedDisplay, input.qscore.data.calculated_at || null)
: { ...unavailableField<CareerReportDisplay>("qscore.breakdown.display", "display_contract_invalid"), updatedAt: input.qscore.data.calculated_at || null };
const rawDisplay = input.qscore.data.breakdown.display;
if (rawDisplay === undefined || rawDisplay === null) {
qscoreDisplay = unsupportedField("qscore.breakdown.display", "display_contract_missing", input.qscore.data.calculated_at || null);
} else {
const parsedDisplay = parseCareerReportDisplay(rawDisplay);
qscoreDisplay = parsedDisplay
? readyField("qscore.breakdown.display", parsedDisplay, input.qscore.data.calculated_at || null)
: { ...unavailableField<CareerReportDisplay>("qscore.breakdown.display", "display_contract_invalid"), updatedAt: input.qscore.data.calculated_at || null };
}
} else if (input.qscore.status === "empty") {
qscoreScore = emptyField<number>("qscore.current", null, "no_qscore_run");
qscoreDisplay = emptyField<CareerReportDisplay>("qscore.breakdown.display", null, "no_qscore_run");