diff --git a/src/treatment/queries.mjs b/src/treatment/queries.mjs index 2d9d05b..a2af069 100644 --- a/src/treatment/queries.mjs +++ b/src/treatment/queries.mjs @@ -71,8 +71,15 @@ export function buildLeadFilter(filtro = {}) { eq('produto_principal', filtro.produto); if (filtro.prioridade !== undefined && filtro.prioridade !== '') { + // Number(...) || 4 mapeava um filtro invalido (ex.: prioridade=0, ou + // texto nao numerico) silenciosamente para P4, ja que 0/NaN sao falsy — + // um prioridade=0 explicito (fora do dominio 1-4 da UI, mas alcancavel + // via chamada direta a API) retornava leads de P4 em vez de nao bater + // com nada. Sem o fallback: um valor invalido vira NaN, que o SQLite + // aceita como parametro e nunca compara igual a nada (0 linhas), em vez + // de redirecionar silenciosamente para outra prioridade. where.push('prioridade = ?'); - params.push(Number(filtro.prioridade) || 4); + params.push(Number(filtro.prioridade)); } if (filtro.score_min !== undefined && filtro.score_min !== '') { diff --git a/tests/personal-backend.test.mjs b/tests/personal-backend.test.mjs index 5f1a25f..cffd116 100644 --- a/tests/personal-backend.test.mjs +++ b/tests/personal-backend.test.mjs @@ -98,6 +98,28 @@ test('opt-out bloqueia os dois lados de um par 12/13 digitos assimetrico', async db.close(); }); +// Number(...) || 4 tratava prioridade=0 (ou texto nao numerico) como P4, +// ja que 0/NaN sao falsy em JS — um filtro invalido devolvia leads de P4 em +// vez de nao bater com nada. +test('filtro de prioridade invalido nao e silenciosamente tratado como P4', async () => { + const { openDb } = await import('../src/db.mjs'); + const { listLeads } = await import('../src/treatment/queries.mjs'); + const db = openDb(':memory:'); + db.prepare( + `INSERT INTO leads (dedup_key, empresa, whatsapp, prioridade, telefone_valido) + VALUES ('p1', 'Empresa P1', '5511999990001', 1, 1)` + ).run(); + db.prepare( + `INSERT INTO leads (dedup_key, empresa, whatsapp, prioridade, telefone_valido) + VALUES ('p4', 'Empresa P4', '5511999990004', 4, 1)` + ).run(); + + assert.deepEqual(listLeads(db, { prioridade: '0' }).rows.map((r) => r.empresa), []); + assert.deepEqual(listLeads(db, { prioridade: 'abc' }).rows.map((r) => r.empresa), []); + assert.deepEqual(listLeads(db, { prioridade: '4' }).rows.map((r) => r.empresa), ['Empresa P4']); + db.close(); +}); + test('listagem e detalhe derivam o estado da verificacao equivalente mais recente', async () => { const { openDb, saveWhatsAppVerification } = await import('../src/db.mjs'); const { getLead, listLeads } = await import('../src/treatment/queries.mjs');