Baseline commit of the existing Maquina Comercial Pessoal project
Tracks the app that was already in place (capture, treatment, outreach, WhatsApp integration, server, frontend, tests, docs) so future feature work can branch and use isolated worktrees.
This commit is contained in:
@@ -0,0 +1,129 @@
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import {
|
||||
validatePhone, validateCnpj, validateEmpresa, dedupKey, extractDdd, segmentLabel,
|
||||
scoreQualidade, scoreComercial, scoreGeral, classificarScoreGeral
|
||||
} from '../src/scoring.mjs';
|
||||
import { equivalentPhoneNumbers, normalizePhone } from '../src/phone.mjs';
|
||||
|
||||
test('telefones equivalentes preservam o numero exato antes da variante brasileira', () => {
|
||||
assert.equal(normalizePhone('+55 (75) 99909-1780'), '5575999091780');
|
||||
assert.deepEqual(equivalentPhoneNumbers('5575999091780'), ['5575999091780', '557599091780']);
|
||||
assert.deepEqual(equivalentPhoneNumbers('557599091780'), ['557599091780', '5575999091780']);
|
||||
});
|
||||
|
||||
test('validatePhone aceita celular e fixo com 55', () => {
|
||||
assert.equal(validatePhone('557193335451').valid, true);
|
||||
assert.equal(validatePhone('5571993335451').valid, true);
|
||||
});
|
||||
|
||||
test('validatePhone rejeita vazio, curto e ddd invalido', () => {
|
||||
assert.deepEqual(validatePhone(''), { valid: false, motivo: 'telefone vazio' });
|
||||
assert.equal(validatePhone('7199999').valid, false);
|
||||
assert.equal(validatePhone('550599999999').valid, false);
|
||||
assert.equal(validatePhone('5571000000000').valid, false);
|
||||
});
|
||||
|
||||
test('validateCnpj valida digitos verificadores', () => {
|
||||
// CNPJ real da base legada (PREMIUM EXPRESS)
|
||||
assert.equal(validateCnpj('57557263000113'), true);
|
||||
assert.equal(validateCnpj('57557263000114'), false);
|
||||
assert.equal(validateCnpj('11111111111111'), false);
|
||||
assert.equal(validateCnpj('123'), false);
|
||||
});
|
||||
|
||||
test('validateEmpresa aplica regra critica do relatorio legado', () => {
|
||||
assert.equal(validateEmpresa('PREMIUM EXPRESS').valid, true);
|
||||
assert.deepEqual(validateEmpresa('57.563.316 JHONATAS SOUZA'), { valid: false, motivo: 'empresa comeca com numero' });
|
||||
assert.deepEqual(validateEmpresa('-'), { valid: false, motivo: 'empresa vazia ou com lixo' });
|
||||
assert.deepEqual(validateEmpresa(''), { valid: false, motivo: 'empresa vazia ou com lixo' });
|
||||
assert.equal(validateEmpresa('...***...').valid, false);
|
||||
});
|
||||
|
||||
test('scoreQualidade: lead completo com website bate 100', () => {
|
||||
const result = scoreQualidade({
|
||||
whatsapp: '557193335451',
|
||||
cnpj: '57557263000113',
|
||||
empresa: 'PREMIUM EXPRESS',
|
||||
cidade: 'Salvador',
|
||||
segmento: 'restaurantes',
|
||||
cnae: '5611203',
|
||||
website: 'https://premiumexpress.com.br'
|
||||
});
|
||||
|
||||
assert.equal(result.score, 100);
|
||||
assert.equal(result.telefoneValido, true);
|
||||
assert.equal(result.cnpjValido, true);
|
||||
assert.equal(result.empresaValida, true);
|
||||
});
|
||||
|
||||
test('scoreQualidade: sem telefone/website perde 30+5 pontos', () => {
|
||||
const result = scoreQualidade({
|
||||
whatsapp: '',
|
||||
cnpj: '57557263000113',
|
||||
empresa: 'PREMIUM EXPRESS',
|
||||
cidade: 'Salvador',
|
||||
segmento: 'restaurantes',
|
||||
cnae: '5611203',
|
||||
website: ''
|
||||
});
|
||||
|
||||
assert.equal(result.score, 65);
|
||||
assert.equal(result.telefoneValido, false);
|
||||
});
|
||||
|
||||
test('scoreComercial: nicho alta aderencia + tudo valido bate 100', () => {
|
||||
const score = scoreComercial({
|
||||
whatsapp: '557193335451',
|
||||
cnpj: '57557263000113',
|
||||
website: 'https://premiumexpress.com.br',
|
||||
email: 'contato@premiumexpress.com.br',
|
||||
affinity: 'alta'
|
||||
});
|
||||
assert.equal(score, 100);
|
||||
});
|
||||
|
||||
test('scoreComercial: nicho baixa aderencia sem website/email/whatsapp/cnpj fica so com os pontos do nicho', () => {
|
||||
const score = scoreComercial({ whatsapp: '', cnpj: '', website: '', email: '', affinity: 'baixa' });
|
||||
assert.equal(score, 20);
|
||||
});
|
||||
|
||||
test('scoreGeral combina 60% comercial + 40% qualidade', () => {
|
||||
assert.equal(scoreGeral(100, 100), 100);
|
||||
assert.equal(scoreGeral(50, 50), 50);
|
||||
assert.equal(scoreGeral(0, 100), 60);
|
||||
assert.equal(scoreGeral(100, 0), 40);
|
||||
});
|
||||
|
||||
test('classificarScoreGeral aplica as 5 faixas', () => {
|
||||
assert.equal(classificarScoreGeral(95).id, 'excelente');
|
||||
assert.equal(classificarScoreGeral(80).id, 'bom');
|
||||
assert.equal(classificarScoreGeral(60).id, 'medio');
|
||||
assert.equal(classificarScoreGeral(40).id, 'baixo');
|
||||
assert.equal(classificarScoreGeral(10).id, 'muito_baixo');
|
||||
});
|
||||
|
||||
test('dedupKey segue precedencia cnpj > phone > empresa+cidade', () => {
|
||||
assert.equal(
|
||||
dedupKey({ cnpj: '57557263000113', whatsapp: '557193335451', empresa: 'X', cidade: 'Y' }),
|
||||
'cnpj:57557263000113'
|
||||
);
|
||||
assert.equal(
|
||||
dedupKey({ cnpj: '123', whatsapp: '557193335451', empresa: 'X', cidade: 'Y' }),
|
||||
'phone:557193335451'
|
||||
);
|
||||
assert.equal(
|
||||
dedupKey({ cnpj: '', whatsapp: '', empresa: 'Premium Express', cidade: 'Salvador' }),
|
||||
'name:premium express:salvador'
|
||||
);
|
||||
});
|
||||
|
||||
test('extractDdd retira o ddd do numero normalizado', () => {
|
||||
assert.equal(extractDdd('557193335451'), '71');
|
||||
assert.equal(extractDdd('999'), '');
|
||||
});
|
||||
|
||||
test('segmentLabel formata igual ao segmento_legivel legado', () => {
|
||||
assert.equal(segmentLabel('lojas_de_calcados'), 'Lojas De Calcados');
|
||||
assert.equal(segmentLabel('saloes_de_beleza'), 'Saloes De Beleza');
|
||||
});
|
||||
Reference in New Issue
Block a user