template: add tests, fix up easy holes
should cope with double-braced blocks now (treating them the same as single-braced. templateEmail now returns an error, which should not be seen as catastrophic, but reports likely mistakes.
This commit is contained in:
@@ -0,0 +1,128 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// In == Out when nothing is meant to be templated.
|
||||
func TestBlankTemplate(t *testing.T) {
|
||||
in := `Success, user! Your account has been created. Log in at myAccountURL with your username to get started.`
|
||||
|
||||
out, err := templateEmail(in, []string{}, []string{}, map[string]any{})
|
||||
|
||||
if err != nil {
|
||||
t.Fatalf("error: %+v", err)
|
||||
}
|
||||
|
||||
if out != in {
|
||||
t.Fatalf(`returned string doesn't match input: "%+v" != "%+v"`, out, in)
|
||||
}
|
||||
}
|
||||
|
||||
func testConditional(isTrue bool, t *testing.T) {
|
||||
in := `Success, {username}! Your account has been created. {if myCondition}Log in at {myAccountURL} with username {username} to get started.{endif}`
|
||||
|
||||
vars := []string{"{username}", "{myAccountURL}", "{myCondition}"}
|
||||
conds := vars
|
||||
vals := map[string]any{
|
||||
"username": "TemplateUsername",
|
||||
"myAccountURL": "TemplateURL",
|
||||
"myCondition": isTrue,
|
||||
}
|
||||
|
||||
out, err := templateEmail(in, vars, conds, vals)
|
||||
|
||||
target := ""
|
||||
if isTrue {
|
||||
target = `Success, {username}! Your account has been created. Log in at {myAccountURL} with username {username} to get started.`
|
||||
} else {
|
||||
target = `Success, {username}! Your account has been created. `
|
||||
}
|
||||
|
||||
target = strings.ReplaceAll(target, "{username}", vals["username"].(string))
|
||||
target = strings.ReplaceAll(target, "{myAccountURL}", vals["myAccountURL"].(string))
|
||||
|
||||
if err != nil {
|
||||
t.Fatalf("error: %+v", err)
|
||||
}
|
||||
|
||||
if out != target {
|
||||
t.Fatalf(`returned string doesn't match desired output: "%+v" != "%+v"`, out, target)
|
||||
}
|
||||
}
|
||||
|
||||
func TestConditionalTrue(t *testing.T) {
|
||||
testConditional(true, t)
|
||||
}
|
||||
|
||||
func TestConditionalFalse(t *testing.T) {
|
||||
testConditional(false, t)
|
||||
}
|
||||
|
||||
// Template mistakenly double-braced values, but return a warning.
|
||||
func TestTemplateDoubleBraceGracefulHandling(t *testing.T) {
|
||||
in := `Success, {{username}}! Your account has been created. Log in at {myAccountURL} with username {username} to get started.`
|
||||
|
||||
vars := []string{"{username}", "{myAccountURL}"}
|
||||
vals := map[string]any{
|
||||
"username": "TemplateUsername",
|
||||
"myAccountURL": "TemplateURL",
|
||||
}
|
||||
|
||||
target := strings.ReplaceAll(in, "{{username}}", vals["username"].(string))
|
||||
target = strings.ReplaceAll(target, "{username}", vals["username"].(string))
|
||||
target = strings.ReplaceAll(target, "{myAccountURL}", vals["myAccountURL"].(string))
|
||||
|
||||
out, err := templateEmail(in, vars, []string{}, vals)
|
||||
|
||||
if err == nil {
|
||||
t.Fatal("no error when given double-braced variable")
|
||||
}
|
||||
|
||||
if out != target {
|
||||
t.Fatalf(`returned string doesn't match desired output: "%+v" != "%+v"`, out, target)
|
||||
}
|
||||
}
|
||||
|
||||
func TestVarAtAnyPosition(t *testing.T) {
|
||||
in := `Success, user! Your account has been created. Log in at myAccountURL with your username to get started.`
|
||||
vars := []string{"{username}", "{myAccountURL}"}
|
||||
vals := map[string]any{
|
||||
"username": "TemplateUsername",
|
||||
"myAccountURL": "TemplateURL",
|
||||
}
|
||||
|
||||
for i := range in {
|
||||
newIn := in[0:i] + vars[0] + in[i:]
|
||||
|
||||
target := strings.ReplaceAll(newIn, vars[0], vals["username"].(string))
|
||||
|
||||
out, err := templateEmail(newIn, vars, []string{}, vals)
|
||||
|
||||
if err != nil {
|
||||
t.Fatalf("error: %+v", err)
|
||||
}
|
||||
|
||||
if out != target {
|
||||
t.Fatalf(`returned string doesn't match desired output: "%+v" != "%+v"`, out, target)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestIncompleteBlock(t *testing.T) {
|
||||
in := `Success, user! Your account has been created. Log in at myAccountURL with your username to get started.`
|
||||
for i := range in {
|
||||
newIn := in[0:i] + "{" + in[i:]
|
||||
|
||||
out, err := templateEmail(newIn, []string{"a"}, []string{"a"}, map[string]any{"a": "a"})
|
||||
|
||||
if out != newIn {
|
||||
t.Fatalf(`returned string for position %d/%d doesn't match desired output: "%+v" != "%+v"`, i+1, len(newIn), out, newIn)
|
||||
}
|
||||
if err == nil {
|
||||
t.Fatalf("no error when given incomplete block with brace at position %d/%d", i+1, len(newIn))
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user