94 lines
3.6 KiB
JavaScript
94 lines
3.6 KiB
JavaScript
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"
|
|
);
|
|
});
|
|
});
|