package markdown
import (
"strings"
"testing"
)
// TestGFMErweiterungen: Tabellen, Durchstreichen, Checklisten und automatische
// Links funktionieren — in Einträgen genauso wie in der Hilfe (AUSBAUSTUFEN.md 5.3).
func TestGFMErweiterungen(t *testing.T) {
faelle := []struct {
name, quelle, erwartet string
}{
{"Tabelle", "| a | b |\n|---|---|\n| 1 | 2 |", "
"},
{"Durchstreichen", "~~veraltet~~", "veraltet"},
{"Checkliste offen", "- [ ] offen", ``},
{"Checkliste erledigt", "- [x] erledigt", ``},
{"automatischer Link", "siehe https://example.org", ``},
}
// Beide Renderer prüfen: Sie sollen sich nur in den Ankern unterscheiden.
renderer := map[string]func(string) (string, error){
"Render": Render,
"RenderMitAnkern": RenderMitAnkern,
}
for rName, render := range renderer {
for _, f := range faelle {
html, err := render(f.quelle)
if err != nil {
t.Fatalf("%s/%s: %v", rName, f.name, err)
}
if !strings.Contains(html, f.erwartet) {
t.Errorf("%s/%s: %q fehlt in %q", rName, f.name, f.erwartet, html)
}
}
}
}
// TestKeinRohHTML ist der wichtigste Test dieses Pakets: Die Weboberfläche setzt
// das Ergebnis ohne weiteres Escaping in die Seite. Das geht nur, solange hier
// weder Skripte noch gefährliche Link-Ziele durchkommen — auch nicht mit den
// GFM-Erweiterungen.
func TestKeinRohHTML(t *testing.T) {
boese := []string{
"",
`
`,
"[klick](javascript:alert(1))",
"| a |\n|---|\n| |",
"- [ ] ",
}
for _, quelle := range boese {
for _, render := range []func(string) (string, error){Render, RenderMitAnkern} {
html, _ := render(quelle)
if strings.Contains(html, "