package blockpage import ( "crypto/tls" "io" "log/slog" "strings" "testing" ) func discardLogger() *slog.Logger { return slog.New(slog.NewTextHandler(io.Discard, nil)) } func TestRenderFillsPlaceholders(t *testing.T) { out, err := Render(`

{{.Domain}} blocked by {{.ListName}} ({{.PolicyName}})

`) if err != nil { t.Fatalf("render: %v", err) } if !strings.Contains(out, "ads.example-tracker.com blocked by Advertising (Default Protection)") { t.Errorf("unexpected output: %s", out) } } func TestRenderRejectsInvalidTemplate(t *testing.T) { if _, err := Render(`{{.Domain`); err == nil { t.Fatal("expected a parse error for unterminated action") } } func TestRenderEscapesAttackerControlledDomain(t *testing.T) { // html/template must escape a hostile-looking hostname; a browser-facing // error page has no business ever emitting attacker HTML unescaped. out, err := Render(`

{{.Domain}}

`) if err != nil { t.Fatalf("render: %v", err) } if strings.Contains(out, "