import { describe, expect, it } from "vitest"; import { buildCanonicalQuery, buildFilteredListingCanonical, getEntityCanonical, } from "@/lib/getCanonicalUrl"; const YASUJ_CITY_ID = 123; const ROOT_CITY_ID = 600; describe("buildCanonicalQuery — تصمیم M3-B", () => { it("صفحهٔ ۲+ در canonical می‌ماند تا ایندکس‌پذیر بماند", () => { expect(buildCanonicalQuery("?page=2")).toBe("?page=2"); expect(buildCanonicalQuery("?page=38")).toBe("?page=38"); }); it("صفحهٔ ۱ حذف می‌شود (URL متعارف بدون page)", () => { expect(buildCanonicalQuery("?page=1")).toBe(""); expect(buildCanonicalQuery("")).toBe(""); }); it("فیلتر و sort و جستجو از canonical حذف می‌شوند", () => { expect(buildCanonicalQuery("?specialty=x&gender=woman&sort=point&name=a")).toBe(""); }); it("page در کنار فیلترها فقط page را نگه می‌دارد", () => { expect(buildCanonicalQuery("?specialty=x&page=3")).toBe("?page=3"); }); }); describe("buildFilteredListingCanonical — صفحات لیست فیلتردار", () => { const HOST = "yasuj-nobat.ir"; it("صفحهٔ فیلتردار self-canonical می‌شود، نه canonical به صفحهٔ دیگر", () => { expect( buildFilteredListingCanonical(HOST, "/doctors", "?specialty=x") ).toBe("https://yasuj-nobat.ir/doctors?specialty=x"); }); it("/clinics هم همین سیاست را دارد", () => { expect(buildFilteredListingCanonical(HOST, "/clinics", "?name=a")).toBe( "https://yasuj-nobat.ir/clinics?name=a" ); }); it("ترتیب متفاوت پارامترها به یک canonical می‌رسد", () => { const a = buildFilteredListingCanonical(HOST, "/doctors", "?gender=woman&specialty=x"); const b = buildFilteredListingCanonical(HOST, "/doctors", "?specialty=x&gender=woman"); expect(a).toBe(b); }); it("page به‌تنهایی فیلتر نیست → مسیر عادی M3-B", () => { expect(buildFilteredListingCanonical(HOST, "/doctors", "?page=2")).toBeNull(); }); it("لیست بدون کوئری و مسیرهای غیرلیست دخالتی نمی‌گیرند", () => { expect(buildFilteredListingCanonical(HOST, "/doctors", "")).toBeNull(); expect(buildFilteredListingCanonical(HOST, "/specialties/x", "?a=1")).toBeNull(); }); it("پارامتر خالی فیلتر حساب نمی‌شود", () => { expect(buildFilteredListingCanonical(HOST, "/doctors", "?specialty=")).toBeNull(); }); }); describe("getEntityCanonical — C1-b", () => { it("موجودیت به دامنهٔ شهر خودش canonical می‌شود، نه دامنهٔ سرو‌کننده", () => { expect(getEntityCanonical(YASUJ_CITY_ID, "/doctor/abc", "nobat724.com")).toBe( "https://yasuj-nobat.ir/doctor/abc" ); }); it("روی دامنهٔ خودِ شهر self-canonical است", () => { expect(getEntityCanonical(YASUJ_CITY_ID, "/clinic/abc", "yasuj-nobat.ir")).toBe( "https://yasuj-nobat.ir/clinic/abc" ); }); it("شهر بدون دامنه → self-canonical (هرگز canonical شکسته)", () => { expect(getEntityCanonical(999999, "/doctor/abc", "nobat724.com")).toBe( "https://nobat724.com/doctor/abc" ); expect(getEntityCanonical(null, "/doctor/abc", "tehran-nobat.ir")).toBe( "https://tehran-nobat.ir/doctor/abc" ); }); it("رکورد ریشه شهر نیست → self-canonical", () => { expect(getEntityCanonical(ROOT_CITY_ID, "/doctor/abc", "yazd-nobat.ir")).toBe( "https://yazd-nobat.ir/doctor/abc" ); }); });