69 lines
1.6 KiB
JavaScript
69 lines
1.6 KiB
JavaScript
#!/usr/bin/env node
|
|
|
|
import assert from "node:assert/strict";
|
|
|
|
const NON_AUTHORITATIVE_REASON_CODES = new Set(["PENDIENTE", "UNCLASSIFIED"]);
|
|
|
|
function isNonAuthoritativeReasonCode(code) {
|
|
const normalized = String(code ?? "").trim().toUpperCase();
|
|
return !!normalized && NON_AUTHORITATIVE_REASON_CODES.has(normalized);
|
|
}
|
|
|
|
function shouldPreserveManualReason({
|
|
incomingReasonCode,
|
|
existingReasonCode,
|
|
isManualAckEvent,
|
|
}) {
|
|
if (isManualAckEvent) return false;
|
|
if (!isNonAuthoritativeReasonCode(incomingReasonCode)) return false;
|
|
if (!existingReasonCode) return false;
|
|
return !isNonAuthoritativeReasonCode(existingReasonCode);
|
|
}
|
|
|
|
function run() {
|
|
// 1) pending -> manual ack -> later pending: preserve manual
|
|
assert.equal(
|
|
shouldPreserveManualReason({
|
|
incomingReasonCode: "PENDIENTE",
|
|
existingReasonCode: "OPERACION__OTRO",
|
|
isManualAckEvent: false,
|
|
}),
|
|
true
|
|
);
|
|
|
|
// 2) manual ack followed by another manual reason: latest manual should be allowed
|
|
assert.equal(
|
|
shouldPreserveManualReason({
|
|
incomingReasonCode: "SERVICIOS__OTRO",
|
|
existingReasonCode: "OPERACION__OTRO",
|
|
isManualAckEvent: true,
|
|
}),
|
|
false
|
|
);
|
|
|
|
// 3) no manual reason ever applied: pending stays pending
|
|
assert.equal(
|
|
shouldPreserveManualReason({
|
|
incomingReasonCode: "UNCLASSIFIED",
|
|
existingReasonCode: "PENDIENTE",
|
|
isManualAckEvent: false,
|
|
}),
|
|
false
|
|
);
|
|
|
|
console.log(
|
|
JSON.stringify(
|
|
{
|
|
ok: true,
|
|
testedAt: new Date().toISOString(),
|
|
scenarios: 3,
|
|
},
|
|
null,
|
|
2
|
|
)
|
|
);
|
|
}
|
|
|
|
run();
|
|
|