Files
soft_usite/pkg/services/telegram_format_service_test.go
Lizandro GDandClaude Sonnet 5 7b0e4b9b5c fix: convertir Markdown a HTML de Telegram antes de enviar mensajes del agente
El bot manda mensajes con parse_mode=HTML, pero la IA responde en Markdown
(##, **negrita**, listas con "-", separadores ---), que Telegram no
interpreta — salía todo literal con los símbolos. Ahora FormatearParaTelegram
convierte el Markdown a las etiquetas que Telegram sí soporta (b, code, pre,
a) justo antes de enviar, escapando cualquier < > & literal para que
sendMessage tampoco falle por HTML inválido. Se ajustó el único lugar que ya
armaba HTML a mano (/instancias) para que use el mismo formato Markdown y
pase por el mismo conversor. Incluye tests con el caso real reportado.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-03 02:26:42 +00:00

71 lines
2.1 KiB
Go

package services
import (
"strings"
"testing"
)
func TestFormatearParaTelegram(t *testing.T) {
cases := []struct {
name string
in string
wantContains []string
wantNotContains []string
}{
{
name: "encabezado y negrita",
in: "## ✅ **¡Factura registrada exitosamente!**",
wantContains: []string{"<b>✅ ¡Factura registrada exitosamente!</b>"},
wantNotContains: []string{"##", "**"},
},
{
name: "lista con viñetas y negrita en cada línea",
in: "- **Factura ID:** 3\n- **Cliente:** DOCUXER S.A.S.",
wantContains: []string{"• <b>Factura ID:</b> 3", "• <b>Cliente:</b> DOCUXER S.A.S."},
wantNotContains: []string{"- **"},
},
{
name: "separador horizontal se elimina",
in: "Texto antes\n---\nTexto después",
wantContains: []string{"Texto antes", "Texto después"},
wantNotContains: []string{"---"},
},
{
name: "caracteres HTML literales se escapan",
in: "El monto es < 1000 y > 500 & sigue",
wantContains: []string{"&lt; 1000", "&gt; 500", "&amp; sigue"},
},
{
name: "código en línea se preserva sin escapar dos veces",
in: "Usa el comando `git status` para ver el estado",
wantContains: []string{"<code>git status</code>"},
},
{
name: "bloque de código se convierte a pre",
in: "```\nfunc main() {}\n```",
wantContains: []string{"<pre>func main() {}</pre>"},
},
{
name: "enlace markdown",
in: "Mira [este link](https://u-site.app)",
wantContains: []string{`<a href="https://u-site.app">este link</a>`},
},
}
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
got := FormatearParaTelegram(c.in)
for _, want := range c.wantContains {
if !strings.Contains(got, want) {
t.Errorf("esperaba que el resultado contuviera %q\nresultado: %q", want, got)
}
}
for _, notWant := range c.wantNotContains {
if strings.Contains(got, notWant) {
t.Errorf("no esperaba que el resultado contuviera %q\nresultado: %q", notWant, got)
}
}
})
}
}