fuzzyworld

template / files / internal / core / monkey-patch.go

monkey-patch.go

4.1 KB · history · blame

1package core
2
3import (
4 "os"
5 "os/exec"
6 "testing"
7
8 "github.com/stretchr/testify/assert"
9)
10
11type monkeyPatch struct {
12 ExecCommand func(name string, arg ...string) *exec.Cmd
13 OSCreate func(name string) (*os.File, error)
14 OSWriteFile func(filename string, data []byte, perm os.FileMode) error
15 OSGetwd func() (string, error)
16 OSChdir func(dir string) error
17 OSMkdir func(path string, perm os.FileMode) error
18 OSReadDir func(dirname string) ([]os.DirEntry, error)
19 OSStat func(name string) (os.FileInfo, error)
20}
21type monkeyPatchCalls struct {
22 ExecCommandCalls []struct {
23 name string
24 arg []string
25 }
26 OSCreateCalls []struct {
27 name string
28 }
29 OSWriteFileCalls []struct {
30 filename string
31 data []byte
32 perm os.FileMode
33 }
34 OSGetwdCalls []struct{}
35 OSChdirCalls []struct{ dir string }
36 OSMkdirCalls []struct {
37 path string
38 perm os.FileMode
39 }
40 OSReadDirCalls []struct{ dirname string }
41 OSStatCalls []struct{ name string }
42}
43
44var monkey = defaultMonkeyPatch()
45
46func applyTestMonkeyPatch(t *testing.T, monkeyImpl monkeyPatch) *monkeyPatchCalls {
47 t.Cleanup(undoMonkeyPatch)
48 results := monkeyPatchCalls{
49 ExecCommandCalls: []struct {
50 name string
51 arg []string
52 }{},
53 OSCreateCalls: []struct {
54 name string
55 }{},
56 OSWriteFileCalls: []struct {
57 filename string
58 data []byte
59 perm os.FileMode
60 }{},
61 OSGetwdCalls: []struct{}{},
62 OSChdirCalls: []struct{ dir string }{},
63 OSMkdirCalls: []struct {
64 path string
65 perm os.FileMode
66 }{},
67 OSReadDirCalls: []struct{ dirname string }{},
68 OSStatCalls: []struct{ name string }{},
69 }
70 monkey = monkeyPatch{
71 ExecCommand: func(name string, arg ...string) *exec.Cmd {
72 assert.NotNil(t, monkeyImpl.ExecCommand, "ExecCommand is not implemented")
73 results.ExecCommandCalls = append(results.ExecCommandCalls, struct {
74 name string
75 arg []string
76 }{name, arg})
77 return monkeyImpl.ExecCommand(name, arg...)
78 },
79 OSCreate: func(name string) (*os.File, error) {
80 assert.NotNil(t, monkeyImpl.OSCreate, "OSCreate is not implemented")
81 results.OSCreateCalls = append(results.OSCreateCalls, struct {
82 name string
83 }{name})
84 return monkeyImpl.OSCreate(name)
85 },
86 OSWriteFile: func(filename string, data []byte, perm os.FileMode) error {
87 assert.NotNil(t, monkeyImpl.OSWriteFile, "OSWriteFile is not implemented")
88 results.OSWriteFileCalls = append(results.OSWriteFileCalls, struct {
89 filename string
90 data []byte
91 perm os.FileMode
92 }{filename, data, perm})
93 return monkeyImpl.OSWriteFile(filename, data, perm)
94 },
95 OSGetwd: func() (string, error) {
96 assert.NotNil(t, monkeyImpl.OSGetwd, "OSGetwd is not implemented")
97 results.OSGetwdCalls = append(results.OSGetwdCalls, struct{}{})
98 return monkeyImpl.OSGetwd()
99 },
100 OSChdir: func(dir string) error {
101 assert.NotNil(t, monkeyImpl.OSChdir, "OSChdir is not implemented")
102 results.OSChdirCalls = append(results.OSChdirCalls, struct{ dir string }{dir})
103 return monkeyImpl.OSChdir(dir)
104 },
105 OSMkdir: func(path string, perm os.FileMode) error {
106 assert.NotNil(t, monkeyImpl.OSMkdir, "OSMkdir is not implemented")
107 results.OSMkdirCalls = append(results.OSMkdirCalls, struct {
108 path string
109 perm os.FileMode
110 }{path, perm})
111 return monkeyImpl.OSMkdir(path, perm)
112 },
113 OSReadDir: func(dirname string) ([]os.DirEntry, error) {
114 assert.NotNil(t, monkeyImpl.OSReadDir, "OSReadDir is not implemented")
115 results.OSReadDirCalls = append(results.OSReadDirCalls, struct{ dirname string }{dirname})
116 return monkeyImpl.OSReadDir(dirname)
117 },
118 OSStat: func(name string) (os.FileInfo, error) {
119 assert.NotNil(t, monkeyImpl.OSStat, "OSStat is not implemented")
120 results.OSStatCalls = append(results.OSStatCalls, struct{ name string }{name})
121 return monkeyImpl.OSStat(name)
122 },
123 }
124 return &results
125}
126
127func defaultMonkeyPatch() monkeyPatch {
128 return monkeyPatch{
129 ExecCommand: exec.Command,
130 OSCreate: os.Create,
131 OSWriteFile: os.WriteFile,
132 OSGetwd: os.Getwd,
133 OSChdir: os.Chdir,
134 OSMkdir: os.Mkdir,
135 OSReadDir: os.ReadDir,
136 OSStat: os.Stat,
137 }
138}
139
140func undoMonkeyPatch() {
141 monkey = defaultMonkeyPatch()
142}