import assert from "node:assert/strict"; import { test } from "node:test"; import { compareApplicationProduct, normalizeApplicationIdentityText, } from "./application-coincidence"; const candidate = { id: "0199b200-0000-7000-8000-000000000001", templateId: "0199b200-0000-7000-8000-000000000002", scope: "global" as const, companyId: null, kind: "application" as const, name: "Google Chrome", active: true, provider: "Google", }; test("R2.6: nombre y proveedor son señales, nunca equivalencia confirmada", () => { assert.equal( compareApplicationProduct({ name: " GOOGLE CHROME ", provider: " google " }, candidate) ?.classification, "name-provider" ); const weak = compareApplicationProduct({ name: "Google Chrome", provider: null }, candidate); assert.equal(weak?.classification, "name-only"); assert.ok(weak?.reasons.includes("provider-missing")); assert.equal( compareApplicationProduct({ name: "Google Chrome", provider: "Otro" }, candidate), undefined ); assert.ok( compareApplicationProduct( { name: "Google Chrome", provider: "Google" }, { ...candidate, active: false } )?.reasons.includes("inactive-global") ); }); test("R2.6: preserva tildes, puntuación, abreviaturas, ediciones, versiones y números", () => { for (const [a, b] of [ ["Ágil", "Agil"], ["Office 2021", "Microsoft 365 Apps"], ["Acrobat Reader", "Acrobat Pro"], ["Producto 1", "Producto 2"], ["App Web", "App Desktop"], ["App Standard", "App Professional"], ["App-Free", "App Free"], ["MS Office", "Microsoft Office"], ]) { assert.ok(a && b); assert.equal( compareApplicationProduct({ name: a, provider: null }, { ...candidate, name: b }), undefined ); } assert.equal(normalizeApplicationIdentityText(" CAFE\u0301 PRO "), "café pro"); assert.equal(compareApplicationProduct({ name: "", provider: null }, candidate), undefined); }); test("R2.6: homónimos genéricos se mantienen débiles y los UUID nunca se sustituyen", () => { const source = Object.freeze({ name: "Aplicación", provider: null }); const input = Object.freeze({ ...candidate, name: "Aplicación", provider: null }); const match = compareApplicationProduct(source, input); assert.equal(match?.classification, "name-only"); assert.equal(match?.candidate.id, candidate.id); assert.equal(input.active, true); assert.equal(source.name, "Aplicación"); const rows = Array.from({ length: 10000 }, (_, i) => ({ ...candidate, id: `0199b200-0000-7000-8000-${String(i).padStart(12, "0")}`, })); assert.equal( rows.filter((row) => compareApplicationProduct({ name: "Google Chrome", provider: "Google" }, row) ).length, 10000 ); });