82 lines
2.7 KiB
TypeScript
82 lines
2.7 KiB
TypeScript
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
|
|
);
|
|
});
|