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) { 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 >; 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, ); }); });