1
0
forked from Yara724/api
Files
yara724-api/src/helpers/outer-damage-parts-resolve.spec.ts
2026-05-18 17:14:45 +03:30

123 lines
3.5 KiB
TypeScript

import { ClaimVehicleTypeV2 } from "src/static/outer-car-parts-catalog";
import { buildCoefficientsFromPartSeverities } from "./claim-price-drop";
import {
catalogPartIdFromSelectedPart,
resolveCatalogPartByPartId,
resolvePartForExpertReply,
resolveSelectedPartByPartId,
sanitizeDamageSelectedPartV2,
type DamageSelectedPartV2,
} from "./outer-damage-parts";
describe("resolveSelectedPartByPartId", () => {
const selected: DamageSelectedPartV2[] = [
{
id: 12,
name: "backfender",
side: "left",
label_fa: "گلگیر",
catalogKey: "left_backfender",
},
{
id: null,
name: "hood",
side: "front",
label_fa: "کاپوت",
},
];
it("resolves by numeric catalog id", () => {
expect(resolveSelectedPartByPartId(12, selected)).toBe(selected[0]);
});
it("resolves legacy id:N string input", () => {
expect(resolveSelectedPartByPartId("id:12", selected)).toBe(selected[0]);
});
it("resolves by index:N", () => {
expect(resolveSelectedPartByPartId("index:1", selected)).toBe(selected[1]);
});
it("exposes catalog id as numeric partId", () => {
expect(catalogPartIdFromSelectedPart(selected[0])).toBe(12);
});
it("resolves catalog id from outer catalog when not on claim", () => {
const hit = resolveCatalogPartByPartId(201, ClaimVehicleTypeV2.HATCHBACK);
expect(hit?.id).toBe(201);
expect(hit?.side).toBe("left");
expect(hit?.catalogKey).toBe("left_backfender");
});
it("resolvePartForExpertReply uses catalog for new expert line", () => {
const hit = resolvePartForExpertReply(
201,
[],
ClaimVehicleTypeV2.HATCHBACK,
);
expect(hit?.id).toBe(201);
});
it("sanitize fixes Persian side and re-hydrates from catalog id", () => {
const fixed = sanitizeDamageSelectedPartV2(
{
id: 201,
name: "گلگیر عقب (چپ)",
side: "چپ",
label_fa: "",
catalogKey: "چپ",
},
ClaimVehicleTypeV2.HATCHBACK,
);
expect(fixed.side).toBe("left");
expect(fixed.name).toBe("backfender");
expect(fixed.catalogKey).toBe("left_backfender");
expect(catalogPartIdFromSelectedPart(fixed)).toBe(201);
});
it("internal parts have null catalog partId", () => {
const row = sanitizeDamageSelectedPartV2({
id: 99,
name: "قاب موتور",
side: "internal",
label_fa: "قاب موتور",
});
expect(row.id).toBeNull();
expect(catalogPartIdFromSelectedPart(row)).toBeNull();
});
it("recovers outer part wrongly stored as internal with Persian label", () => {
const fixed = sanitizeDamageSelectedPartV2(
{
id: null,
name: "گلگیر عقب (چپ)",
side: "internal",
label_fa: "گلگیر عقب (چپ)",
},
ClaimVehicleTypeV2.HATCHBACK,
);
expect(fixed.id).toBe(201);
expect(fixed.side).toBe("left");
expect(fixed.name).toBe("backfender");
expect(fixed.catalogKey).toBe("left_backfender");
});
it("price drop resolves catalog id when claim row is corrupt", () => {
const corrupt: DamageSelectedPartV2[] = [
{
id: null,
name: "گلگیر عقب (چپ)",
side: "internal",
label_fa: "گلگیر عقب (چپ)",
},
];
const { coefficients, errors } = buildCoefficientsFromPartSeverities(
corrupt,
[{ partId: 201, severity: "Minor" }],
ClaimVehicleTypeV2.HATCHBACK,
);
expect(errors).toHaveLength(0);
expect(coefficients).toEqual([2]);
});
});