Merge pull request #1994 from webtecnica/fix/1959-para-evento-google-nunca-notes

test(agenda): cerca — paraEventoDoGoogle nunca vaza a anotação interna (#1959)
This commit is contained in:
Rafael Melgaço
2026-09-30 09:39:23 -03:00
committed by GitHub
+26
View File
@@ -216,6 +216,32 @@ describe("paraEventoDoGoogle", () => {
paraEventoDoGoogle(agendamento({ participantes: [{ email: " " }] })),
).toThrow(/participante sem e-mail/);
});
// ─── A CERCA (#1959) ────────────────────────────────────────────────────
// `AgendamentoParaGoogle` não tem `notes`, mas o `sync-executor.ts` chama esta
// função com `{ ...a, ... }` — o snapshot inteiro. Se o snapshot voltar a
// carregar `notes`, ele CHEGA aqui em tempo de execução, e o TypeScript não
// acusa nada (nem se os dois tipos ganharem o campo: medido). A cerca é de
// runtime. O caso sem observação é o que importa: foi exatamente o
// `a.description?.trim() || a.notes?.trim()` da #1959.
it.each([
["com observação visível", "Primeira consulta", "Primeira consulta"],
["sem observação (null)", null, undefined],
["com observação em branco", " ", undefined],
])("⚠️ nunca vaza a anotação INTERNA (notes) para o Google — %s", (_rotulo, description, esperada) => {
const comNotaInterna = {
...agendamento({ description }),
notes: "queixa clínica: paciente com ansiedade e dor torácica recorrente",
} as unknown as AgendamentoParaGoogle;
const corpo = paraEventoDoGoogle(comNotaInterna);
expect(corpo.description).toBe(esperada);
// Nenhum campo do corpo pode carregar o texto interno — pega também um
// espalhamento (`...a`) que criasse uma chave nova.
const serializa = JSON.stringify(corpo);
expect(serializa).not.toContain("queixa clínica");
expect(serializa).not.toContain("dor torácica");
expect("notes" in corpo).toBe(false);
});
});
// ─── VOLTA ─────────────────────────────────────────────────────────────────