Files
SLACK_COORD_RELATORIO/logic/diversity.test.js
T

38 lines
1.6 KiB
JavaScript

const { test } = require('node:test');
const assert = require('node:assert/strict');
const { selectTop } = require('./diversity');
function item(id, score, group, excludedFromTop10) {
return { ticket: { id }, score, group, excludedFromTop10: Boolean(excludedFromTop10), aiClassification: {} };
}
test('Top final nunca ultrapassa topN', () => {
const scored = Array.from({ length: 20 }, (_, i) => item(i, 100 - i, 'ranking_geral', false));
const { selected } = selectTop(scored, 10, {});
assert.equal(selected.length, 10);
});
test('itens excluidos do Top10 nunca aparecem selecionados', () => {
const scored = [item(1, 500, 'critico_acionavel', true), item(2, 10, 'ranking_geral', false)];
const { selected } = selectTop(scored, 10, {});
assert.ok(!selected.some((s) => s.ticket.id === 1));
});
test('10 criticos legitimos no mesmo grupo entram todos (diversidade nao bloqueia emergencia real)', () => {
const scored = Array.from({ length: 10 }, (_, i) => item(i, 500 - i, 'critico_acionavel', false));
const { selected } = selectTop(scored, 10, {});
assert.equal(selected.length, 10);
assert.deepEqual(selected.map((s) => s.ticket.id).sort(), scored.map((s) => s.ticket.id).sort());
});
test('com grupos variados, ordena por score respeitando diversidade leve', () => {
const scored = [
...Array.from({ length: 8 }, (_, i) => item(`c${i}`, 300 - i, 'critico_acionavel', false)),
item('t1', 250, 'sem_tecnico', false),
item('t2', 240, 'quick_win', false),
];
const { selected } = selectTop(scored, 10, {});
assert.equal(selected.length, 10);
assert.ok(selected.some((s) => s.ticket.id === 't1'));
});