AlecAivazis/survey

From NovaOrdis Knowledge Base
Jump to navigation Jump to search

External

Internal

go.mod

go get github.com/AlecAivazis/survey/v2@v2.3.7

Concepts

Unit Testing

Create a test FileReader and a test terminal.Studio:

import (
	"fmt"
	"io"
	"os"

	"github.com/AlecAivazis/survey/v2"
	"github.com/AlecAivazis/survey/v2/terminal"
)

type TestFileReader struct {
	sequences []string
}

func NewTestFileReader(input string) *TestFileReader {
	return &TestFileReader{
		sequences: []string{
			"\x1b[1;1R",
			"\x1b[0;0R",
			input},
	}
}

func (fr *TestFileReader) Read(p []byte) (n int, err error) {
	if len(fr.sequences) != 0 {
		seq := fr.sequences[0]
		fr.sequences = fr.sequences[1:]
		n = copy(p, seq)
		return n, nil
	}
	return 0, io.EOF
}

func (fr *TestFileReader) Fd() uintptr {
	return 0
}

func NewTestTerminalStudio(input string) terminal.Stdio {
	return terminal.Stdio{
		In:  NewTestFileReader(input),
		Out: os.Stdout,
		Err: os.Stderr,
	}
}


Then configure the survey.AskOne with the Stdio that returns "Y\n" or "N\n":

prompt := &survey.Confirm{
	Message: "Something",
	Default: false,
}
var accepted bool
err := survey.AskOne(prompt, &accepted, func(options *survey.AskOptions) error {
	options.Stdio = NewTestTerminalStudio("Y\n")
	return nil
})
if err != nil {
	panic(err)
}
fmt.Println(accepted)