From 3adf8b452028059d3612fe697378ce4af0c94449 Mon Sep 17 00:00:00 2001 From: andig Date: Mon, 22 Dec 2025 13:55:52 +0100 Subject: [PATCH] Templates: error on missing required values (#25932) --- tests/vehicle-error.evcc.yaml | 1 + util/templates/template.go | 8 ++++++++ util/templates/template_test.go | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/tests/vehicle-error.evcc.yaml b/tests/vehicle-error.evcc.yaml index bcce474b8..d1f06a05f 100755 --- a/tests/vehicle-error.evcc.yaml +++ b/tests/vehicle-error.evcc.yaml @@ -50,5 +50,6 @@ vehicles: type: template template: tesla # not optimal, since real communication with tesla server is happening title: Broken Tesla + clientId: test_client_id accessToken: A refreshToken: B diff --git a/util/templates/template.go b/util/templates/template.go index 10464e44e..bd0f37ee9 100644 --- a/util/templates/template.go +++ b/util/templates/template.go @@ -7,6 +7,7 @@ import ( "slices" "strconv" "strings" + "testing" "text/template" "github.com/Masterminds/sprig/v3" @@ -354,6 +355,13 @@ func (t *Template) RenderResult(renderMode int, other map[string]any) ([]byte, m if val != nil { s = p.yamlQuote(fmt.Sprintf("%v", val)) } + + // validate required fields from yaml + if s == "" && p.IsRequired() && (renderMode == RenderModeUnitTest || + renderMode == RenderModeInstance && !testing.Testing()) { + return nil, nil, fmt.Errorf("missing required `%s`", p.Name) + } + res[out] = s } } diff --git a/util/templates/template_test.go b/util/templates/template_test.go index 9432523d0..b54e33573 100644 --- a/util/templates/template_test.go +++ b/util/templates/template_test.go @@ -32,3 +32,36 @@ func TestPresets(t *testing.T) { {Name: "last"}, }, tmpl.Params) } + +func TestRequired(t *testing.T) { + tmpl := &Template{ + TemplateDefinition: TemplateDefinition{ + Params: []Param{ + { + Name: "param", + Required: true, + }, + }, + }, + } + + _, _, err := tmpl.RenderResult(RenderModeUnitTest, map[string]any{ + "Param": "foo", + }) + require.NoError(t, err) + + _, _, err = tmpl.RenderResult(RenderModeUnitTest, map[string]any{ + "Param": "", + }) + require.Error(t, err) + + _, _, err = tmpl.RenderResult(RenderModeUnitTest, map[string]any{ + "Param": nil, + }) + require.Error(t, err) + + _, _, err = tmpl.RenderResult(RenderModeDocs, map[string]any{ + "Param": nil, + }) + require.NoError(t, err) +}