Test and instantiate all template usages

This commit is contained in:
andig 2022-03-02 18:43:09 +01:00
parent de0c81280c
commit 29171842c8
4 changed files with 54 additions and 68 deletions

View file

@ -30,7 +30,7 @@ var acceptable = []string{
"Get \"http://192.0.2.2/getParameters\": context deadline exceeded", // evsewifi
}
func TestChargerTemplates(t *testing.T) {
func TestTemplates(t *testing.T) {
test.SkipCI(t)
for _, tmpl := range templates.ByClass(templates.Charger) {
@ -54,20 +54,8 @@ func TestChargerTemplates(t *testing.T) {
values = tmpl.ModbusValues(templates.TemplateRenderModeInstance, true, values)
}
t.Run(tmpl.Template, func(t *testing.T) {
t.Parallel()
b, values, err := tmpl.RenderResult(templates.TemplateRenderModeUnitTest, values)
if err != nil {
t.Logf("Template: %s", tmpl.Template)
t.Logf("%s", string(b))
t.Error(err)
}
_, err = NewFromConfig("template", values)
if err != nil && !test.Acceptable(err, acceptable) {
t.Logf("Template: %s", tmpl.Template)
t.Logf("%s", string(b))
templates.RenderTest(t, tmpl, values, func(values map[string]interface{}) {
if _, err := NewFromConfig("template", values); err != nil && !test.Acceptable(err, acceptable) {
t.Error(err)
}
})

View file

@ -27,9 +27,7 @@ var acceptable = []string{
"login failed: Put \"https://192.0.2.2/v1/login\": context deadline exceeded", // LG ESS
}
func TestMeterTemplates(t *testing.T) {
test.SkipCI(t)
func TestTemplates(t *testing.T) {
for _, tmpl := range templates.ByClass(templates.Meter) {
tmpl := tmpl
@ -51,39 +49,10 @@ func TestMeterTemplates(t *testing.T) {
values = tmpl.ModbusValues(templates.TemplateRenderModeInstance, true, values)
}
usages := tmpl.Usages()
if len(usages) == 0 {
runTest(t, tmpl, values)
} else {
// test all usages
for _, usage := range usages {
// set the usage param value
if usage != "" {
values[templates.ParamUsage] = usage
}
runTest(t, tmpl, values)
templates.RenderTest(t, tmpl, values, func(values map[string]interface{}) {
if _, err := NewFromConfig("template", values); err != nil && !test.Acceptable(err, acceptable) {
t.Error(err)
}
}
})
}
}
func runTest(t *testing.T, tmpl templates.Template, values map[string]interface{}) {
t.Run(tmpl.Template, func(t *testing.T) {
t.Parallel()
b, values, err := tmpl.RenderResult(templates.TemplateRenderModeUnitTest, values)
if err != nil {
t.Logf("Template: %s", tmpl.Template)
t.Logf("%s", string(b))
t.Error(err)
}
if _, err := NewFromConfig("template", values); err != nil && !test.Acceptable(err, acceptable) {
t.Logf("Template: %s", tmpl.Template)
t.Logf("%s", string(b))
t.Error(err)
}
})
}

43
util/templates/render.go Normal file
View file

@ -0,0 +1,43 @@
package templates
import (
"os"
"testing"
"gopkg.in/yaml.v3"
)
// RenderTest renders and instantiates plus yaml-parses the template per usage
func RenderTest(t *testing.T, tmpl Template, values map[string]interface{}, cb func(values map[string]interface{})) {
t.Run(tmpl.Template, func(t *testing.T) {
t.Parallel()
b, values, err := tmpl.RenderResult(TemplateRenderModeUnitTest, values)
if err != nil {
t.Log(string(b))
t.Error(err)
}
// instantiate all usage variants
for _, u := range tmpl.Usages() {
t.Run(u, func(t *testing.T) {
values[ParamUsage] = u
b, _, err := tmpl.RenderResult(TemplateRenderModeInstance, values)
if err != nil {
t.Errorf("usage: %s, result: %v", u, err)
}
var instance interface{}
if err := yaml.Unmarshal(b, &instance); err != nil {
t.Errorf("usage: %s, yaml: %v", u, err)
}
// actually run the instance if not on CI
if os.Getenv("CI") == "" {
cb(values)
}
})
}
})
}

View file

@ -35,9 +35,7 @@ var acceptable = []string{
"401: Unauthorized: Invalid credentials", // Volvo
}
func TestVehicleTemplates(t *testing.T) {
test.SkipCI(t)
func TestTemplates(t *testing.T) {
for _, tmpl := range templates.ByClass(templates.Vehicle) {
tmpl := tmpl
@ -47,20 +45,8 @@ func TestVehicleTemplates(t *testing.T) {
// set the template value which is needed for rendering
values["template"] = tmpl.Template
t.Run(tmpl.Template, func(t *testing.T) {
t.Parallel()
b, values, err := tmpl.RenderResult(templates.TemplateRenderModeUnitTest, values)
if err != nil {
t.Logf("Template: %s", tmpl.Template)
t.Logf("%s", string(b))
t.Error(err)
}
_, err = NewFromConfig("template", values)
if err != nil && !test.Acceptable(err, acceptable) {
t.Logf("Template: %s", tmpl.Template)
t.Logf("%s", string(b))
templates.RenderTest(t, tmpl, values, func(values map[string]interface{}) {
if _, err := NewFromConfig("template", values); err != nil && !test.Acceptable(err, acceptable) {
t.Error(err)
}
})