metis-desk/modules/resources/src/api/application/application-coincidence.test.ts

82 lines
2.7 KiB
TypeScript
Raw Normal View History

2026-10-24 23:19:17 +00:00
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
);
});