import { readFileSync } from "node:fs"; import { join } from "node:path"; import { describe, expect, it } from "vitest"; import { PL24FordLegacyService } from "./pl24-ford-legacy.service"; /** * Opel / Hyundai / Kia "0 kategori" regresyon kilidi (plv2.md, bulgu p4legacy-03). * * Bu markalar ana gruplarını DEĞİL, `` satır attribute'unda taşıyor. Decode yolu yalnız anchor * tarayan parser'ı kullandığı için prod'da Opel 169/173, Hyundai 11/11, Kia 5/5 * araç SIFIR kategoriyle kaydedilmişti — sayfa listeyi taşıdığı hâlde. * * Fixture'lar 2026-09-16 canlı keşfinden (plv2-artefakt/), yalnız ana grup * tablosuna kırpılmış hâlleri. */ const fixture = (name: string) => readFileSync(join(__dirname, "__fixtures__", `${name}.html`), "utf-8"); // parseFordGroupsFromHtml saf bir metin işleyicisi: bağımlılıklar kullanılmıyor. const svc = new PL24FordLegacyService( {} as never, // authService { get: (_k: string, d?: unknown) => d } as never, // configService {} as never, // redis {} as never, // storage ) as unknown as { parseFordGroupsFromHtml( html: string, serviceName: string, familyId: string, ): Array<{ code: string; nameEn: string; linkPath?: string }>; parseP4NavigationCategories(html: string): Array<{ nameEn: string }>; }; describe("P4 ana grup tablosu — Opel/Hyundai (0 kategori regresyonu)", () => { it("Opel: jsonurl satırlarından 31 ana grubu çıkarır", () => { const groups = svc.parseFordGroupsFromHtml(fixture("p4_opel"), "opel_parts", ""); expect(groups.length).toBe(31); expect(groups[0].nameEn).toBe("BODY SHELL AND PANELS"); expect(groups[0].code).toContain("json-vin-main-group.action"); expect(groups[0].code).toContain("mainGroupId=394"); // Adların hepsi gerçek metin olmalı (kod artığı değil) expect(groups.every((g) => /[A-Za-z]{3,}/.test(g.nameEn))).toBe(true); }); it("Hyundai: mainGroup= anahtarlı vin-group satırları artık elenmez", () => { const groups = svc.parseFordGroupsFromHtml(fixture("p4_hyundai"), "hyundai_parts", ""); expect(groups.length).toBe(6); const names = groups.map((g) => g.nameEn); expect(names).toContain("BODY"); expect(groups[0].code).toContain("mainGroup=BO"); }); it("anchor-only parser bu sayfalarda hâlâ boş döner (fallback'in gerekçesi)", () => { expect(svc.parseP4NavigationCategories(fixture("p4_opel")).length).toBe(0); expect(svc.parseP4NavigationCategories(fixture("p4_hyundai")).length).toBe(0); }); it("Ford: scope satırları (sharedCatCode) bozulmadan okunur", () => { const groups = svc.parseFordGroupsFromHtml(fixture("p4_ford"), "fordp_parts", ""); expect(groups.length).toBeGreaterThanOrEqual(6); expect(groups.some((g) => g.code.includes("sharedCatCode=ZE"))).toBe(true); }); it("Nissan: model seçim satırları ana grup sayılmaz (vehicle.action elenir)", () => { const groups = svc.parseFordGroupsFromHtml(fixture("p4_nissan"), "nissan_parts", ""); expect(groups.every((g) => !g.code.includes("vehicle.action"))).toBe(true); }); });