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) IsTerminal() bool {
 24	return t.forceIsTerminal
 25}
 26
 27func (t *TestIn) ForceIsTerminal(value bool) {
 28	t.forceIsTerminal = value
 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) Width() int {
 64	return 80
 65}
 66
 67func (te *TestOut) Raw() io.Writer {
 68	return te.Buffer
 69}
 70
 71func (te *TestOut) ForceIsTerminal(value bool) {
 72	te.forceIsTerminal = value
 73}
 74
 75func NewTestEnv(t *testing.T) *Env {
 76	t.Helper()
 77	return newTestEnv(t, false)
 78}
 79
 80func NewTestEnvTerminal(t *testing.T) *Env {
 81	t.Helper()
 82	return newTestEnv(t, true)
 83}
 84
 85func newTestEnv(t *testing.T, isTerminal bool) *Env {
 86	repo := repository.CreateGoGitTestRepo(t, false)
 87
 88	backend, err := cache.NewRepoCacheNoEvents(repo)
 89	require.NoError(t, err)
 90
 91	t.Cleanup(func() {
 92		backend.Close()
 93	})
 94
 95	return &Env{
 96		Repo:    repo,
 97		Backend: backend,
 98		In:      &TestIn{Buffer: &bytes.Buffer{}, forceIsTerminal: isTerminal},
 99		Out:     &TestOut{Buffer: &bytes.Buffer{}, forceIsTerminal: isTerminal},
100		Err:     &TestOut{Buffer: &bytes.Buffer{}, forceIsTerminal: isTerminal},
101	}
102}