chore: import relatorio (subtree)
git-subtree-dir: relatorio git-subtree-mainline:e322cec92bgit-subtree-split:34bcb132f3
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
'use strict';
|
||||
|
||||
const test = require('node:test');
|
||||
const assert = require('node:assert/strict');
|
||||
const {
|
||||
mean,
|
||||
median,
|
||||
isAnomaly,
|
||||
detectarSpikes,
|
||||
detectarConcentracaoCliente,
|
||||
calcularTendenciaBacklog,
|
||||
} = require('../src/v2/anomaly');
|
||||
const { loadConfig } = require('../src/v2/config');
|
||||
|
||||
const config = loadConfig();
|
||||
|
||||
test('median calcula corretamente para lista par e impar', () => {
|
||||
assert.equal(median([1, 2, 3]), 2);
|
||||
assert.equal(median([1, 2, 3, 4]), 2.5);
|
||||
assert.equal(median([]), 0);
|
||||
});
|
||||
|
||||
test('mean calcula a media simples', () => {
|
||||
assert.equal(mean([1, 2, 3]), 2);
|
||||
assert.equal(mean([]), 0);
|
||||
});
|
||||
|
||||
test('isAnomaly: exige multiplicador E delta minimo (evita falso positivo trivial 0 -> 1)', () => {
|
||||
// baseline 0, atual 1: multiplicador ok (sem historico usa MIN_DELTA), mas delta(1) < MIN_DELTA(3)
|
||||
assert.equal(isAnomaly(1, 0, config), false);
|
||||
// baseline 2.1, atual 7 (exemplo da missao: hardware hoje 7, media 20du 2.1)
|
||||
assert.equal(isAnomaly(7, 2.1, config), true);
|
||||
// baseline 5, atual 6: nao dobra o baseline
|
||||
assert.equal(isAnomaly(6, 5, config), false);
|
||||
});
|
||||
|
||||
test('detectarSpikes retorna somente categorias/clientes que estouraram o baseline, com numeros auditaveis', () => {
|
||||
const atuais = [
|
||||
{ chave: 'Hardware', atual: 7 },
|
||||
{ chave: 'Software', atual: 4 },
|
||||
];
|
||||
const baseline = new Map([
|
||||
['Hardware', [2, 2, 3, 1, 2]], // media 2.0
|
||||
['Software', [4, 3, 4, 5, 4]], // media 4.0 (estavel)
|
||||
]);
|
||||
const spikes = detectarSpikes(atuais, baseline, config);
|
||||
assert.equal(spikes.length, 1);
|
||||
assert.equal(spikes[0].chave, 'Hardware');
|
||||
assert.equal(spikes[0].baseline_media, 2);
|
||||
});
|
||||
|
||||
test('detectarConcentracaoCliente exige contagem minima E participacao minima', () => {
|
||||
const clientes = [
|
||||
{ nome: 'IMDI', total: 5 },
|
||||
{ nome: 'CTO', total: 2 },
|
||||
];
|
||||
// total periodo 10: IMDI = 50% (>=40%) e >=3 chamados -> concentracao
|
||||
const r = detectarConcentracaoCliente(clientes, 10, config);
|
||||
assert.equal(r.length, 1);
|
||||
assert.equal(r[0].cliente, 'IMDI');
|
||||
assert.equal(r[0].share, 0.5);
|
||||
});
|
||||
|
||||
test('detectarConcentracaoCliente nao aponta cliente com poucos chamados mesmo com share alto', () => {
|
||||
const clientes = [{ nome: 'Cliente Pequeno', total: 2 }];
|
||||
const r = detectarConcentracaoCliente(clientes, 2, config); // 100% mas so 2 chamados
|
||||
assert.equal(r.length, 0);
|
||||
});
|
||||
|
||||
test('calcularTendenciaBacklog classifica direcao corretamente', () => {
|
||||
assert.equal(calcularTendenciaBacklog(22, 20).direcao, 'aumentando');
|
||||
assert.equal(calcularTendenciaBacklog(18, 20).direcao, 'diminuindo');
|
||||
assert.equal(calcularTendenciaBacklog(20, 20).direcao, 'estavel');
|
||||
assert.equal(calcularTendenciaBacklog(20, null).direcao, 'indisponivel');
|
||||
});
|
||||
Reference in New Issue
Block a user