Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 27 additions & 18 deletions golden.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,30 +122,39 @@
package golden

import (
"io/ioutil"
"os"
"path/filepath"
"strings"
"testing"
)

const (
DefaultDirMode = 0o755
DefaultFileMode = 0o644
DefaultSuffix = ".golden"
DefaultDirname = "testdata"
)
var (
// Default is the default *Golden instance. All package-level functions use
// the Default instance.
Default = New()

// DefaultDirMode is the default DirMode value used by New().
DefaultDirMode = os.FileMode(0o755)

// DefaultFileMode is the default FileMode value used by New().
DefaultFileMode = os.FileMode(0o644)

var DefaultUpdateFunc = EnvUpdateFunc
// DefaultSuffix is the default Suffix value used by New().
DefaultSuffix = ".golden"

var global = New()
// DefaultDirname is the default Dirname value used by New().
DefaultDirname = "testdata"

// DefaultUpdateFunc is the default UpdateFunc value used by New().
DefaultUpdateFunc = EnvUpdateFunc
)

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

return global.File(t)
return Default.File(t)
}

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

return global.Get(t)
return Default.Get(t)
}

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

global.Set(t, data)
Default.Set(t, data)
}

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

return global.FileP(t, name)
return Default.FileP(t, name)
}

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

return global.GetP(t, name)
return Default.GetP(t, name)
}

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

global.SetP(t, name, data)
Default.SetP(t, name, data)
}

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

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

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

err = ioutil.WriteFile(f, data, s.FileMode)
err = os.WriteFile(f, data, s.FileMode)
if err != nil {
t.Fatalf("golden: filed to write file: %s", err.Error())
}
Expand Down
112 changes: 101 additions & 11 deletions golden_test.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,105 @@
package golden

import (
"io/ioutil"
"os"
"path/filepath"
"reflect"
"runtime"
"testing"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestDefaults(t *testing.T) {
t.Run("Default", func(t *testing.T) {
assert.IsType(t, &Golden{}, Default)

assert.Equal(t, DefaultDirMode, Default.DirMode)
assert.Equal(t, DefaultFileMode, Default.FileMode)
assert.Equal(t, DefaultSuffix, Default.Suffix)
assert.Equal(t, DefaultDirname, Default.Dirname)

// Use runtime.FuncForPC() to verify the UpdateFunc value is set to
// the EnvUpdateFunc function by default.
gotFP := reflect.ValueOf(Default.UpdateFunc).Pointer()
gotFuncName := runtime.FuncForPC(gotFP).Name()
wantFP := reflect.ValueOf(EnvUpdateFunc).Pointer()
wantFuncName := runtime.FuncForPC(wantFP).Name()

assert.Equal(t, wantFuncName, gotFuncName)
})

t.Run("DefaultDirMode", func(t *testing.T) {
assert.Equal(t, os.FileMode(0o755), DefaultDirMode)
})

t.Run("DefaultFileMode", func(t *testing.T) {
assert.Equal(t, os.FileMode(0o644), DefaultFileMode)
})

t.Run("DefaultSuffix", func(t *testing.T) {
assert.Equal(t, ".golden", DefaultSuffix)
})

t.Run("DefaultDirname", func(t *testing.T) {
assert.Equal(t, "testdata", DefaultDirname)
})

t.Run("DefaultUpdateFunc", func(t *testing.T) {
gotFP := reflect.ValueOf(DefaultUpdateFunc).Pointer()
gotFuncName := runtime.FuncForPC(gotFP).Name()
wantFP := reflect.ValueOf(EnvUpdateFunc).Pointer()
wantFuncName := runtime.FuncForPC(wantFP).Name()
assert.Equal(t, wantFuncName, gotFuncName)
})
}

// TestNew is a horribly hack to test that the New() function uses the
// package-level Default* variables.
func TestNew(t *testing.T) {
// Capture the default values before we change them.
defaultDirMode := DefaultDirMode
defaultFileMode := DefaultFileMode
defaultSuffix := DefaultSuffix
defaultDirname := DefaultDirname
defaultUpdateFunc := DefaultUpdateFunc

// Restore the default values after the test.
t.Cleanup(func() {
DefaultDirMode = defaultDirMode
DefaultFileMode = defaultFileMode
DefaultSuffix = defaultSuffix
DefaultDirname = defaultDirname
DefaultUpdateFunc = defaultUpdateFunc
})

// Set all the default values to new values.
DefaultDirMode = os.FileMode(0o700)
DefaultFileMode = os.FileMode(0o600)
DefaultSuffix = ".gold"
DefaultDirname = "goldenfiles"

updateFunc := func() bool { return true }
DefaultUpdateFunc = updateFunc

// Create a new Golden instance with the new values.
got := New()

assert.Equal(t, DefaultDirMode, got.DirMode)
assert.Equal(t, DefaultFileMode, got.FileMode)
assert.Equal(t, DefaultSuffix, got.Suffix)
assert.Equal(t, DefaultDirname, got.Dirname)

// Verify the UpdateFunc value is set to the new value.
gotFP := reflect.ValueOf(got.UpdateFunc).Pointer()
gotFuncName := runtime.FuncForPC(gotFP).Name()
wantFP := reflect.ValueOf(updateFunc).Pointer()
wantFuncName := runtime.FuncForPC(wantFP).Name()

assert.Equal(t, wantFuncName, gotFuncName)
}

func TestFile(t *testing.T) {
got := File(t)

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

content := []byte("foobar\nhello world :)")
err = ioutil.WriteFile( //nolint:gosec
filepath.Join("testdata", "TestGet.golden"), content, 0o644,
err = os.WriteFile(
filepath.Join("testdata", "TestGet.golden"), content, 0o600,
)
require.NoError(t, err)

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

err = ioutil.WriteFile(f, tt.want, 0o644) //nolint:gosec
err = os.WriteFile(f, tt.want, 0o600)
require.NoError(t, err)

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

b, err := ioutil.ReadFile(filepath.Join("testdata", "TestSet.golden"))
b, err := os.ReadFile(filepath.Join("testdata", "TestSet.golden"))
require.NoError(t, err)

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

Set(t, tt.content)

got, err := ioutil.ReadFile(f)
got, err := os.ReadFile(f)
require.NoError(t, err)

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

content := []byte("this is the named golden file for TestGetP")
err = ioutil.WriteFile( //nolint:gosec
err = os.WriteFile(
filepath.Join("testdata", "TestGetP", "sub-name.golden"),
content, 0o644,
content, 0o600,
)
require.NoError(t, err)

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

err = ioutil.WriteFile(f, tt.want, 0o644) //nolint:gosec
err = os.WriteFile(f, tt.want, 0o600)
require.NoError(t, err)

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

b, err := ioutil.ReadFile(
b, err := os.ReadFile(
filepath.Join("testdata", "TestSetP", "sub-name.golden"),
)
require.NoError(t, err)
Expand Down Expand Up @@ -420,7 +510,7 @@ func TestSetP(t *testing.T) {

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

got, err := ioutil.ReadFile(f)
got, err := os.ReadFile(f)
require.NoError(t, err)

assert.Equal(t, tt.file, f)
Expand Down