Merge pull request 'FIXED mock problem' (#293) from s.yahyaee/yara724-api:main into main

Reviewed-on: Yara724/api#293
This commit is contained in:
2026-09-07 13:01:29 +03:30
2 changed files with 84 additions and 25 deletions

View File

@@ -15,6 +15,9 @@ describe("SandHubService inquiry mocks", () => {
const lookupsService = {
findLastProcessedCarPolicy: jest.fn(),
};
const offlineInquiryService = {
findPlateInquiry: jest.fn(),
};
let service: SandHubService;
@@ -32,17 +35,17 @@ describe("SandHubService inquiry mocks", () => {
beforeEach(() => {
jest.clearAllMocks();
delete process.env.CLIENT_ID;
delete process.env.FANAVARAN_CLIENT;
service = new SandHubService(
httpService as any,
sandHubDbService as any,
externalInquirySettings as unknown as ExternalInquirySettingsService,
plateNormalizer as any,
{
findPlateInquiry: jest.fn().mockResolvedValue(null),
} as any,
offlineInquiryService as any,
lookupsService as any,
);
externalInquirySettings.isInquiryLive.mockResolvedValue(false);
offlineInquiryService.findPlateInquiry.mockResolvedValue(null);
externalInquirySettings.getMockCompanyContext.mockResolvedValue({
companyId: "8",
companyName: "بیمه پارسیان",
@@ -107,6 +110,50 @@ describe("SandHubService inquiry mocks", () => {
expect(httpService.post).not.toHaveBeenCalled();
});
it("does not let an offline third-party seed override a live ESG inquiry", async () => {
process.env.CLIENT_ID = "8";
externalInquirySettings.isInquiryLive.mockResolvedValue(true);
offlineInquiryService.findPlateInquiry.mockResolvedValue({
source: "OFFLINE_SEED_INQUIRY",
raw: { mocked: true },
mapped: { PrntPlcyCmpDocNo: "MOCK-POLICY" },
});
const esg = jest
.spyOn(service as any, "makeEsgRequest")
.mockResolvedValue({
success: true,
data: { PrntCmpDocNo: "REAL-ESG-POLICY" },
});
const result = await service.getTejaratBlockInquiry(userDetail);
expect(esg).toHaveBeenCalled();
expect(result.raw).not.toEqual({ mocked: true });
expect(result.mapped.PrntPlcyCmpDocNo).toBe("REAL-ESG-POLICY");
});
it("uses the processed CAR_BODY lookup when the active Fanavaran client is Parsian", async () => {
process.env.FANAVARAN_CLIENT = "parsian";
externalInquirySettings.isInquiryLive.mockResolvedValue(true);
lookupsService.findLastProcessedCarPolicy.mockResolvedValue({
policy: { CINumber: "70019846985" },
customer: {},
vehicle: {},
});
const tejarat = jest
.spyOn(service, "getTejaratCarBodyInquiry")
.mockResolvedValue({ raw: { mocked: true }, mapped: {} });
const result = await service.getCarBodyInquiry(userDetail);
expect(lookupsService.findLastProcessedCarPolicy).toHaveBeenCalledWith(
"car-body",
expect.objectContaining({ nationalCode: "1234567890" }),
);
expect(tejarat).not.toHaveBeenCalled();
expect(result.raw).not.toEqual({ mocked: true });
});
it("keeps ESG car-body inquiry in mock mode when the per-client toggle is off", async () => {
process.env.CLIENT_ID = "8";

View File

@@ -80,6 +80,15 @@ export class SandHubService {
return String(process.env.CLIENT_ID ?? "") === "8";
}
/**
* The processed Fanavaran CAR_BODY lookup belongs only to the Parsian
* Fanavaran profile. Do not use the deployment-wide ESG selector here:
* `FANAVARAN_CLIENT=parsian` is valid even when CLIENT_ID is not 8.
*/
private shouldUseParsianCarBodyLookup(): boolean {
return resolveFanavaranClientKey() === "parsian";
}
/** Fixed plate/insurance inquiry payload used everywhere we mock block-inquiry style APIs. */
private buildMockPlateInquiryRaw(
ctx: MockInquiryCompanyContext,
@@ -757,25 +766,30 @@ export class SandHubService {
person?: Record<string, unknown>;
};
}> {
const offlineHit = await this.offlineInquiryService.findPlateInquiry({
clientKey: resolveFanavaranClientKey(),
nationalCode: String(userDetail.nationalCodeOfInsurer),
leftDigits: String(userDetail.plate.leftDigits),
centerAlphabet: String(userDetail.plate.centerAlphabet),
centerDigits: String(userDetail.plate.centerDigits),
ir: String(userDetail.plate.ir),
});
if (offlineHit) {
return {
raw: offlineHit.raw,
mapped: offlineHit.mapped,
offline: {
source: offlineHit.source,
fanavaranDriverId: offlineHit.fanavaranDriverId,
insurance: offlineHit.insurance,
person: offlineHit.person,
},
};
const live = await this.isInquiryLive("thirdPartyPlate", options);
// Offline records are a fallback for disabled inquiry mode only. They must
// never override a configured live ESG/Tejarat inquiry.
if (!live) {
const offlineHit = await this.offlineInquiryService.findPlateInquiry({
clientKey: resolveFanavaranClientKey(),
nationalCode: String(userDetail.nationalCodeOfInsurer),
leftDigits: String(userDetail.plate.leftDigits),
centerAlphabet: String(userDetail.plate.centerAlphabet),
centerDigits: String(userDetail.plate.centerDigits),
ir: String(userDetail.plate.ir),
});
if (offlineHit) {
return {
raw: offlineHit.raw,
mapped: offlineHit.mapped,
offline: {
source: offlineHit.source,
fanavaranDriverId: offlineHit.fanavaranDriverId,
insurance: offlineHit.insurance,
person: offlineHit.person,
},
};
}
}
const ctx = await this.mockCompanyContext(options);
@@ -790,7 +804,6 @@ export class SandHubService {
};
const requestUrl = `${baseUrl}/inquiry/policyByPlate`;
const live = await this.isInquiryLive("thirdPartyPlate", options);
const raw = live
? await this.makeEsgRequest(
requestUrl,
@@ -819,7 +832,6 @@ export class SandHubService {
};
const requestUrl = `${baseUrl}/block-inquiry-tejarat`;
const live = await this.isInquiryLive("thirdPartyPlate", options);
const raw = live
? await this.makeTejaratRequest(
requestUrl,
@@ -857,7 +869,7 @@ export class SandHubService {
raw: any;
mapped: Record<string, unknown>;
}> {
if (!this.shouldUseEsgInquiryProvider()) {
if (!this.shouldUseParsianCarBodyLookup()) {
const result = await this.getTejaratCarBodyInquiry(
userDetail as SandHubDetailDto,
options,