evcc-io/util/templates/render_testing.go
2023-08-17 21:41:44 +02:00

85 lines
2 KiB
Go

package templates
import (
"os"
"slices"
"testing"
"github.com/jinzhu/copier"
"gopkg.in/yaml.v3"
)
// test renders and instantiates plus yaml-parses the template per usage
func test(t *testing.T, tmpl Template, values map[string]interface{}, cb func(values map[string]interface{})) {
b, _, err := tmpl.RenderResult(TemplateRenderModeInstance, values)
if err != nil {
t.Log(string(b))
t.Error(err)
return
}
var instance interface{}
if err := yaml.Unmarshal(b, &instance); err != nil {
t.Log(string(b))
t.Error(err)
return
}
// actually run the instance if not on CI
if os.Getenv("CI") == "" {
cb(values)
}
}
func TestClass(t *testing.T, class Class, instantiate func(t *testing.T, values map[string]interface{})) {
for _, tmpl := range ByClass(class) {
tmpl := tmpl
t.Run(tmpl.Template, func(t *testing.T) {
// set default values for all params
values := tmpl.Defaults(TemplateRenderModeUnitTest)
// set the template value which is needed for rendering
values["template"] = tmpl.Template
// set modbus default test values
if values[ParamModbus] != nil {
modbusChoices := tmpl.ModbusChoices()
// we only test one modbus setup
if slices.Contains(modbusChoices, ModbusChoiceTCPIP) {
values[ModbusKeyTCPIP] = true
} else {
values[ModbusKeyRS485TCPIP] = true
}
tmpl.ModbusValues(TemplateRenderModeUnitTest, values)
}
usages := tmpl.Usages()
if len(usages) == 0 {
test(t, tmpl, values, func(values map[string]interface{}) {
instantiate(t, values)
})
return
}
for _, u := range usages {
// create a copy of the map for parallel execution
usageValues := make(map[string]interface{}, len(values)+1)
if err := copier.Copy(&usageValues, values); err != nil {
panic(err)
}
usageValues[ParamUsage] = u
// subtest for each usage
t.Run(u, func(t *testing.T) {
t.Parallel()
test(t, tmpl, usageValues, func(values map[string]interface{}) {
instantiate(t, values)
})
})
}
})
}
}