import { describe, expect, it } from "vitest"; import citiesData from "@/data/city.json"; import { ROOT_CITY_ID } from "@/lib/rootCity"; import { domainScopeCityId, extractEntityCityId, findDomainByCityId, isBlogVisibleOnDomain, resolveCityDisplayName, } from "@/lib/domainHelpers"; import { getBlogCanonicalOrigin } from "@/lib/getCanonicalUrl"; const YASUJ = citiesData.find((c) => c.domain === "yasuj-nobat.ir"); const ROOT = citiesData.find((c) => Number(c.id) === ROOT_CITY_ID); describe("findDomainByCityId", () => { it("شهر دارای دامنه را به دامنه‌اش نگاشت می‌کند", () => { expect(findDomainByCityId(YASUJ.id)).toBe("yasuj-nobat.ir"); expect(findDomainByCityId(String(YASUJ.id))).toBe("yasuj-nobat.ir"); }); it("رکورد ریشه شهر نیست", () => { expect(findDomainByCityId(ROOT_CITY_ID)).toBeNull(); }); it("شهر بدون دامنه یا ورودی نامعتبر → null", () => { expect(findDomainByCityId(999999)).toBeNull(); expect(findDomainByCityId(null)).toBeNull(); expect(findDomainByCityId("")).toBeNull(); expect(findDomainByCityId("abc")).toBeNull(); }); }); describe("resolveCityDisplayName", () => { it("رکورد ریشه → ایران، نه نام برند", () => { expect(resolveCityDisplayName(ROOT)).toBe("ایران"); expect(resolveCityDisplayName(null)).toBe("ایران"); }); it("شهر واقعی → نام خودش", () => { expect(resolveCityDisplayName(YASUJ)).toBe("یاسوج"); }); }); describe("extractEntityCityId", () => { it("کلینیک: از آرایهٔ city", () => { expect(extractEntityCityId({ city: [{ id: String(YASUJ.id) }] })).toBe(String(YASUJ.id)); }); it("پزشک: از address[].city وقتی city خالی است", () => { const doctor = { city: [], address: [{ city: { id: String(YASUJ.id) } }] }; expect(extractEntityCityId(doctor)).toBe(String(YASUJ.id)); }); it("اولین شهرِ دارای دامنه برنده است", () => { const doctor = { address: [{ city: { id: 999999 } }, { city: { id: YASUJ.id } }] }; 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", () => { expect(extractEntityCityId({ city: [], address: [] })).toBeNull(); expect(extractEntityCityId(null)).toBeNull(); }); }); describe("شکل پاسخ بلاگ (city آبجکت یا null)", () => { it("پست شهریافته → شناسه و دامنهٔ همان شهر", () => { const post = { slug: "x", city: { id: "123", name: "یاسوج" } }; expect(extractEntityCityId(post)).toBe("123"); expect(findDomainByCityId(extractEntityCityId(post))).toBe("yasuj-nobat.ir"); }); it("پست سراسری (city: null) → بدون شهر، بدون دامنه", () => { const post = { slug: "x", city: null }; expect(extractEntityCityId(post)).toBeNull(); expect(findDomainByCityId(extractEntityCityId(post))).toBeNull(); }); }); describe("scope دامنه برای API", () => { it("دامنهٔ ریشه scope ندارد (همهٔ پست‌ها را می‌بیند)", () => { expect(domainScopeCityId({ matchedCity: ROOT, isRoot: true })).toBeNull(); }); it("دامنهٔ شهری با شناسهٔ همان شهر scope می‌شود", () => { expect(domainScopeCityId({ matchedCity: YASUJ, isRoot: false })).toBe(Number(YASUJ.id)); }); it("دامنهٔ ناشناخته (نمایندگی) scope ندارد", () => { expect(domainScopeCityId({ matchedCity: undefined, isRoot: false })).toBeNull(); expect(domainScopeCityId()).toBeNull(); }); }); describe("دیده‌شدن پست روی دامنه (آینهٔ فیلتر بک‌اند)", () => { const yasujScope = { matchedCity: YASUJ, isRoot: false }; const rootScope = { matchedCity: ROOT, isRoot: true }; it("پست همان شهر روی دامنهٔ خودش دیده می‌شود", () => { expect(isBlogVisibleOnDomain({ city: { id: String(YASUJ.id) } }, yasujScope)).toBe(true); }); it("پست شهر دیگر روی این دامنه وجود ندارد", () => { const ahvaz = citiesData.find((c) => c.domain === "ahvaz-nobat.ir"); expect(isBlogVisibleOnDomain({ city: { id: String(ahvaz.id) } }, yasujScope)).toBe(false); }); it("پستِ رکورد ریشه (nobat724) روی دامنهٔ شهری وجود ندارد — همان باگ گزارش‌شده", () => { expect(isBlogVisibleOnDomain({ city: { id: String(ROOT_CITY_ID) } }, yasujScope)).toBe(false); expect(isBlogVisibleOnDomain({ city: { id: String(ROOT_CITY_ID) } }, rootScope)).toBe(true); }); it("پست سراسری (city: null) همه‌جا دیده می‌شود", () => { expect(isBlogVisibleOnDomain({ city: null }, yasujScope)).toBe(true); expect(isBlogVisibleOnDomain({ city: null }, rootScope)).toBe(true); }); }); describe("canonical پست بلاگ", () => { it("پست شهری → دامنهٔ همان شهر", () => { expect(getBlogCanonicalOrigin(YASUJ.id)).toBe("https://yasuj-nobat.ir"); }); it("پست سراسری یا پستِ رکورد ریشه → دامنهٔ اصلی، نه دامنهٔ جاری", () => { expect(getBlogCanonicalOrigin(null)).toBe("https://nobat724.com"); expect(getBlogCanonicalOrigin(ROOT_CITY_ID)).toBe("https://nobat724.com"); }); });