env_testing.go

 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}