- ایجاد پرامپت برای رفع خطای 404 ناشی از لینک `/doctor/undefined` در سایتهای بهبهان و یاسوج. - افزودن کامپوننت `CityHighlights` برای نمایش محتوای یکتا و آمار پزشکان و تخصصهای پرمراجعه در صفحهٔ اصلی هر شهر. - بهروزرسانی تستهای مربوط به کامپوننتهای `ItemDoctor` و `CityHighlights` برای اطمینان از عدم وجود لینکهای نامعتبر و نمایش صحیح اطلاعات. - ایجاد سند جدید برای مستندسازی خطاهای Search Console که باگ نیستند و نیاز به رفع ندارند. - افزودن تستهای واحد برای توابع `buildCityIntro` و دیگر توابع مرتبط با تولید متن یکتا برای صفحات لیست.
103 lines
3.9 KiB
JavaScript
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 مرکز درمانی در یزد");
|
|
});
|
|
});
|