Skip to content

Commit 9b8b812

Browse files
committed
feat(defaults): expose a Default *Golden instance
Also change the Default* constants to variables so they can be modified as well.
1 parent b2112ca commit 9b8b812

File tree

2 files changed

+128
-29
lines changed

2 files changed

+128
-29
lines changed

golden.go

Lines changed: 27 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -122,30 +122,39 @@
122122
package golden
123123

124124
import (
125-
"io/ioutil"
126125
"os"
127126
"path/filepath"
128127
"strings"
129128
"testing"
130129
)
131130

132-
const (
133-
DefaultDirMode = 0o755
134-
DefaultFileMode = 0o644
135-
DefaultSuffix = ".golden"
136-
DefaultDirname = "testdata"
137-
)
131+
var (
132+
// Default is the default *Golden instance. All package-level functions use
133+
// the Default instance.
134+
Default = New()
135+
136+
// DefaultDirMode is the default DirMode value used by New().
137+
DefaultDirMode = os.FileMode(0o755)
138+
139+
// DefaultFileMode is the default FileMode value used by New().
140+
DefaultFileMode = os.FileMode(0o644)
138141

139-
var DefaultUpdateFunc = EnvUpdateFunc
142+
// DefaultSuffix is the default Suffix value used by New().
143+
DefaultSuffix = ".golden"
140144

141-
var global = New()
145+
// DefaultDirname is the default Dirname value used by New().
146+
DefaultDirname = "testdata"
147+
148+
// DefaultUpdateFunc is the default UpdateFunc value used by New().
149+
DefaultUpdateFunc = EnvUpdateFunc
150+
)
142151

143152
// File returns the filename of the golden file for the given *testing.T
144153
// instance as determined by t.Name().
145154
func File(t *testing.T) string {
146155
t.Helper()
147156

148-
return global.File(t)
157+
return Default.File(t)
149158
}
150159

