Files
nobat724_front/lib/cityIntro.test.js
T
hamed b494473e40 feat: رفع لینک /doctor/undefined و متمایزسازی صفحهٔ اصلی شهرها
- ایجاد پرامپت برای رفع خطای 404 ناشی از لینک `/doctor/undefined` در سایت‌های بهبهان و یاسوج.
- افزودن کامپوننت `CityHighlights` برای نمایش محتوای یکتا و آمار پزشکان و تخصص‌های پرمراجعه در صفحهٔ اصلی هر شهر.
- به‌روزرسانی تست‌های مربوط به کامپوننت‌های `ItemDoctor` و `CityHighlights` برای اطمینان از عدم وجود لینک‌های نامعتبر و نمایش صحیح اطلاعات.
- ایجاد سند جدید برای مستندسازی خطاهای Search Console که باگ نیستند و نیاز به رفع ندارند.
- افزودن تست‌های واحد برای توابع `buildCityIntro` و دیگر توابع مرتبط با تولید متن یکتا برای صفحات لیست.
2026-08-08 19:14:50 +03:30

103 lines
3.9 KiB
JavaScript

import { describe, expect, it } from "vitest";
import cityData from "@/data/city.json";
import {
buildCityIntro,
buildClinicsIntro,
buildDoctorsIntro,
} from "@/lib/listingIntro";
const CITIES = ["بهبهان", "یاسوج", "یزد", "تبریز", "اصفهان"];
describe("buildCityIntro", () => {
it("دو شهر متن یکسان نمی‌گیرند", () => {
const a = buildCityIntro("بهبهان", 12, "جراحی عمومی");
const b = buildCityIntro("یاسوج", 80, "جراحی عمومی");
expect(a).not.toBe(b);
});
it("یک شهر در دو فراخوانی همان متن را می‌دهد", () => {
// ناپایداری یعنی محتوای صفحهٔ اصلی با هر rebuild عوض شود.
expect(buildCityIntro("بهبهان", 12, "جراحی عمومی")).toBe(
buildCityIntro("بهبهان", 12, "جراحی عمومی")
);
});
it("نام شهر و عدد و تخصص در متن می‌آیند", () => {
const text = buildCityIntro("بهبهان", 12, "جراحی عمومی");
expect(text).toContain("بهبهان");
expect(text).toContain("12");
expect(text).toContain("جراحی عمومی");
});
it("شمار صفر جمله را نمی‌شکند", () => {
const text = buildCityIntro("شهر تازه", 0, "");
expect(text).toContain("شهر تازه");
expect(text).not.toContain("undefined");
expect(text).not.toContain("NaN");
});
it("ورودی نامعتبر به صفر و تخصص پیش‌فرض می‌افتد", () => {
const text = buildCityIntro("شهر", "abc", null);
expect(text).not.toContain("NaN");
expect(text).toContain("پزشکی عمومی");
});
it("متن‌ها روی شهرهای واقعی به یک قالب واحد نمی‌چسبند", () => {
// اگر همهٔ شهرها یک variant بگیرند، دوباره همان duplicate ساخته می‌شود.
const texts = CITIES.map((c) => buildCityIntro(c, 10, "قلب و عروق"));
expect(new Set(texts).size).toBeGreaterThan(1);
});
it("متن به قدر کافی بلند هست که سیگنال محتوایی باشد", () => {
for (const city of CITIES) {
expect(buildCityIntro(city, 10, "قلب").length).toBeGreaterThan(200);
}
});
it("روی همهٔ شهرهای واقعی city.json بدون خطا اجرا می‌شود", () => {
for (const city of cityData) {
const text = buildCityIntro(city.name, 5, "داخلی");
expect(typeof text).toBe("string");
expect(text).not.toContain("undefined");
}
});
});
describe("جملهٔ آماری متن صفحات لیست", () => {
it("دو شهرِ هم‌variant با آمار متفاوت، متن یکسان نمی‌گیرند", () => {
// بهبهان و یاسوج روی CLINIC_INTROS هم‌variant‌اند؛ پیش از افزودن عدد، متنشان
// تقریباً یکی می‌شد و شباهت /clinics از ۶۸.۹٪ به ۸۴.۷٪ رفت.
const a = buildClinicsIntro("بهبهان", 12);
const b = buildClinicsIntro("یاسوج", 31);
expect(a).not.toBe(b);
expect(a).toContain("12");
expect(b).toContain("31");
});
it("آمار صفر جمله را اضافه نمی‌کند", () => {
const withZero = buildDoctorsIntro("بهبهان", 0);
const without = buildDoctorsIntro("بهبهان");
expect(withZero).toBe(without);
expect(withZero).not.toContain("0 پزشک");
});
it("ورودی نامعتبر جمله را اضافه نمی‌کند", () => {
const text = buildDoctorsIntro("بهبهان", "abc");
expect(text).not.toContain("NaN");
expect(text).toBe(buildDoctorsIntro("بهبهان"));
});
it("نام شهر و واحد درست در جمله می‌آید", () => {
expect(buildDoctorsIntro("یزد", 40)).toContain("40 پزشک در یزد");
expect(buildClinicsIntro("یزد", 9)).toContain("9 مرکز درمانی در یزد");
});
});