fix: distinguish missing career display contract
This commit is contained in:
@@ -174,6 +174,18 @@ assert.equal(reportWithMalformedDisplay.rqScore.display.status, "unavailable");
|
|||||||
assert.equal(reportWithMalformedDisplay.rqScore.display.value, null);
|
assert.equal(reportWithMalformedDisplay.rqScore.display.value, null);
|
||||||
assert.equal(reportWithMalformedDisplay.rqScore.display.reason, "display_contract_invalid");
|
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());
|
const wrongCategoryId = structuredClone(displayFixture());
|
||||||
wrongCategoryId.categories[0].id = "not_a_canonical_category";
|
wrongCategoryId.categories[0].id = "not_a_canonical_category";
|
||||||
assert.equal(parseCareerReportDisplay(wrongCategoryId), null, "wrong category ids must be rejected");
|
assert.equal(parseCareerReportDisplay(wrongCategoryId), null, "wrong category ids must be rejected");
|
||||||
|
|||||||
@@ -157,6 +157,10 @@ function unavailableField<T>(source: string, reason: string): CareerReportField<
|
|||||||
return { status: "unavailable", source, value: null, updatedAt: null, reason };
|
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> {
|
function scalarField(source: string, value: unknown, updatedAt: string | null = null): CareerReportField<string> {
|
||||||
if (value === undefined || value === null || (typeof value === "string" && !value.trim())) {
|
if (value === undefined || value === null || (typeof value === "string" && !value.trim())) {
|
||||||
return { ...emptyField(source, null, "field_not_present"), updatedAt };
|
return { ...emptyField(source, null, "field_not_present"), updatedAt };
|
||||||
@@ -337,10 +341,15 @@ export function buildCareerReportProjection(input: {
|
|||||||
let qscoreDisplay: CareerReportField<CareerReportDisplay>;
|
let qscoreDisplay: CareerReportField<CareerReportDisplay>;
|
||||||
if (input.qscore.status === "ready") {
|
if (input.qscore.status === "ready") {
|
||||||
qscoreScore = readyField("qscore.current", input.qscore.data.rq_score, input.qscore.data.calculated_at || null);
|
qscoreScore = readyField("qscore.current", input.qscore.data.rq_score, input.qscore.data.calculated_at || null);
|
||||||
const parsedDisplay = parseCareerReportDisplay(input.qscore.data.breakdown.display);
|
const rawDisplay = input.qscore.data.breakdown.display;
|
||||||
qscoreDisplay = parsedDisplay
|
if (rawDisplay === undefined || rawDisplay === null) {
|
||||||
? readyField("qscore.breakdown.display", parsedDisplay, input.qscore.data.calculated_at || null)
|
qscoreDisplay = unsupportedField("qscore.breakdown.display", "display_contract_missing", input.qscore.data.calculated_at || null);
|
||||||
: { ...unavailableField<CareerReportDisplay>("qscore.breakdown.display", "display_contract_invalid"), updatedAt: 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") {
|
} else if (input.qscore.status === "empty") {
|
||||||
qscoreScore = emptyField<number>("qscore.current", null, "no_qscore_run");
|
qscoreScore = emptyField<number>("qscore.current", null, "no_qscore_run");
|
||||||
qscoreDisplay = emptyField<CareerReportDisplay>("qscore.breakdown.display", null, "no_qscore_run");
|
qscoreDisplay = emptyField<CareerReportDisplay>("qscore.breakdown.display", null, "no_qscore_run");
|
||||||
|
|||||||
Reference in New Issue
Block a user