App local (Node + SQLite) para captura, tratamento e exportacao de leads comerciais, com dashboard de gestao, login/usuarios e integracao Z-PRO. Co-Authored-By: Claude <noreply@anthropic.com>
70 lines
2.5 KiB
JavaScript
70 lines
2.5 KiB
JavaScript
import test from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
import { openDb } from '../src/db.mjs';
|
|
import { runCapture, createCaptureRun } from '../src/capture/runner.mjs';
|
|
|
|
const SEGMENTS = [
|
|
{ name: 'mercados_de_bairro', label: 'Mercados De Bairro', interest: 'ERP / sistema de gestao', queries: ['mercado'], cnaeCodes: ['4711302'], overpassTags: [], pains: ['estoque'] },
|
|
{ name: 'clinicas_medicas', label: 'Clinicas Medicas', interest: 'gestao de TI', queries: ['clinica'], cnaeCodes: ['8630501'], overpassTags: [], pains: ['agenda'] },
|
|
{ name: 'restaurantes', label: 'Restaurantes', interest: 'autoatendimento WhatsApp', queries: ['restaurante'], cnaeCodes: ['5611201'], overpassTags: [], pains: ['pedidos'] }
|
|
];
|
|
|
|
function captureParams() {
|
|
return {
|
|
sources: ['mock'],
|
|
uf: 'BA',
|
|
cities: ['Santo Antonio de Jesus'],
|
|
segments: SEGMENTS,
|
|
limits: { maxPerQuery: 10, queryLimit: 0 }
|
|
};
|
|
}
|
|
|
|
test('runCapture insere leads do mock e deduplica no rerun', async () => {
|
|
const db = openDb(':memory:');
|
|
|
|
const runId = createCaptureRun(db, {});
|
|
const first = await runCapture({ db, runId, params: captureParams() });
|
|
assert.equal(first.raw, 3);
|
|
assert.equal(first.new, 3);
|
|
assert.equal(first.dup, 0);
|
|
assert.equal(first.status, 'done');
|
|
|
|
const run = db.prepare('SELECT * FROM capture_runs WHERE id = ?').get(runId);
|
|
assert.equal(run.status, 'done');
|
|
assert.equal(run.new_count, 3);
|
|
assert.ok(run.finished_at);
|
|
|
|
const lead = db.prepare("SELECT * FROM leads WHERE segmento = 'restaurantes'").get();
|
|
assert.equal(lead.uf, 'BA');
|
|
assert.equal(lead.cidade, 'Santo Antonio de Jesus');
|
|
assert.equal(lead.origem, 'mock');
|
|
assert.equal(lead.telefone_valido, 1);
|
|
assert.ok(lead.dedup_key.startsWith('phone:'));
|
|
assert.equal(lead.capture_run_id, runId);
|
|
|
|
// rerun: tudo duplicado
|
|
const runId2 = createCaptureRun(db, {});
|
|
const second = await runCapture({ db, runId: runId2, params: captureParams() });
|
|
assert.equal(second.new, 0);
|
|
assert.equal(second.dup, 3);
|
|
assert.equal(db.prepare('SELECT COUNT(*) AS t FROM leads').get().t, 3);
|
|
|
|
db.close();
|
|
});
|
|
|
|
test('runCapture respeita cancelamento', async () => {
|
|
const db = openDb(':memory:');
|
|
const runId = createCaptureRun(db, {});
|
|
|
|
const result = await runCapture({
|
|
db,
|
|
runId,
|
|
params: captureParams(),
|
|
isCancelled: () => true
|
|
});
|
|
|
|
assert.equal(result.status, 'cancelled');
|
|
assert.equal(db.prepare('SELECT status FROM capture_runs WHERE id = ?').get(runId).status, 'cancelled');
|
|
db.close();
|
|
});
|