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 != "

x

#6c5b35
" { 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") } }