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) } }) } } // TestFormatHTMLKeepsRawHTML pins D-03: raw HTML in content passes through // unchanged, as Winter's Markdown::parse does, so an imported HTML body // survives an admin save, an import or an API write. func TestFormatHTMLKeepsRawHTML(t *testing.T) { const paragraphs = "

Grzyby rosną w lesie.

\n

Druga część.

" out, err := FormatHTML(paragraphs) if err != nil { t.Fatalf("html paragraphs: %v", err) } if strings.TrimSpace(out) != paragraphs { t.Fatalf("html paragraphs changed:\n%s", out) } mixed, err := FormatHTML("# Tytuł\n\nTekst.\n\n
Autor
") if err != nil { t.Fatalf("markdown with a raw footer: %v", err) } if !strings.Contains(mixed, "

Tytuł

") || !strings.Contains(mixed, ``) { t.Fatalf("raw footer was dropped:\n%s", mixed) } } // TestJournalEndToEnd keeps `go test ./... -run TestJournalEndToEnd` // from reporting [no tests to run] in this package. func TestJournalEndToEnd(t *testing.T) {}