diff --git a/util/templates/template.go b/util/templates/template.go index 8a282e1288..6c43ca441e 100644 --- a/util/templates/template.go +++ b/util/templates/template.go @@ -366,8 +366,7 @@ func (t *Template) RenderResult(renderMode int, other map[string]any) ([]byte, m } // validate required fields from yaml - if s == "" && p.IsRequired() && !p.IsDeprecated() && (renderMode == RenderModeUnitTest || - renderMode == RenderModeInstance && !testing.Testing()) { + if s == "" && p.IsRequired() && (renderMode == RenderModeUnitTest || renderMode == RenderModeInstance && !testing.Testing()) { // validate required per usage if len(p.Usages) == 0 || slices.Contains(p.Usages, usage) { return nil, nil, fmt.Errorf("missing required `%s`", p.Name) diff --git a/util/templates/types.go b/util/templates/types.go index 50e26cbc72..5e55b4acf5 100644 --- a/util/templates/types.go +++ b/util/templates/types.go @@ -137,7 +137,7 @@ func (t *TextLanguage) Update(new TextLanguage, always bool) { } // MarshalJSON implements the json.Marshaler interface -func (t *TextLanguage) MarshalJSON() (out []byte, err error) { +func (t TextLanguage) MarshalJSON() ([]byte, error) { mu.Lock() s := t.String(encoderLanguage) mu.Unlock() @@ -232,7 +232,7 @@ func (p *Param) OverwriteProperties(withParam Param) { } func (p *Param) IsAdvanced() bool { - return p.Advanced + return p.Advanced && !p.Required } func (p *Param) IsMasked() bool { @@ -244,7 +244,7 @@ func (p *Param) IsPrivate() bool { } func (p *Param) IsRequired() bool { - return p.Required + return p.Required && !p.Deprecated } func (p *Param) IsDeprecated() bool { @@ -264,6 +264,16 @@ func (p *Param) yamlQuote(value string) string { return yamlQuote(value) } +var _ json.Marshaler = (*Param)(nil) + +func (p Param) MarshalJSON() ([]byte, error) { + type param Param + pp := (param)(p) + pp.Required = p.IsRequired() + pp.Advanced = p.IsAdvanced() + return json.Marshal(pp) +} + // Product contains naming information about a product a template supports type Product struct { Brand string // product brand diff --git a/util/templates/types_test.go b/util/templates/types_test.go new file mode 100644 index 0000000000..64afa69f02 --- /dev/null +++ b/util/templates/types_test.go @@ -0,0 +1,77 @@ +package templates + +import ( + "encoding/json" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestParamLogic(t *testing.T) { + { + p := Param{ + Advanced: true, // omitempty + Required: true, + } + require.False(t, p.IsAdvanced(), "can't be advanced when required") + + { + b, err := json.Marshal(p) + require.NoError(t, err) + assert.Equal(t, `{"Name":"","Description":"","Help":"","Required":true,"Type":"String"}`, string(b), "Marshal p advanced/required") + } + { + b, err := json.Marshal(&p) + require.NoError(t, err) + assert.Equal(t, `{"Name":"","Description":"","Help":"","Required":true,"Type":"String"}`, string(b), "Marshal *p advanced/required") + } + } + + { + p := Param{ + Deprecated: true, + Required: true, // omitempty + } + require.False(t, p.IsRequired(), "can't be required when deprecated") + + { + b, err := json.Marshal(p) + require.NoError(t, err) + assert.Equal(t, `{"Name":"","Description":"","Help":"","Deprecated":true,"Type":"String"}`, string(b), "Marshal p deprecated/required") + } + { + b, err := json.Marshal(&p) + require.NoError(t, err) + assert.Equal(t, `{"Name":"","Description":"","Help":"","Deprecated":true,"Type":"String"}`, string(b), "Marshal *p deprecated/required") + } + } + + b, err := json.Marshal(Param{ + Deprecated: true, + Advanced: true, // omitempty + Required: true, // omitempty + }) + require.NoError(t, err) + require.Equal(t, `{"Name":"","Description":"","Help":"","Deprecated":true,"Type":"String"}`, string(b)) +} + +func TestParamMarshal(t *testing.T) { + { + p := Param{ + Description: TextLanguage{Generic: "foo"}, + } + + { + b, err := json.Marshal(p) + require.NoError(t, err) + assert.Equal(t, `{"Name":"","Description":"foo","Help":"","Type":"String"}`, string(b)) + } + + { + b, err := json.Marshal(&p) + require.NoError(t, err) + assert.Equal(t, `{"Name":"","Description":"foo","Help":"","Type":"String"}`, string(b)) + } + } +}