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, "