Files
yara724-api/src/lookups/lookups.service.vehicle.spec.ts
2026-09-07 15:08:08 +03:30

146 lines
4.1 KiB
TypeScript

import { NotFoundException } from "@nestjs/common";
import { LookupsService } from "./lookups.service";
describe("LookupsService.vehicleById", () => {
const originalClient = process.env.FANAVARAN_CLIENT;
beforeAll(() => {
process.env.FANAVARAN_CLIENT = "parsian";
});
afterAll(() => {
process.env.FANAVARAN_CLIENT = originalClient;
});
function createService(lookup: Record<string, jest.Mock>) {
return new LookupsService({} as any, lookup as any);
}
it("returns the vehicle with kind, used, and plaque lookups", async () => {
const lookup = {
vehicleById: jest.fn().mockResolvedValue({
Id: 3379978,
VehicleKindId: 5904,
UsedId: 36,
VIN: "IRNKAEK4150012345",
PlaqueLeftNo: "12",
PlaqueMiddleCodeId: 2,
PlaqueRightNo: "345",
PlaqueSerial: "67",
VersionNo: 2,
}),
getRemoteLookup: jest.fn().mockImplementation((_key, url: string) => {
if (url.includes("vehicle-kinds")) {
return Promise.resolve([
{ Id: 5904, Caption: "بنز", VehicleGroupId: 3, IsActive: 1 },
]);
}
if (url.includes("vehicle-use-types")) {
return Promise.resolve([
{ Id: 36, Caption: "حمل مواد سريع الاشتعال", VehicleGroupId: 3, IsActive: 1 },
]);
}
return Promise.resolve([]);
}),
};
const service = createService(lookup);
const result = (await service.vehicleById(3379978, 2)) as Record<
string,
unknown
>;
expect(lookup.vehicleById).toHaveBeenCalledWith("parsian", 3379978, 2);
expect(result.Id).toBe(3379978);
expect(result.vehicleKind).toEqual({
Id: 5904,
Caption: "بنز",
VehicleGroupId: 3,
IsActive: 1,
});
expect(result.used).toEqual({
Id: 36,
Caption: "حمل مواد سريع الاشتعال",
VehicleGroupId: 3,
IsActive: 1,
});
expect(result.plaque).toEqual({
leftTwoDigits: "12",
serialLetter: "ب",
threeDigits: "345",
rightTwoDigits: "67",
});
});
it("enriches inquiry-by-vin rows with used and vehicleKind", async () => {
const lookup = {
inquiryByVin: jest.fn().mockResolvedValue([
{
Id: 3379978,
UsedId: 84,
VehicleKindId: 5950,
VIN: "NAS451100P4934023",
},
]),
getRemoteLookup: jest.fn().mockImplementation((_key, url: string) => {
if (url.includes("vehicle-kinds")) {
return Promise.resolve([
{ Id: 5950, Caption: "کامیون", VehicleGroupId: 3, IsActive: 1 },
]);
}
if (url.includes("vehicle-use-types")) {
return Promise.resolve([
{ Id: 84, Caption: "حمل بار", VehicleGroupId: 3, IsActive: 1 },
]);
}
return Promise.resolve([]);
}),
};
const service = createService(lookup);
const result = (await service.inquiryByVin("NAS451100P4934023")) as Array<
Record<string, unknown>
>;
expect(lookup.inquiryByVin).toHaveBeenCalledWith(
"parsian",
"NAS451100P4934023",
);
expect(result[0].UsedId).toBe(84);
expect(result[0].used).toEqual({
Id: 84,
Caption: "حمل بار",
VehicleGroupId: 3,
IsActive: 1,
});
expect(result[0].vehicleKind).toEqual({
Id: 5950,
Caption: "کامیون",
VehicleGroupId: 3,
IsActive: 1,
});
});
it("unwraps an array payload and 404s when Fanavaran returns nothing", async () => {
const lookup = {
vehicleById: jest
.fn()
.mockResolvedValueOnce([{ Id: 3379978, VehicleKindId: 1 }])
.mockResolvedValueOnce([]),
getRemoteLookup: jest.fn().mockResolvedValue([]),
};
const service = createService(lookup);
const unwrapped = (await service.vehicleById(3379978)) as Record<
string,
unknown
>;
expect(unwrapped.Id).toBe(3379978);
expect(unwrapped.color).toBeNull();
await expect(service.vehicleById(1)).rejects.toBeInstanceOf(
NotFoundException,
);
});
});