diff --git a/charger/template_test.go b/charger/template_test.go index 70df77c28..b890d09f6 100644 --- a/charger/template_test.go +++ b/charger/template_test.go @@ -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) } }) diff --git a/meter/template_test.go b/meter/template_test.go index d64c3c441..8d1cd48c1 100644 --- a/meter/template_test.go +++ b/meter/template_test.go @@ -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) - } - }) -} diff --git a/util/templates/render.go b/util/templates/render.go new file mode 100644 index 000000000..5aa96f599 --- /dev/null +++ b/util/templates/render.go @@ -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) + } + }) + } + }) +} diff --git a/vehicle/template_test.go b/vehicle/template_test.go index aaa2d37ef..d43b61c61 100644 --- a/vehicle/template_test.go +++ b/vehicle/template_test.go @@ -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) } })