evcc-io/meter/template_test.go
2022-08-25 08:53:47 +02:00

61 lines
2 KiB
Go

package meter
import (
"testing"
"github.com/evcc-io/evcc/util/templates"
"github.com/evcc-io/evcc/util/test"
"golang.org/x/exp/slices"
)
var acceptable = []string{
"invalid plugin source: ...",
"missing mqtt broker configuration",
"mqtt not configured",
"not a SunSpec device",
"missing password", // Powerwall
"missing user or password", // Tapo
"connect: no route to host",
"connect: connection refused",
"connect: network is unreachable",
"i/o timeout",
"'sma': missing uri or serial", // SMA
"'fritzdect': missing ain", // FritzDect
"[1ESY1161052714 1ESY1161229249 1EMH0008842285 1ESY1161978584 1EMH0004864048 1ESY1161979033 7ELS8135823805]", // Discovergy
"can only have either uri or device", // modbus
"(Client.Timeout exceeded while awaiting headers)", // http
"unexpected status: 401", // Discovergy
"unexpected status: 503", // Discovergy
"login failed: Put \"https://192.0.2.2/v1/login\": context deadline exceeded", // LG ESS
}
func TestTemplates(t *testing.T) {
for _, tmpl := range templates.ByClass(templates.Meter) {
tmpl := tmpl
// set default values for all params
values := tmpl.Defaults(templates.TemplateRenderModeUnitTest)
// set the template value which is needed for rendering
values["template"] = tmpl.Template
// set modbus default test values
if values[templates.ParamModbus] != nil {
modbusChoices := tmpl.ModbusChoices()
// we only test one modbus setup
if slices.Contains(modbusChoices, templates.ModbusChoiceTCPIP) {
values[templates.ModbusKeyTCPIP] = true
} else {
values[templates.ModbusKeyRS485TCPIP] = true
}
tmpl.ModbusValues(templates.TemplateRenderModeInstance, values)
}
templates.RenderTest(t, tmpl, values, func(values map[string]interface{}) {
if _, err := NewFromConfig("template", values); err != nil && !test.Acceptable(err, acceptable) {
t.Log(values)
t.Error(err)
}
})
}
}