package pongo
import (
"strings"
"testing"
"testing/fstest"
"git.dev.alexdunmow.com/block/core/templates"
)
func TestNonPanickingCompileVariants(t *testing.T) {
fsys := fstest.MapFS{
"templates/theme/default.ninjatpl": {Data: []byte(`{{ slots.main|safe }}`)},
"templates/overrides/theme/heading.ninjatpl": {Data: []byte(`
{{ text }}
`)},
"templates/email/theme.ninjatpl": {Data: []byte(`{{ body|safe }} {{ colors.mutedForeground }}
`)},
"templates/broken.ninjatpl": {Data: []byte(`{% if %}`)},
}
e := NewEngine(fsys)
if _, err := e.PageTemplate("templates/theme/default.ninjatpl"); err != nil {
t.Fatalf("PageTemplate: %v", err)
}
bf, err := e.BlockTemplate("templates/overrides/theme/heading.ninjatpl")
if err != nil {
t.Fatalf("BlockTemplate: %v", err)
}
if got := bf(t.Context(), map[string]any{"text": "hi"}); got != "hi
" {
t.Errorf("override render = %q", got)
}
ef, err := e.EmailWrapper("templates/email/theme.ninjatpl")
if err != nil {
t.Fatalf("EmailWrapper: %v", err)
}
ectx := templates.EmailContext{}
ectx.Colors.MutedForeground = "#6c5b35"
if got := ef("x
", ectx); got != "" {
t.Errorf("email render = %q", got)
}
// Malformed templates return errors — no panic (hot-install safety).
if _, err := e.PageTemplate("templates/broken.ninjatpl"); err == nil {
t.Error("PageTemplate on broken template: want error")
}
if _, err := e.BlockTemplate("templates/missing.ninjatpl"); err == nil {
t.Error("BlockTemplate on missing file: want error")
}
}
func TestLinesFilter(t *testing.T) {
fsys := fstest.MapFS{
"t.ninjatpl": {Data: []byte(`{% for l in address|lines %}{{ l }}
{% endfor %}`)},
}
e := NewEngine(fsys)
bf, err := e.BlockTemplate("t.ninjatpl")
if err != nil {
t.Fatal(err)
}
got := bf(t.Context(), map[string]any{"address": "1 Meridian Plaza\r\n Floor 2 \n\nNew Gotham"})
want := "1 Meridian Plaza
Floor 2
New Gotham
"
if got != want {
t.Errorf("lines render = %q, want %q", got, want)
}
if strings.Contains(got, "\n") {
t.Error("unexpected raw newline in output")
}
}