package markdown
import (
"strings"
"testing"
)
// TestGFMExtensions: Tabellen, Durchstreichen, Checklisten und automatische
// Links funktionieren — in Einträgen genauso wie in der Hilfe (AUSBAUSTUFEN.md 5.3).
func TestGFMExtensions(t *testing.T) {
cases := []struct {
name, source, want 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": RenderWithAnchors,
}
for rName, render := range renderer {
for _, f := range cases {
html, err := render(f.source)
if err != nil {
t.Fatalf("%s/%s: %v", rName, f.name, err)
}
if !strings.Contains(html, f.want) {
t.Errorf("%s/%s: %q fehlt in %q", rName, f.name, f.want, html)
}
}
}
}
// TestNoRawHTML 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 TestNoRawHTML(t *testing.T) {
evil := []string{
"",
`
`,
"[klick](javascript:alert(1))",
"| a |\n|---|\n| |",
"- [ ] ",
}
for _, source := range evil {
for _, render := range []func(string) (string, error){Render, RenderWithAnchors} {
html, _ := render(source)
if strings.Contains(html, "