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