From fcbb93ca6a3988f56935bfc948b4c4cbefa477eb Mon Sep 17 00:00:00 2001 From: Sai-karthik Date: Wed, 15 Jul 2026 19:40:50 +0000 Subject: [PATCH] fix: distinguish missing career display contract --- scripts/career-report.test.ts | 12 ++++++++++++ src/v1/analytics/career-report.ts | 17 +++++++++++++---- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/scripts/career-report.test.ts b/scripts/career-report.test.ts index df6c019..e599e75 100644 --- a/scripts/career-report.test.ts +++ b/scripts/career-report.test.ts @@ -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"); diff --git a/src/v1/analytics/career-report.ts b/src/v1/analytics/career-report.ts index 2a7387b..05dc50d 100644 --- a/src/v1/analytics/career-report.ts +++ b/src/v1/analytics/career-report.ts @@ -157,6 +157,10 @@ function unavailableField(source: string, reason: string): CareerReportField< return { status: "unavailable", source, value: null, updatedAt: null, reason }; } +function unsupportedField(source: string, reason: string, updatedAt: string | null = null): CareerReportField { + return { status: "unsupported", source, value: null, updatedAt, reason }; +} + function scalarField(source: string, value: unknown, updatedAt: string | null = null): CareerReportField { 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; 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("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("qscore.breakdown.display", "display_contract_invalid"), updatedAt: input.qscore.data.calculated_at || null }; + } } else if (input.qscore.status === "empty") { qscoreScore = emptyField("qscore.current", null, "no_qscore_run"); qscoreDisplay = emptyField("qscore.breakdown.display", null, "no_qscore_run");