151160
// Get returns the content of the golden file for the given *testing.T instance
@@ -154,7 +163,7 @@ func File(t *testing.T) string {
154163
func Get(t *testing.T) []byte {
155164
t.Helper()
156165

157-
return global.Get(t)
166+
return Default.Get(t)
158167
}
159168

160169
// Set writes given data to the golden file for the given *testing.T instance as
@@ -163,15 +172,15 @@ func Get(t *testing.T) []byte {
163172
func Set(t *testing.T, data []byte) {
164173
t.Helper()
165174

166-
global.Set(t, data)
175+
Default.Set(t, data)
167176
}
168177

169178
// FileP returns the filename of the specifically named golden file for the
170179
// given *testing.T instance as determined by t.Name().
171180
func FileP(t *testing.T, name string) string {
172181
t.Helper()
173182

174-
return global.FileP(t, name)
183+
return Default.FileP(t, name)
175184
}
176185

177186
// GetP returns the content of the specifically named golden file belonging
@@ -183,7 +192,7 @@ func FileP(t *testing.T, name string) string {
183192
func GetP(t *testing.T, name string) []byte {
184193
t.Helper()
185194

186-
return global.GetP(t, name)
195+
return Default.GetP(t, name)
187196
}
188197

189198
// SetP writes given data of the specifically named golden file belonging to
@@ -195,7 +204,7 @@ func GetP(t *testing.T, name string) []byte {
195204
func SetP(t *testing.T, name string, data []byte) {
196205
t.Helper()
197206

198-
global.SetP(t, name, data)
207+
Default.SetP(t, name, data)
199208
}
200209

201210
// Update returns true when golden is set to update golden files. Should be used
@@ -205,7 +214,7 @@ func SetP(t *testing.T, name string, data []byte) {
205214
// environment variable is set to a truthy value. To customize create a custom
206215
// *Golden instance with New() and set a new UpdateFunc value.
207216
func Update() bool {
208-
return global.Update()
217+
return Default.Update()
209218
}
210219

211220
// Golden handles all interactions with golden files. The top-level package
@@ -336,7 +345,7 @@ func (s *Golden) file(t *testing.T, name string) string {
336345
func (s *Golden) get(t *testing.T, name string) []byte {
337346
f := s.file(t, name)
338347

339-
b, err := ioutil.ReadFile(f)
348+
b, err := os.ReadFile(f)
340349
if err != nil {
341350
t.Fatalf("golden: failed reading %s: %s", f, err.Error())
342351
}
@@ -357,7 +366,7 @@ func (s *Golden) set(t *testing.T, name string, data []byte) {
357366
return
358367
}
359368

360-
err = ioutil.WriteFile(f, data, s.FileMode)
369+
err = os.WriteFile(f, data, s.FileMode)
361370
if err != nil {
362371
t.Fatalf("golden: filed to write file: %s", err.Error())
363372
}

golden_test.go

Lines changed: 101 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,105 @@
11
package golden
22

33
import (
4-
"io/ioutil"
54
"os"
65
"path/filepath"
6+
"reflect"
7+
"runtime"
78
"testing"
89

910
"github.com/stretchr/testify/assert"
1011
"github.com/stretchr/testify/require"
1112
)
1213

14+
func TestDefaults(t *testing.T) {
15+
t.Run("Default", func(t *testing.T) {
16+
assert.IsType(t, &Golden{}, Default)
17+
18+
assert.Equal(t, DefaultDirMode, Default.DirMode)
19+
assert.Equal(t, DefaultFileMode, Default.FileMode)
20+
assert.Equal(t, DefaultSuffix, Default.Suffix)
21+
assert.Equal(t, DefaultDirname, Default.Dirname)
22+
23+
// Use runtime.FuncForPC() to verify the UpdateFunc value is set to
24+
// the EnvUpdateFunc function by default.
25+
gotFP := reflect.ValueOf(Default.UpdateFunc).Pointer()
26+
gotFuncName := runtime.FuncForPC(gotFP).Name()
27+
wantFP := reflect.ValueOf(EnvUpdateFunc).Pointer()
28+
wantFuncName := runtime.FuncForPC(wantFP).Name()
29+
30+
assert.Equal(t, wantFuncName, gotFuncName)
31+
})
32+
33+
t.Run("DefaultDirMode", func(t *testing.T) {
34+
assert.Equal(t, os.FileMode(0o755), DefaultDirMode)
35+
})
36+
37+
t.Run("DefaultFileMode", func(t *testing.T) {
38+
assert.Equal(t, os.FileMode(0o644), DefaultFileMode)
39+
})
40+
41+
t.Run("DefaultSuffix", func(t *testing.T) {
42+
assert.Equal(t, ".golden", DefaultSuffix)
43+
})
44+
45+
t.Run("DefaultDirname", func(t *testing.T) {
46+
assert.Equal(t, "testdata", DefaultDirname)
47+
})
48+
49+
t.Run("DefaultUpdateFunc", func(t *testing.T) {
50+
gotFP := reflect.ValueOf(DefaultUpdateFunc).Pointer()
51+
gotFuncName := runtime.FuncForPC(gotFP).Name()
52+
wantFP := reflect.ValueOf(EnvUpdateFunc).Pointer()
53+
wantFuncName := runtime.FuncForPC(wantFP).Name()
54+
assert.Equal(t, wantFuncName, gotFuncName)
55+
})
56+
}
57+
58+
// TestNew is a horribly hack to test that the New() function uses the
59+
// package-level Default* variables.
60+
func TestNew(t *testing.T) {
61+
// Capture the default values before we change them.
62+
defaultDirMode := DefaultDirMode
63+
defaultFileMode := DefaultFileMode
64+
defaultSuffix := DefaultSuffix
65+
defaultDirname := DefaultDirname
66+
defaultUpdateFunc := DefaultUpdateFunc
67+
68+
// Restore the default values after the test.
69+
t.Cleanup(func() {
70+
DefaultDirMode = defaultDirMode
71+
DefaultFileMode = defaultFileMode
72+
DefaultSuffix = defaultSuffix
73+
DefaultDirname = defaultDirname
74+
DefaultUpdateFunc = defaultUpdateFunc
75+
})
76+
77+
// Set all the default values to new values.
78+
DefaultDirMode = os.FileMode(0o700)
79+
DefaultFileMode = os.FileMode(0o600)
80+
DefaultSuffix = ".gold"
81+
DefaultDirname = "goldenfiles"
82+
83+
updateFunc := func() bool { return true }
84+
DefaultUpdateFunc = updateFunc
85+
86+
// Create a new Golden instance with the new values.
87+
got := New()
88+
89+
assert.Equal(t, DefaultDirMode, got.DirMode)
90+
assert.Equal(t, DefaultFileMode, got.FileMode)
91+
assert.Equal(t, DefaultSuffix, got.Suffix)
92+
assert.Equal(t, DefaultDirname, got.Dirname)
93+
94+
// Verify the UpdateFunc value is set to the new value.
95+
gotFP := reflect.ValueOf(got.UpdateFunc).Pointer()
96+
gotFuncName := runtime.FuncForPC(gotFP).Name()
97+
wantFP := reflect.ValueOf(updateFunc).Pointer()
98+
wantFuncName := runtime.FuncForPC(wantFP).Name()
99+
100+
assert.Equal(t, wantFuncName, gotFuncName)
101+
}
102+
13103
func TestFile(t *testing.T) {
14104
got := File(t)
15105

@@ -57,8 +147,8 @@ func TestGet(t *testing.T) {
57147
require.NoError(t, err)
58148

59149
content := []byte("foobar\nhello world :)")
60-
err = ioutil.WriteFile( //nolint:gosec
61-
filepath.Join("testdata", "TestGet.golden"), content, 0o644,
150+
err = os.WriteFile(
151+
filepath.Join("testdata", "TestGet.golden"), content, 0o600,
62152
)
63153
require.NoError(t, err)
64154

@@ -108,7 +198,7 @@ func TestGet(t *testing.T) {
108198
err := os.MkdirAll(dir, 0o755)
109199
require.NoError(t, err)
110200

111-
err = ioutil.WriteFile(f, tt.want, 0o644) //nolint:gosec
201+
err = os.WriteFile(f, tt.want, 0o600)
112202
require.NoError(t, err)
113203

114204
got := Get(t)
@@ -130,7 +220,7 @@ func TestSet(t *testing.T) {
130220
content := []byte("This is the default golden file for TestSet ^_^")
131221
Set(t, content)
132222

133-
b, err := ioutil.ReadFile(filepath.Join("testdata", "TestSet.golden"))
223+
b, err := os.ReadFile(filepath.Join("testdata", "TestSet.golden"))
134224
require.NoError(t, err)
135225

136226
assert.Equal(t, content, b)
@@ -176,7 +266,7 @@ func TestSet(t *testing.T) {
176266

177267
Set(t, tt.content)
178268

179-
got, err := ioutil.ReadFile(f)
269+
got, err := os.ReadFile(f)
180270
require.NoError(t, err)
181271

182272
assert.Equal(t, tt.file, f)
@@ -246,9 +336,9 @@ func TestGetP(t *testing.T) {
246336
require.NoError(t, err)
247337

248338
content := []byte("this is the named golden file for TestGetP")
249-
err = ioutil.WriteFile( //nolint:gosec
339+
err = os.WriteFile(
250340
filepath.Join("testdata", "TestGetP", "sub-name.golden"),
251-
content, 0o644,
341+
content, 0o600,
252342
)
253343
require.NoError(t, err)
254344

@@ -330,7 +420,7 @@ func TestGetP(t *testing.T) {
330420
err := os.MkdirAll(dir, 0o755)
331421
require.NoError(t, err)
332422

333-
err = ioutil.WriteFile(f, tt.want, 0o644) //nolint:gosec
423+
err = os.WriteFile(f, tt.want, 0o600)
334424
require.NoError(t, err)
335425

336426
got := GetP(t, tt.named)
@@ -350,7 +440,7 @@ func TestSetP(t *testing.T) {
350440
content := []byte("This is the named golden file for TestSetP ^_^")
351441
SetP(t, "sub-name", content)
352442

353-
b, err := ioutil.ReadFile(
443+
b, err := os.ReadFile(
354444
filepath.Join("testdata", "TestSetP", "sub-name.golden"),
355445
)
356446
require.NoError(t, err)
@@ -420,7 +510,7 @@ func TestSetP(t *testing.T) {
420510

421511
SetP(t, tt.named, tt.content)
422512

423-
got, err := ioutil.ReadFile(f)
513+
got, err := os.ReadFile(f)
424514
require.NoError(t, err)
425515

426516
assert.Equal(t, tt.file, f)

0 commit comments

Comments
 (0)