feat: enhance SEO for listing and specialty pages, fix search autocomplete issue

This commit is contained in:
hamed
2026-07-20 10:26:03 +03:30
parent 9011b230b3
commit 30c3fe8637
14 changed files with 460 additions and 69 deletions
+22 -20
View File
@@ -1,41 +1,43 @@
import { describe, expect, it } from "vitest";
import { listingRobots } from "@/lib/listingRobots";
const YASUJ = { name: "یاسوج" };
const KOHGILUYEH = { name: "کهگیلویه و بویراحمد" };
const scope = { matchedCity: YASUJ, matchedState: KOHGILUYEH };
const isNoindex = (result) => result?.robots?.index === false;
describe("listingRobots", () => {
it("صفحهٔ لیست بدون query ایندکس‌پذیر است", () => {
expect(isNoindex(listingRobots({}, scope))).toBe(false);
expect(isNoindex(listingRobots({}))).toBe(false);
expect(isNoindex(listingRobots(undefined))).toBe(false);
});
it("city/state تزریق‌شده از host شمرده نمی‌شوند (باگ noindex سیستمیک)", () => {
const injected = { city: "یاسوج", state: "کهگیلویه و بویراحمد" };
expect(isNoindex(listingRobots(injected, scope))).toBe(false);
it("pagination ایندکس‌پذیر می‌ماند (تصمیم M3-B)", () => {
expect(isNoindex(listingRobots({ page: "2" }))).toBe(false);
expect(isNoindex(listingRobots({ page: "38" }))).toBe(false);
});
it("تک‌فیلتر تخصص ایندکس‌پذیر می‌ماند", () => {
expect(isNoindex(listingRobots({ specialty: "پوست و مو" }, scope))).toBe(false);
it("هر فیلتر جستجو noindex می‌گیرد", () => {
expect(isNoindex(listingRobots({ specialty: "پوست و مو" }))).toBe(true);
expect(isNoindex(listingRobots({ name: "احمدی" }))).toBe(true);
expect(isNoindex(listingRobots({ gender: "woman" }))).toBe(true);
expect(isNoindex(listingRobots({ sort: "point" }))).toBe(true);
});
it("جستجوی نام همیشه noindex است", () => {
expect(isNoindex(listingRobots({ name: "احمدی" }, scope))).toBe(true);
it("city/state حتی وقتی از لینک دامنهٔ خودی می‌آیند noindex می‌گیرند", () => {
const fromHomeSearch = { city: "یاسوج", state: "کهگیلویه و بویراحمد" };
expect(isNoindex(listingRobots(fromHomeSearch))).toBe(true);
});
it("دو فیلتر واقعی کاربر noindex می‌گیرد", () => {
expect(isNoindex(listingRobots({ specialty: "پوست و مو", gender: "woman" }, scope))).toBe(true);
it("فیلتر کنار page هم noindex می‌گیرد", () => {
expect(isNoindex(listingRobots({ specialty: "پوست و مو", page: "3" }))).toBe(true);
});
it("city متفاوت از دامنه یک فیلتر واقعی است", () => {
const params = { city: "تهران", specialty: "پوست و مو" };
expect(isNoindex(listingRobots(params, scope))).toBe(true);
it("پارامتر با مقدار خالی فیلتر حساب نمی‌شود", () => {
expect(isNoindex(listingRobots({ specialty: "", name: undefined }))).toBe(false);
});
it("روی دامنهٔ ریشه (بدون شهر) city صریح کاربر شمرده می‌شود", () => {
const params = { city: "یاسوج", specialty: "پوست و مو" };
expect(isNoindex(listingRobots(params, {}))).toBe(true);
it("noindex همیشه با follow همراه است", () => {
expect(listingRobots({ name: "احمدی" }).robots).toEqual({
index: false,
follow: true,
});
});
});