SPB Git forge
7commits 1branches 0releases
229.0 KBsize
maindefault branch
12 days agolast push
TypeScript 91.8% HTML 3.2% JavaScript 3% SQL 1.4% CSS 0.7%
2.1 KB · 39 lines typescript
Raw Blame History
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