forked from Yara724/api
123 lines
3.5 KiB
TypeScript
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]);
|
|
});
|
|
});
|