Files
jfa-go/template_test.go
Harvey Tindall 0b43ad4ed5 template: passed var and conditional names don't include braces
pass []string{"username"}, rather than []string{"{username}"}. Tests
have been updated.
2025-08-23 14:59:04 +01:00

129 lines
3.7 KiB
Go

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, from "%+v""`, out, target, newIn)
}
}
}
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))
}
}
}