diff --git a/tpl/template.go b/tpl/template.go index bb85225d4..36737eb77 100644 --- a/tpl/template.go +++ b/tpl/template.go @@ -41,6 +41,7 @@ type Template interface { LoadTemplates(absPath string) LoadTemplatesWithPrefix(absPath, prefix string) AddTemplate(name, tpl string) error + AddAceTemplate(name, basePath, innerPath string, baseContent, innerContent []byte) error AddInternalTemplate(prefix, name, tpl string) error AddInternalShortcode(name, tpl string) error PrintErrors() diff --git a/tpl/template_test.go b/tpl/template_test.go index 3c009c599..99c85affb 100644 --- a/tpl/template_test.go +++ b/tpl/template_test.go @@ -1,11 +1,83 @@ package tpl import ( + "bytes" "errors" "io/ioutil" + "os" + "path/filepath" "testing" ) +// Some tests for Issue #1178 -- Ace +func TestAceTemplates(t *testing.T) { + + for i, this := range []struct { + basePath string + innerPath string + baseContent string + innerContent string + expect string + expectErr int + }{ + {"", filepath.FromSlash("_default/single.ace"), "", "{{ . }}", "DATA", 0}, + {filepath.FromSlash("_default/baseof.ace"), filepath.FromSlash("_default/single.ace"), + `= content main + h2 This is a content named "main" of an inner template. {{ . }}`, + `= doctype html +html lang=en + head + meta charset=utf-8 + title Base and Inner Template + body + h1 This is a base template {{ . }} + = yield main`, `Base and Inner Template

This is a base template DATA

`, 0}, + } { + + for _, root := range []string{"", os.TempDir()} { + + templ := New() + + basePath := this.basePath + innerPath := this.innerPath + + if basePath != "" && root != "" { + basePath = filepath.Join(root, basePath) + } + + if innerPath != "" && root != "" { + innerPath = filepath.Join(root, innerPath) + } + + d := "DATA" + + err := templ.AddAceTemplate("mytemplate.ace", basePath, innerPath, + []byte(this.baseContent), []byte(this.innerContent)) + + if err != nil && this.expectErr == 0 { + t.Errorf("Test %d with root '%s' errored: %s", i, root, err) + } else if err == nil && this.expectErr == 1 { + t.Errorf("#1 Test %d with root '%s' should have errored", i, root) + } + + var buff bytes.Buffer + err = templ.ExecuteTemplate(&buff, "mytemplate.html", d) + + if err != nil && this.expectErr == 0 { + t.Errorf("Test %d with root '%s' errored: %s", i, root, err) + } else if err == nil && this.expectErr == 2 { + t.Errorf("#2 Test with root '%s' %d should have errored", root, i) + } else { + result := buff.String() + if result != this.expect { + t.Errorf("Test %d with root '%s' got\n%s\nexpected\n%s", i, root, result, this.expect) + } + } + } + } + +} + // Test for bugs discovered by https://github.com/dvyukov/go-fuzz func TestTplGoFuzzReports(t *testing.T) {