V2: guarda de envio real (SEND_ENABLED/FORCE_SEND), idempotencia por send_key e Slack nativo
- src/v2/sendGuard.js (novo): canSend() reduz SHADOW_MODE/DEV_MODE/ SEND_ENABLED/FORCE_SEND a uma formula unica testada exaustivamente (secao 15 do ciclo final: matriz completa de guarda de seguranca). computeMessageHash/buildSendKey/isDuplicate implementam a chave logica de idempotencia da secao 13 (report_type+periodo+destino+hash). - src/v2/config.js: SEND_ENABLED, FORCE_SEND, SLACK_DESTINATION. - src/v2/pipeline.js: buildReport agora calcula envio.pode_enviar/ motivo_guarda/duplicata_bloqueada/send_key a partir de triggerType (.mode) e sendLogRows (Data Table de log de envios). - tools/build_v2_workflow*.js: novo Data Table 'Buscar Log de Envios', troca do HTTP Slack com webhook placeholder por node Slack nativo (credencial real lNqwBBrtLfkRqw2X, reaproveitada do projeto irmao Coordenador GLPI), branches de sucesso/falha gravando o log de envio so apos confirmacao real do Slack. - test/sendGuard.test.js, test/workflowStructure.test.js (novos): cobrem a matriz de guarda de seguranca e travam regressao do bug de timeout (executeOnce=true nos 8 nodes de leitura em lote) e do bug de sendGuard.js nao concatenado no Code node gerado. - Corrigido bug real encontrado nesta sessao: sendGuard.js nao estava na lista de modulos concatenados pelo gerador, deixando canSend/ computeMessageHash/buildSendKey undefined em runtime. - Deployado e validado ao vivo no DEV (workflow 3x5kb58TeBCvirm6): n8n_validate_workflow -> valid:true, 0 erros, executeOnce preservado nos 9 nodes de leitura em lote. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 5
parent
bdfa675d89
commit
64ddfb9b7b
@@ -316,3 +316,46 @@ test('spikesCategoria casa baseline e periodo atual por ID, nao por nome (evita
|
||||
// daria media >= 7).
|
||||
assert.equal(spike.baseline_media, 1.43);
|
||||
});
|
||||
|
||||
// --- envio (guarda de seguranca + idempotencia, secoes 12/13 ligadas ao pipeline) ---
|
||||
|
||||
test('envio.pode_enviar reflete a guarda de seguranca (scheduled + producao = true)', () => {
|
||||
const cfg = loadConfig({ SHADOW_MODE: false, DEV_MODE: false, SEND_ENABLED: true, SLACK_DESTINATION: 'C0BJNBTPFT5' });
|
||||
const r = buildReport(baseInput({ triggerType: 'scheduled', sendLogRows: [] }), cfg);
|
||||
assert.equal(r.envio.pode_enviar, true);
|
||||
assert.equal(r.envio.duplicata_bloqueada, false);
|
||||
});
|
||||
|
||||
test('envio.pode_enviar false quando SHADOW_MODE=true, mesmo scheduled+producao', () => {
|
||||
const cfg = loadConfig({ SHADOW_MODE: true, DEV_MODE: false, SEND_ENABLED: true, SLACK_DESTINATION: 'C0BJNBTPFT5' });
|
||||
const r = buildReport(baseInput({ triggerType: 'scheduled', sendLogRows: [] }), cfg);
|
||||
assert.equal(r.envio.pode_enviar, false);
|
||||
assert.match(r.envio.motivo_guarda, /SHADOW_MODE/);
|
||||
});
|
||||
|
||||
test('envio.pode_enviar false em execucao manual sem FORCE_SEND, mesmo com guards de producao ok', () => {
|
||||
const cfg = loadConfig({ SHADOW_MODE: false, DEV_MODE: false, SEND_ENABLED: true, FORCE_SEND: false, SLACK_DESTINATION: 'C0BJNBTPFT5' });
|
||||
const r = buildReport(baseInput({ triggerType: 'manual', sendLogRows: [] }), cfg);
|
||||
assert.equal(r.envio.pode_enviar, false);
|
||||
});
|
||||
|
||||
test('envio.duplicata_bloqueada=true e pode_enviar=false quando ja existe log de sucesso com a MESMA chave logica', () => {
|
||||
const cfg = loadConfig({ SHADOW_MODE: false, DEV_MODE: false, SEND_ENABLED: true, SLACK_DESTINATION: 'C0BJNBTPFT5' });
|
||||
const input = baseInput({ triggerType: 'scheduled', sendLogRows: [] });
|
||||
const primeira = buildReport(input, cfg);
|
||||
assert.equal(primeira.envio.pode_enviar, true);
|
||||
|
||||
const segunda = buildReport(
|
||||
baseInput({ triggerType: 'scheduled', sendLogRows: [{ send_key: primeira.envio.send_key, status: 'success' }] }),
|
||||
cfg
|
||||
);
|
||||
assert.equal(segunda.envio.pode_enviar, false);
|
||||
assert.equal(segunda.envio.duplicata_bloqueada, true);
|
||||
});
|
||||
|
||||
test('envio.send_key permanece estavel para o MESMO periodo/mensagem em duas chamadas distintas', () => {
|
||||
const cfg = loadConfig({ SLACK_DESTINATION: 'C0BJNBTPFT5' });
|
||||
const a = buildReport(baseInput({ triggerType: 'scheduled', sendLogRows: [] }), cfg);
|
||||
const b = buildReport(baseInput({ triggerType: 'scheduled', sendLogRows: [] }), cfg);
|
||||
assert.equal(a.envio.send_key, b.envio.send_key);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user