test(extractEntityCityId): prioritize address over top-level city in entity extraction

This commit is contained in:
hamed
2026-07-19 08:54:00 +03:30
parent 21f5f07bc6
commit 88782e70c2
2 changed files with 22 additions and 1 deletions
+6 -1
View File
@@ -46,10 +46,15 @@ export function resolveCityDisplayName(cityInfo) {
export function extractEntityCityId(entity) { export function extractEntityCityId(entity) {
if (!entity) return null; if (!entity) return null;
// ترتیب مهم است: آدرس قبل از فیلد city سطح‌بالا.
// پاسخ جزئیات پزشک هر دو را دارد و می‌توانند اختلاف داشته باشند — city سطح‌بالا از
// یک رابطهٔ ManyToMany قدیمی می‌آید، ولی هم فیلتر city_id بک‌اند و هم فیلد city در
// پاسخ لیست بر پایهٔ آدرس‌اند. اگر اینجا فیلد قدیمی برنده شود، canonical پزشک به
// شهری می‌رود که sitemap او را آنجا نگذاشته است.
const candidates = [ const candidates = [
entity.city_id, entity.city_id,
...(Array.isArray(entity.city) ? entity.city.map((c) => c?.id) : [entity.city?.id]),
...(Array.isArray(entity.address) ? entity.address.map((a) => a?.city?.id) : []), ...(Array.isArray(entity.address) ? entity.address.map((a) => a?.city?.id) : []),
...(Array.isArray(entity.city) ? entity.city.map((c) => c?.id) : [entity.city?.id]),
].filter((id) => id != null); ].filter((id) => id != null);
const withDomain = candidates.find((id) => findDomainByCityId(id)); const withDomain = candidates.find((id) => findDomainByCityId(id));
+16
View File
@@ -54,6 +54,22 @@ describe("extractEntityCityId", () => {
expect(findDomainByCityId(extractEntityCityId(doctor))).toBe("yasuj-nobat.ir"); expect(findDomainByCityId(extractEntityCityId(doctor))).toBe("yasuj-nobat.ir");
}); });
it("آدرس بر city سطح‌بالا مقدم است (اختلاف بین دو منبع)", () => {
// پاسخ واقعی جزئیات پزشک: city سطح‌بالا از رابطهٔ قدیمی، آدرس از مطب واقعی.
// فیلتر city_id و فیلد city در پاسخ لیست هر دو آدرس‌محورند، پس آدرس باید ببرد؛
// وگرنه canonical پزشک با sitemapی که او را در آن گذاشته‌ایم واگرا می‌شود.
const doctor = {
city: [{ id: "123" }],
address: [{ city: { id: "101" } }],
};
expect(extractEntityCityId(doctor)).toBe("101");
expect(findDomainByCityId(extractEntityCityId(doctor))).toBe("tabriz-nobat.ir");
});
it("کلینیک آدرس ندارد → همان city سطح‌بالا", () => {
expect(extractEntityCityId({ city: [{ id: "123" }] })).toBe("123");
});
it("بدون شهر → null", () => { it("بدون شهر → null", () => {
expect(extractEntityCityId({ city: [], address: [] })).toBeNull(); expect(extractEntityCityId({ city: [], address: [] })).toBeNull();
expect(extractEntityCityId(null)).toBeNull(); expect(extractEntityCityId(null)).toBeNull();