-
Notifications
You must be signed in to change notification settings - Fork 0
/
testing.go
112 lines (85 loc) · 3.01 KB
/
testing.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
package warg
import (
"bytes"
"os"
"path/filepath"
"testing"
"github.com/stretchr/testify/require"
)
type GoldenTestArgs struct {
App *App
// UpdateGolden files for captured stderr/stdout
UpdateGolden bool
// Whether the action should return an error
ExpectActionErr bool
}
// GoldenTest runs the app and and captures stdout and stderr into files.
// If those differ than previously captured stdout/stderr,
// t.Fatalf will be called.
//
// Passed `parseOpts` should not include OverrideStderr/OverrideStdout as GoldenTest overwrites those
func GoldenTest(
t *testing.T,
args GoldenTestArgs,
parseOpts ...ParseOpt) {
stderrTmpFile, err := os.CreateTemp(os.TempDir(), "warg-test-")
require.Nil(t, err)
stdoutTmpFile, err := os.CreateTemp(os.TempDir(), "warg-test-")
require.Nil(t, err)
err = args.App.Validate()
require.Nil(t, err)
parseOptHolder := NewParseOptHolder(parseOpts...)
OverrideStderr(stderrTmpFile)(&parseOptHolder)
OverrideStdout(stdoutTmpFile)(&parseOptHolder)
pr, parseErr := args.App.parseWithOptHolder(parseOptHolder)
require.Nil(t, parseErr)
actionErr := pr.Action(pr.Context)
if args.ExpectActionErr {
require.Error(t, actionErr)
} else {
require.NoError(t, actionErr)
}
stderrCloseErr := stderrTmpFile.Close()
require.Nil(t, stderrCloseErr)
stdoutCloseErr := stdoutTmpFile.Close()
require.Nil(t, stdoutCloseErr)
actualStderrBytes, stderrReadErr := os.ReadFile(stderrTmpFile.Name())
require.Nil(t, stderrReadErr)
actualStdoutBytes, stoutReadErr := os.ReadFile(stdoutTmpFile.Name())
require.Nil(t, stoutReadErr)
goldenDir := filepath.Join("testdata", t.Name())
stderrGoldenFilePath := filepath.Join(goldenDir, "stderr.golden.txt")
stderrGoldenFilePath, err = filepath.Abs(stderrGoldenFilePath)
require.Nil(t, err)
stdoutGoldenFilePath := filepath.Join(goldenDir, "stdout.golden.txt")
stdoutGoldenFilePath, err = filepath.Abs(stdoutGoldenFilePath)
require.Nil(t, err)
if args.UpdateGolden {
mkdirErr := os.MkdirAll(goldenDir, 0700)
require.Nil(t, mkdirErr)
stderrWriteErr := os.WriteFile(stderrGoldenFilePath, actualStderrBytes, 0600)
require.Nil(t, stderrWriteErr)
t.Logf("Wrote: %v\n", stderrGoldenFilePath)
stdoutWriteErr := os.WriteFile(stdoutGoldenFilePath, actualStdoutBytes, 0600)
require.Nil(t, stdoutWriteErr)
t.Logf("Wrote: %v\n", stdoutGoldenFilePath)
}
stderrExpectedBytes, stderrExpectedReadErr := os.ReadFile(stderrGoldenFilePath)
require.Nil(t, stderrExpectedReadErr, "actualBytes: \n%s", string(actualStderrBytes))
if !bytes.Equal(stderrExpectedBytes, actualStderrBytes) {
t.Fatalf(
"expected != actual. See diff:\n vimdiff %s %s\n",
stderrGoldenFilePath,
stderrTmpFile.Name(),
)
}
stdoutExpectedBytes, stdoutExpectedReadErr := os.ReadFile(stdoutGoldenFilePath)
require.Nil(t, stdoutExpectedReadErr, "actualBytes: \n%s", string(actualStdoutBytes))
if !bytes.Equal(stdoutExpectedBytes, actualStdoutBytes) {
t.Fatalf(
"expected != actual. See diff:\n vimdiff %s %s\n",
stdoutGoldenFilePath,
stdoutTmpFile.Name(),
)
}
}