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.
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();
|
|
});
|