spb/social-runtime-crawler
Public
TypeScript 91.8%
HTML 3.2%
JavaScript 3%
SQL 1.4%
CSS 0.7%
1import { describe, expect, it } from "vitest";2import type { ObservedEntity } from "@src/shared";3import { mergeSurfaces, resolveIdentity, entityConfidence } from "./index.ts";45const mk = (surface: "dom" | "network", over: Partial<ObservedEntity>): ObservedEntity => ({ ref: "x", type: "video", platform: "youtube", platform_id: "v1", fingerprint: "youtube:video:v1", fields: { title: { value: over.name, provenance: [{ surface, confidence: surface === "network" ? 0.95 : 0.85 }] } }, provenance: [{ surface, confidence: surface === "network" ? 0.95 : 0.85 }], ...over });67describe("mergeSurfaces", () => {8 it("merges the same entity from network and DOM, keeping both provenances", () => {9 const net = [mk("network", { name: "IA au Québec — table ronde", author: "Chaîne", metrics: { views: 1200000 } })];10 const dom = [mk("dom", { name: "IA au Québec — table ronde", url: "https://youtube.com/watch?v=v1" })];11 const r = mergeSurfaces(net, dom);12 expect(r.merged).toHaveLength(1);13 expect(r.both).toBe(1);14 expect(r.field_agreements).toBe(1);15 const e = r.merged[0]!;16 expect(new Set(e.provenance.map((p) => p.surface))).toEqual(new Set(["dom", "network"]));17 expect(e.author).toBe("Chaîne");18 expect(e.url).toContain("v1");19 expect(e.ref).toBe("E1");20 expect(entityConfidence(e)).toBeGreaterThan(0.95);21 });22 it("reports conflicts", () => {23 const r = mergeSurfaces([mk("network", { name: "Titre A" })], [mk("dom", { name: "Complètement autre" })]);24 expect(r.field_conflicts).toHaveLength(1);25 });26});2728describe("resolveIdentity", () => {29 it("never merges on display name alone", () => {30 const d = resolveIdentity({ id: "a", display_name: "Simon B", urls: [], usernames: [] }, { id: "b", display_name: "Simon B", urls: [], usernames: [] });31 expect(d.merge).toBe(false);32 });33 it("merges with a shared canonical url + username", () => {34 const d = resolveIdentity({ id: "a", display_name: "Simon B", urls: ["https://example.com"], usernames: ["@simon"] }, { id: "b", urls: ["https://example.com"], usernames: ["simon"] });35 expect(d.merge).toBe(true);36 expect(d.evidence).toContain("same canonical url");37 });38});39