Skip to content

Commit a910add

Browse files
Templates factory to return clones (#343)
1 parent 007e9cd commit a910add

File tree

2 files changed

+30
-2
lines changed

2 files changed

+30
-2
lines changed

templates/factory.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,12 +127,12 @@ func (cf *CachedFactory) GetTemplate(kind Kind) (*Template, error) {
127127
cf.mtx.Lock()
128128
defer cf.mtx.Unlock()
129129
if t, ok := cf.m[kind]; ok {
130-
return t, nil
130+
return t.Clone()
131131
}
132132
t, err := cf.factory.GetTemplate(kind)
133133
if err != nil {
134134
return nil, err
135135
}
136136
cf.m[kind] = t
137-
return t, nil
137+
return t.Clone()
138138
}

templates/factory_test.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
"maps"
7+
"strings"
78
"testing"
89
"time"
910

@@ -241,3 +242,30 @@ func TestFactoryWithTemplate(t *testing.T) {
241242
require.ErrorIs(t, err, ErrInvalidKind)
242243
})
243244
}
245+
246+
func TestCachedTemplateFactory(t *testing.T) {
247+
def := []TemplateDefinition{
248+
{
249+
Name: "test",
250+
Kind: GrafanaKind,
251+
Template: fmt.Sprintf(`{{ define "factory_test" }}TEST %s KIND{{ end }}`, GrafanaKind),
252+
},
253+
}
254+
f, err := NewFactory(def, log.NewNopLogger(), "http://localhost")
255+
require.NoError(t, err)
256+
cached := NewCachedFactory(f)
257+
258+
for i := 0; i < 3; i++ { // check many times to ensure that clone it always return clean clone
259+
tmpl, err := cached.GetTemplate(GrafanaKind)
260+
require.NoError(t, err)
261+
262+
expanded, err := tmpl.ExecuteTextString(`{{ template "factory_test" . }}`, nil)
263+
require.NoError(t, err)
264+
require.Equal(t, `TEST Grafana KIND`, expanded)
265+
// redefine template
266+
require.NoError(t, tmpl.Parse(strings.NewReader(`{{ define "factory_test" }}TEST{{ end }}`)))
267+
expanded, err = tmpl.ExecuteTextString(`{{ template "factory_test" . }}`, nil)
268+
require.NoError(t, err)
269+
require.Equal(t, `TEST`, expanded)
270+
}
271+
}

0 commit comments

Comments
 (0)