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 مرکز درمانی در یزد"); }); });