Files
yara724-api/src/lookups/fanavaran-last-car-policy.spec.ts

505 lines
13 KiB
TypeScript

import {
canReuseCachedFanavaranVehicleIds,
collectPartyVinCandidates,
fanavaranIdOrConfigDefault,
fanavaranPayloadMatchesDamagedIdentity,
fanavaranVehicleMatchesDamagedIdentity,
filterPoliciesByLine,
applyFanavaranManualPayloadOverrides,
resolveDamageCasePlaqueLookupIds,
insuranceLineLabel,
parseLastCarPolicyInput,
pickFanavaranPlaqueLookupFields,
pickFanavaranVehicleFromInquiry,
pickVehicleId,
pickVinFromPartyVehicle,
plaqueLetterFromMiddleCode,
plaqueMatchesVehicle,
selectFanavaranVehicleForDamageCase,
selectLastAmongCarMatches,
toAppPlaque,
vehicleMatchesCar,
} from "./fanavaran-last-car-policy";
describe("fanavaran last car policy", () => {
const today = "2026-09-05";
it("parses national code and prefers VIN when both identifiers are sent", () => {
const parsed = parseLastCarPolicyInput({
nationalCode: "۰۰۱۲۳۴۵۶۷۸",
vin: " irnkaek4150012345 ",
plaqueLeft: "12",
plaqueLetter: "ب",
plaqueRight: "345",
plaqueSerial: "67",
});
expect(parsed).toEqual({
nationalCode: "0012345678",
vin: "IRNKAEK4150012345",
plaque: { left: "12", letter: "ب", right: "345", serial: "67" },
});
});
it("rejects a partial plaque when VIN is missing", () => {
const parsed = parseLastCarPolicyInput({
nationalCode: "0012345678",
plaqueLeft: "12",
plaqueLetter: "ب",
});
expect(parsed).toEqual({
error:
"plaque requires all four parts: plaqueLeft, plaqueLetter, plaqueRight, plaqueSerial",
});
});
it("maps insurance line ids to CAR_BODY and THIRD_PARTY", () => {
expect(insuranceLineLabel(4)).toBe("CAR_BODY");
expect(insuranceLineLabel(5)).toBe("THIRD_PARTY");
});
it("converts PlaqueMiddleCodeId 5 to د and builds app plaque parts", () => {
expect(plaqueLetterFromMiddleCode(5)).toBe("د");
expect(
toAppPlaque({
PlaqueLeftNo: "29",
PlaqueMiddleCodeId: 5,
PlaqueRightNo: "782",
PlaqueSerial: "60",
}),
).toEqual({
leftTwoDigits: "29",
serialLetter: "د",
threeDigits: "782",
rightTwoDigits: "60",
});
});
it("keeps only the requested insurance line", () => {
const rows = filterPoliciesByLine(
[
{ PolicyId: 1, InsuranceLineId: 5, EndDate: "1405/01/01" },
{ PolicyId: 2, InsuranceLineId: 4, EndDate: "1405/01/01" },
{ PolicyId: 3, EndDate: "1405/01/01" },
],
5,
);
expect(rows.map((row) => row.PolicyId)).toEqual([1, 3]);
});
it("reads VehicleId from a one-item inquiry-by-vin array", () => {
expect(pickVehicleId([{ Id: 4118289, VIN: "NAAR03HFFRDE07024" }])).toBe(
4118289,
);
});
it("picks the inquiry row matching policy VehicleId and VIN from the party", () => {
const inquired = [
{ Id: 1, UsedId: 1, VehicleKindId: 10 },
{
Id: 3379978,
UsedId: 84,
VehicleKindId: 5950,
VIN: "NAS451100P4934023",
},
];
expect(pickFanavaranVehicleFromInquiry(inquired, 3379978)).toEqual(
inquired[1],
);
expect(
pickVinFromPartyVehicle({
vehicle: { vin: "nas451100p4934023" },
}),
).toBe("NAS451100P4934023");
expect(
pickVinFromPartyVehicle({
vehicle: {
inquiry: { mapped: { VIN: "NAS451100P4934023" } },
},
}),
).toBe("NAS451100P4934023");
});
it("does not let chassis stored on vehicle.vin beat the inquiry VIN", () => {
const party = {
vehicle: {
vin: "NAAN01CA9BK493683",
inquiry: {
mapped: {
VIN: "IRFC901V119493683",
ChassisNo: "NAAN01CA9BK493683",
},
},
},
};
expect(pickVinFromPartyVehicle(party)).toBe("IRFC901V119493683");
expect(collectPartyVinCandidates(party)).toEqual([
"IRFC901V119493683",
"NAAN01CA9BK493683",
]);
});
it("prefers the VIN-inquiry row that already has PlaqueKindId", () => {
expect(
pickFanavaranVehicleFromInquiry([
{ Id: 1, VIN: "IRFC901V119493683" },
{ Id: 2, VIN: "IRFC901V119493683", PlaqueKindId: 15, PlaqueSampleId: 24 },
]),
).toEqual({
Id: 2,
VIN: "IRFC901V119493683",
PlaqueKindId: 15,
PlaqueSampleId: 24,
});
});
it("reads plaque kind and sample from VIN inquiry for the lookup filter", () => {
expect(
pickFanavaranPlaqueLookupFields({
PlaqueKindId: 15,
PlaqueSampleId: 24,
PlaqueCityId: null,
PlaqueLeftNo: "62",
PlaqueMiddleCodeId: 14,
PlaqueRightNo: "278",
PlaqueSerial: "50",
PlaqueNo: "278و62",
}),
).toEqual({
kindId: 15,
sampleId: 24,
cityId: null,
leftNo: "62",
middleCodeId: 14,
rightNo: "278",
serial: "50",
plaqueNo: "278و62",
});
});
it("uses tenant config default when the API id is missing", () => {
expect(fanavaranIdOrConfigDefault(15, 8)).toBe(15);
expect(fanavaranIdOrConfigDefault(null, 8)).toBe(8);
expect(fanavaranIdOrConfigDefault(0, 10)).toBe(10);
});
it("matches VIN against ChassisNo when VIN is empty", () => {
expect(
vehicleMatchesCar(
{ VIN: null, ChassisNo: "NAAR03HFFRDE07024" },
{ vin: "NAAR03HFFRDE07024" },
),
).toBe(true);
});
it("matches by VIN-inquiry VehicleId when GEN.15 VIN is empty", () => {
expect(
vehicleMatchesCar(
{ Id: 4118289, VIN: null, ChassisNo: "RDE07024" },
{ vin: "NAAR03HFFRDE07024" },
4118289,
),
).toBe(true);
});
it("matches VIN trim and case-insensitively", () => {
expect(
vehicleMatchesCar(
{ VIN: " irnKAEK4150012345 " },
{ vin: "IRNKAEK4150012345" },
),
).toBe(true);
});
it("matches plaque by all four parts including letter code", () => {
expect(
plaqueMatchesVehicle(
{ left: "12", letter: "ب", right: "345", serial: "67" },
{
PlaqueLeftNo: "12",
PlaqueMiddleCodeId: 2,
PlaqueRightNo: "345",
PlaqueSerial: "67",
},
),
).toBe(true);
});
it("lets VIN win when both VIN and plaque are sent", () => {
expect(
vehicleMatchesCar(
{
VIN: "IRNKAEK4150012345",
PlaqueLeftNo: "99",
PlaqueMiddleCodeId: 1,
PlaqueRightNo: "111",
PlaqueSerial: "22",
},
{
vin: "IRNKAEK4150012345",
plaque: { left: "12", letter: "ب", right: "345", serial: "67" },
},
),
).toBe(true);
});
it("does not match plaque when any part differs", () => {
expect(
plaqueMatchesVehicle(
{ left: "12", letter: "ب", right: "345", serial: "67" },
{
PlaqueLeftNo: "12",
PlaqueMiddleCodeId: 2,
PlaqueRightNo: "345",
PlaqueSerial: "68",
},
),
).toBe(false);
});
it("picks the active renewal with the newest BeginDate", () => {
const selected = selectLastAmongCarMatches(
[
{
policyId: 10,
beginDate: "1404/06/01",
endDate: "1405/06/01",
policy: {},
vehicle: null,
},
{
policyId: 20,
beginDate: "1405/06/02",
endDate: "1406/06/01",
policy: {},
vehicle: null,
},
{
policyId: 30,
beginDate: "1403/01/01",
endDate: "1404/01/01",
policy: {},
vehicle: null,
},
],
today,
);
expect(selected?.policyId).toBe(20);
});
it("falls back to the latest EndDate when no match is active", () => {
const selected = selectLastAmongCarMatches(
[
{
policyId: 10,
beginDate: "1402/01/01",
endDate: "1403/01/01",
policy: {},
vehicle: null,
},
{
policyId: 20,
beginDate: "1403/01/01",
endDate: "1404/06/01",
policy: {},
vehicle: null,
},
],
today,
);
expect(selected?.policyId).toBe(20);
});
it("returns null when there are no matches", () => {
expect(selectLastAmongCarMatches([], today)).toBeNull();
});
const damagedIdentity = {
vin: "IRPC941V2BD798656",
chassis: "NAS431100E5798656",
plaque: { left: "59", letter: "ی", right: "419", serial: "78" },
policyCINumber: "16040446424",
};
const culpritVehicle = {
Id: 475449,
VIN: "IRFC891V7D2301065",
ChassisNo: "NAAP41FD5BJ301065",
VehicleKindId: 6953,
VersionNo: 3,
PlaqueKindId: 8,
PlaqueSampleId: 10,
PlaqueLeftNo: "56",
PlaqueMiddleCodeId: 5,
PlaqueRightNo: "394",
PlaqueSerial: "66",
PlaqueNo: "394د56",
};
it("does not treat the culprit vehicle as the damaged car", () => {
expect(
fanavaranVehicleMatchesDamagedIdentity(culpritVehicle, damagedIdentity),
).toBe(false);
expect(
selectFanavaranVehicleForDamageCase(
[
culpritVehicle,
{ Id: 9, VIN: "OTHER", PlaqueKindId: 15, PlaqueSampleId: 24 },
],
damagedIdentity,
),
).toBeNull();
});
it("ignores a PlaqueKindId 15 row that does not share VIN or plate", () => {
expect(
selectFanavaranVehicleForDamageCase(
[
{ Id: 1, VIN: "IRPC941V2BD798656" },
{
Id: 2,
VIN: "IRFC901V119493683",
PlaqueKindId: 15,
PlaqueSampleId: 24,
PlaqueLeftNo: "62",
PlaqueMiddleCodeId: 14,
PlaqueRightNo: "278",
PlaqueSerial: "50",
},
],
damagedIdentity,
),
).toEqual({ Id: 1, VIN: "IRPC941V2BD798656" });
});
it("requires plate agreement when the inquiry row has plaque parts", () => {
expect(
selectFanavaranVehicleForDamageCase(
[
{
Id: 1,
VIN: "IRPC941V2BD798656",
PlaqueKindId: 15,
PlaqueLeftNo: "56",
PlaqueMiddleCodeId: 5,
PlaqueRightNo: "394",
PlaqueSerial: "66",
},
],
damagedIdentity,
),
).toBeNull();
});
it("picks the newest matching version of the damaged VIN and plate", () => {
expect(
selectFanavaranVehicleForDamageCase(
[
{
Id: 10,
VIN: "IRPC941V2BD798656",
ChassisNo: "NAS431100E5798656",
VersionNo: 1,
PlaqueKindId: 15,
PlaqueSampleId: 24,
PlaqueLeftNo: "59",
PlaqueMiddleCodeId: 16,
PlaqueRightNo: "419",
PlaqueSerial: "78",
},
{
Id: 10,
VIN: "IRPC941V2BD798656",
ChassisNo: "NAS431100E5798656",
VersionNo: 3,
PlaqueKindId: 8,
PlaqueSampleId: 10,
PlaqueLeftNo: "59",
PlaqueMiddleCodeId: 16,
PlaqueRightNo: "419",
PlaqueSerial: "78",
},
],
damagedIdentity,
)?.PlaqueKindId,
).toBe(8);
});
it("rejects cached payload ids from a different VIN, plate, or CI number", () => {
expect(
fanavaranPayloadMatchesDamagedIdentity(
{
VIN: "IRFC891V7D2301065",
ChassisNo: "NAAP41FD5BJ301065",
PolicyCINumber: "16018466143",
PlaqueKindId: 8,
PlaqueLeftNo: "56",
PlaqueMiddleCodeId: 5,
PlaqueRightNo: "394",
PlaqueSerial: "66",
},
damagedIdentity,
),
).toBe(false);
expect(canReuseCachedFanavaranVehicleIds("config-default")).toBe(false);
expect(canReuseCachedFanavaranVehicleIds("vehicle-inquiry")).toBe(true);
expect(canReuseCachedFanavaranVehicleIds(undefined)).toBe(false);
});
it("accepts cache only when VIN, plate, and CI number all agree", () => {
expect(
fanavaranPayloadMatchesDamagedIdentity(
{
VIN: "IRPC941V2BD798656",
ChassisNo: "NAS431100E5798656",
PolicyCINumber: "16040446424",
PlaqueLeftNo: "59",
PlaqueMiddleCodeId: 16,
PlaqueRightNo: "419",
PlaqueSerial: "78",
PlaqueKindId: 8,
},
damagedIdentity,
),
).toBe(true);
});
it("uses national plaque 8/10 when the damaged VIN is unknown to Fanavaran", () => {
expect(resolveDamageCasePlaqueLookupIds(null)).toEqual({
kindId: 8,
sampleId: 10,
source: "national-plate-default",
});
});
it("keeps live PlaqueKindId 8 when Swagger body still has stale 15", () => {
expect(
applyFanavaranManualPayloadOverrides(
{
PlaqueKindId: 8,
PlaqueSampleId: 10,
VehicleKindId: 6704,
AccidentVehicleUsedId: 1,
Desc: "سپر جلو",
},
{
PlaqueKindId: 15,
PlaqueSampleId: 24,
Desc: "سپر جلو (edited)",
},
["Desc", "EstimateAmount", "LicenceNo"],
),
).toEqual({
PlaqueKindId: 8,
PlaqueSampleId: 10,
VehicleKindId: 6704,
AccidentVehicleUsedId: 1,
Desc: "سپر جلو (edited)",
});
});
});