AlecAivazis/survey: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
Line 12: Line 12:


=Unit Testing=
=Unit Testing=
Create a test <code>FileReader</code> and a test <code>terminal.Studio</code>:
<syntaxhighlight lang='go'>
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,
}
}
</syntaxhighlight>
Then configure the <code>survey.AskOne</code> with the <code>Stdio</code> that returns "Y\n" or "N\n":
<syntaxhighlight lang='go'>
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)
</syntaxhighlight>

Revision as of 20:50, 30 August 2024

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)