Support DieOnBadParams option, add tests

This commit is contained in:
Andinus 2024-11-16 10:29:59 +05:30
parent 5b1368dca0
commit 83fa60f797
Signed by: andinus
GPG Key ID: B67D55D482A799FD
2 changed files with 95 additions and 6 deletions

@ -111,12 +111,12 @@ func New(opts Option) (*TemplateNest, error) {
func (nest *TemplateNest) index(filePath string) (TemplateFileIndex, error) {
contents, err := ioutil.ReadFile(filePath)
if err != nil {
return TemplateFileIndex{}, fmt.Errorf("Error reading file (`%s`): %w", filePath, err)
return TemplateFileIndex{}, fmt.Errorf("error reading file (`%s`): %w", filePath, err)
}
// Capture last modified time
fileInfo, err := os.Stat(filePath)
if err != nil {
return TemplateFileIndex{}, fmt.Errorf("Error getting file (`%s`) info: %w", filePath, err)
return TemplateFileIndex{}, fmt.Errorf("error getting file (`%s`) info: %w", filePath, err)
}
variableNames := make(map[string]struct{})
@ -205,12 +205,16 @@ func (nest *TemplateNest) Render(toRender interface{}) (string, error) {
case Hash:
tLabel, ok := v[nest.option.NameLabel]
if !ok {
return "", fmt.Errorf("missing template label: %s", nest.option.NameLabel)
return "", fmt.Errorf(
"encountered hash with no name label (name label: `%s`)", nest.option.NameLabel,
)
}
tName, ok := tLabel.(string)
if !ok {
return "", fmt.Errorf("invalid template label: %+v", tLabel)
return "", fmt.Errorf(
"encountered hash with invalid name label type: %+v", tLabel,
)
}
tFile := nest.getTemplateFilePath(tName)
@ -225,11 +229,24 @@ func (nest *TemplateNest) Render(toRender interface{}) (string, error) {
if !exists || fileInfo.ModTime().After(tIndex.LastModified) {
newIndex, err := nest.index(tFile)
if err != nil {
return "", fmt.Errorf("File index failed: %w", err)
return "", fmt.Errorf("file index failed: %w", err)
}
tIndex = newIndex
}
if nest.option.DieOnBadParams {
for k, _ := range v {
// If a variable in template hash is not present in template
// file and it's not the template label then it's a bad param.
_, exists := tIndex.VariableNames[k]
if !exists && k != nest.option.NameLabel {
return "", fmt.Errorf(
"bad params in template hash, variable not present in template file: `%s`", k,
)
}
}
}
rendered := tIndex.Contents
for i := len(tIndex.Variables) - 1; i >= 0; i-- {
variable := tIndex.Variables[i]
@ -257,6 +274,6 @@ func (nest *TemplateNest) Render(toRender interface{}) (string, error) {
return strings.TrimSpace(rendered), nil
default:
return "", fmt.Errorf("Unsupported template type: %+v", v)
return "", fmt.Errorf("unsupported template hash value type: %+v", v)
}
}

@ -0,0 +1,72 @@
package tests
import (
"git.virtual.blue/tomgracey/template-nest-go"
"github.com/stretchr/testify/assert"
"testing"
)
func TestDieOnPageWithBadParams(t *testing.T) {
nest, err := templatenest.New(templatenest.Option{
TemplateDir: "templates",
DieOnBadParams: true,
})
if err != nil {
t.Fatalf("Failed to initialize TemplateNest: %+v", err)
}
page := templatenest.Hash{
"TEMPLATE": "00-simple-page",
"variable": "Simple Variable",
"simple_component": "Simple Component",
"a_bad_param": "Bad Param",
}
_, err = nest.Render(page)
if assert.NotNil(t, err) {
expected := "bad params in template hash, variable not present in template file: `a_bad_param`"
assert.Equal(t, expected, err.Error())
}
}
func TestDieOnPageWithBadParams01(t *testing.T) {
nest, err := templatenest.New(templatenest.Option{
TemplateDir: "templates",
DieOnBadParams: true,
})
if err != nil {
t.Fatalf("Failed to initialize TemplateNest: %+v", err)
}
page := templatenest.Hash{
"TEMPLATE": "00-simple-page",
"variable": "Simple Variable",
"a_bad_param": "Bad Param",
}
_, err = nest.Render(page)
if assert.NotNil(t, err) {
expected := "bad params in template hash, variable not present in template file: `a_bad_param`"
assert.Equal(t, expected, err.Error())
}
}
func TestLiveOnPageWithBadParams(t *testing.T) {
nest, err := templatenest.New(templatenest.Option{
TemplateDir: "templates",
DieOnBadParams: false,
})
if err != nil {
t.Fatalf("Failed to initialize TemplateNest: %+v", err)
}
page := templatenest.Hash{
"TEMPLATE": "00-simple-page",
"variable": "Simple Variable",
"simple_component": "Simple Component",
"a_bad_param": "Bad Param",
}
_, err = nest.Render(page)
assert.Nil(t, err)
}