Files
nobat724_front/lib/domainHelpers.test.js
T

92 lines
3.8 KiB
JavaScript

import { describe, expect, it } from "vitest";
import citiesData from "@/data/city.json";
import { ROOT_CITY_ID } from "@/lib/rootCity";
import {
extractEntityCityId,
findDomainByCityId,
resolveCityDisplayName,
} from "@/lib/domainHelpers";
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();
});
});