cli/pkg/iostreams/iostreams_test.go

130 lines
2.9 KiB
Go

package iostreams
import (
"bufio"
"errors"
"fmt"
"io"
"os"
"testing"
)
func TestIOStreams_ForceTerminal(t *testing.T) {
tests := []struct {
name string
iostreams *IOStreams
arg string
wantTTY bool
wantWidth int
}{
{
name: "explicit width",
iostreams: &IOStreams{},
arg: "72",
wantTTY: true,
wantWidth: 72,
},
{
name: "measure width",
iostreams: &IOStreams{
ttySize: func() (int, int, error) {
return 72, 0, nil
},
},
arg: "true",
wantTTY: true,
wantWidth: 72,
},
{
name: "measure width fails",
iostreams: &IOStreams{
Out: &fdWriter{
Writer: io.Discard,
fd: 1,
},
ttySize: func() (int, int, error) {
return -1, -1, errors.New("ttySize sabotage!")
},
},
arg: "true",
wantTTY: true,
wantWidth: 80,
},
{
name: "apply percentage",
iostreams: &IOStreams{
ttySize: func() (int, int, error) {
return 72, 0, nil
},
},
arg: "50%",
wantTTY: true,
wantWidth: 36,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
tt.iostreams.ForceTerminal(tt.arg)
if isTTY := tt.iostreams.IsStdoutTTY(); isTTY != tt.wantTTY {
t.Errorf("IOStreams.IsStdoutTTY() = %v, want %v", isTTY, tt.wantTTY)
}
if tw := tt.iostreams.TerminalWidth(); tw != tt.wantWidth {
t.Errorf("IOStreams.TerminalWidth() = %v, want %v", tw, tt.wantWidth)
}
})
}
}
func TestStopAlternateScreenBuffer(t *testing.T) {
ios, _, stdout, _ := Test()
ios.SetAlternateScreenBufferEnabled(true)
ios.StartAlternateScreenBuffer()
fmt.Fprint(ios.Out, "test")
ios.StopAlternateScreenBuffer()
// Stopping a subsequent time should no-op.
ios.StopAlternateScreenBuffer()
const want = "\x1b[?1049htest\x1b[?1049l"
if got := stdout.String(); got != want {
t.Errorf("after IOStreams.StopAlternateScreenBuffer() got %q, want %q", got, want)
}
}
func TestIOStreams_pager(t *testing.T) {
t.Skip("TODO: fix this test in race detection mode")
ios, _, stdout, _ := Test()
ios.SetStdoutTTY(true)
ios.SetPager(fmt.Sprintf("%s -test.run=TestHelperProcess --", os.Args[0]))
t.Setenv("GH_WANT_HELPER_PROCESS", "1")
if err := ios.StartPager(); err != nil {
t.Fatal(err)
}
if _, err := fmt.Fprintln(ios.Out, "line1"); err != nil {
t.Errorf("error writing line 1: %v", err)
}
if _, err := fmt.Fprintln(ios.Out, "line2"); err != nil {
t.Errorf("error writing line 2: %v", err)
}
ios.StopPager()
wants := "pager: line1\npager: line2\n"
if got := stdout.String(); got != wants {
t.Errorf("expected %q, got %q", wants, got)
}
}
func TestHelperProcess(t *testing.T) {
if os.Getenv("GH_WANT_HELPER_PROCESS") != "1" {
return
}
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
fmt.Printf("pager: %s\n", scanner.Text())
}
if err := scanner.Err(); err != nil {
fmt.Fprintf(os.Stderr, "error reading stdin: %v", err)
os.Exit(1)
}
os.Exit(0)
}