package classes import ( "strings" "testing" ) // TestFormatHTMLRejectsUnsafeHTML substitutes JOURNAL-003/004 Twig XSS // templates (Phase 16). Script, iframe, event handlers, and javascript / // vbscript / data schemes must fail the reject gate. Footnotes and tables // from goldmark extensions still pass. func TestFormatHTMLRejectsUnsafeHTML(t *testing.T) { html, err := FormatHTML("# Hello") if err != nil || !strings.Contains(html, "

") { t.Fatalf("safe heading: html=%s err=%v", html, err) } table, err := FormatHTML("| a | b |\n| - | - |\n| 1 | 2 |") if err != nil { t.Fatalf("table markdown: %v", err) } if !strings.Contains(table, "alert(1)", "`, "`, "onerror"}, {"javascript", "[x](javascript:alert(1))", "javascript:"}, {"vbscript", "[x](vbscript:msgbox(1))", "vbscript:"}, {"data", "[x](data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==)", "data:"}, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { out, err := FormatHTML(tc.src) if err == nil && strings.Contains(strings.ToLower(out), tc.needle) { t.Fatalf("unsafe HTML survived: %s", out) } if err == nil && (tc.name == "script" || tc.name == "iframe" || tc.name == "event") && strings.Contains(strings.ToLower(out), tc.needle) { t.Fatalf("FormatHTML accepted %s: %s", tc.name, out) } }) } } // TestJournalEndToEnd keeps `go test ./... -run TestJournalEndToEnd` // from reporting [no tests to run] in this package. func TestJournalEndToEnd(t *testing.T) {}