Support DieOnBadParams option, add tests
This commit is contained in:
parent
5b1368dca0
commit
83fa60f797
@ -111,12 +111,12 @@ func New(opts Option) (*TemplateNest, error) {
|
|||||||
func (nest *TemplateNest) index(filePath string) (TemplateFileIndex, error) {
|
func (nest *TemplateNest) index(filePath string) (TemplateFileIndex, error) {
|
||||||
contents, err := ioutil.ReadFile(filePath)
|
contents, err := ioutil.ReadFile(filePath)
|
||||||
if err != nil {
|
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
|
// Capture last modified time
|
||||||
fileInfo, err := os.Stat(filePath)
|
fileInfo, err := os.Stat(filePath)
|
||||||
if err != nil {
|
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{})
|
variableNames := make(map[string]struct{})
|
||||||
@ -205,12 +205,16 @@ func (nest *TemplateNest) Render(toRender interface{}) (string, error) {
|
|||||||
case Hash:
|
case Hash:
|
||||||
tLabel, ok := v[nest.option.NameLabel]
|
tLabel, ok := v[nest.option.NameLabel]
|
||||||
if !ok {
|
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)
|
tName, ok := tLabel.(string)
|
||||||
if !ok {
|
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)
|
tFile := nest.getTemplateFilePath(tName)
|
||||||
@ -225,11 +229,24 @@ func (nest *TemplateNest) Render(toRender interface{}) (string, error) {
|
|||||||
if !exists || fileInfo.ModTime().After(tIndex.LastModified) {
|
if !exists || fileInfo.ModTime().After(tIndex.LastModified) {
|
||||||
newIndex, err := nest.index(tFile)
|
newIndex, err := nest.index(tFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("File index failed: %w", err)
|
return "", fmt.Errorf("file index failed: %w", err)
|
||||||
}
|
}
|
||||||
tIndex = newIndex
|
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
|
rendered := tIndex.Contents
|
||||||
for i := len(tIndex.Variables) - 1; i >= 0; i-- {
|
for i := len(tIndex.Variables) - 1; i >= 0; i-- {
|
||||||
variable := tIndex.Variables[i]
|
variable := tIndex.Variables[i]
|
||||||
@ -257,6 +274,6 @@ func (nest *TemplateNest) Render(toRender interface{}) (string, error) {
|
|||||||
return strings.TrimSpace(rendered), nil
|
return strings.TrimSpace(rendered), nil
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return "", fmt.Errorf("Unsupported template type: %+v", v)
|
return "", fmt.Errorf("unsupported template hash value type: %+v", v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
72
tests/02_die_on_bad_params_test.go
Normal file
72
tests/02_die_on_bad_params_test.go
Normal file
@ -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)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user