Files

43 lines
1.5 KiB
Go

package templates
import (
"strings"
"testing"
"git.sendico.io/tech/sxchnge/notifications/model"
)
func TestRenderAndValidate(t *testing.T) {
c, err := New([]Definition{{ID: "test", Version: "1", DefaultLocale: "en", Parameters: []string{"name"}, Locales: map[string]Content{"en": {Subject: "Hello {{.name}}", HTML: "<p>{{.name}}</p>", Text: "{{.name}}"}}}})
if err != nil {
t.Fatal(err)
}
r := model.Request{TemplateID: "test", TemplateVersion: "1", Parameters: map[string]string{"name": "<script>{{.other}}</script>"}}
result, err := c.Render(r)
if err != nil {
t.Fatal(err)
}
if strings.Contains(result.HTML, "<script>") || !strings.Contains(result.HTML, "{{.other}}") || result.Text != r.Parameters["name"] {
t.Fatalf("unsafe substitution: %+v", result)
}
for _, params := range []map[string]string{{}, {"name": "a", "extra": "b"}, {"wrong": "a"}, {"name": "bad\r\nsubject"}} {
r.Parameters = params
if _, err := c.Render(r); err == nil {
t.Fatal("invalid parameters accepted")
}
}
r.Parameters = map[string]string{"name": "valid"}
r.Locale = "unknown"
if _, err := c.Render(r); err == nil {
t.Fatal("unknown locale accepted")
}
}
func TestRejectBrokenCatalog(t *testing.T) {
for _, content := range []Content{{Subject: "Hello", HTML: "{{.undeclared}}"}, {Subject: "Hello", HTML: "{{"}, {HTML: "body"}} {
_, err := New([]Definition{{ID: "test", Version: "1", DefaultLocale: "en", Locales: map[string]Content{"en": content}}})
if err == nil {
t.Fatal("invalid template accepted")
}
}
}