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>
71 lines
2.1 KiB
Go
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{"< 1000", "> 500", "& 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)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|