1package execenv
2
3import (
4 "bytes"
5 "encoding/json"
6 "fmt"
7 "io"
8 "testing"
9
10 "github.com/stretchr/testify/require"
11
12 "github.com/MichaelMure/git-bug/cache"
13 "github.com/MichaelMure/git-bug/repository"
14)
15
16var _ In = &TestIn{}
17
18type TestIn struct {
19 *bytes.Buffer
20 forceIsTerminal bool
21}
22
23func (t *TestIn) ForceIsTerminal(value bool) {
24 t.forceIsTerminal = value
25}
26
27func (t *TestIn) IsTerminal() bool {
28 return t.forceIsTerminal
29}
30
31var _ Out = &TestOut{}
32
33type TestOut struct {
34 *bytes.Buffer
35 forceIsTerminal bool
36}
37
38func (te *TestOut) Printf(format string, a ...interface{}) {
39 _, _ = fmt.Fprintf(te.Buffer, format, a...)
40}
41
42func (te *TestOut) Print(a ...interface{}) {
43 _, _ = fmt.Fprint(te.Buffer, a...)
44}
45
46func (te *TestOut) Println(a ...interface{}) {
47 _, _ = fmt.Fprintln(te.Buffer, a...)
48}
49
50func (te *TestOut) PrintJSON(v interface{}) error {
51 raw, err := json.MarshalIndent(v, "", " ")
52 if err != nil {
53 return err
54 }
55 te.Println(string(raw))
56 return nil
57}
58
59func (te *TestOut) IsTerminal() bool {
60 return te.forceIsTerminal
61}
62
63func (te *TestOut) Raw() io.Writer {
64 return te.Buffer
65}
66
67func (te *TestOut) ForceIsTerminal(value bool) {
68 te.forceIsTerminal = value
69}
70
71func NewTestEnv(t *testing.T) *Env {
72 t.Helper()
73 return newTestEnv(t, false)
74}
75
76func NewTestEnvTerminal(t *testing.T) *Env {
77 t.Helper()
78 return newTestEnv(t, true)
79}
80
81func newTestEnv(t *testing.T, isTerminal bool) *Env {
82 repo := repository.CreateGoGitTestRepo(t, false)
83
84 backend, err := cache.NewRepoCacheNoEvents(repo)
85 require.NoError(t, err)
86
87 t.Cleanup(func() {
88 backend.Close()
89 })
90
91 return &Env{
92 Repo: repo,
93 Backend: backend,
94 In: &TestIn{Buffer: &bytes.Buffer{}, forceIsTerminal: isTerminal},
95 Out: &TestOut{Buffer: &bytes.Buffer{}, forceIsTerminal: isTerminal},
96 Err: &TestOut{Buffer: &bytes.Buffer{}, forceIsTerminal: isTerminal},
97 }
98}