github.com/x-motemen/ghq@v1.6.1/helpers_test.go (about) 1 package main 2 3 import ( 4 "fmt" 5 "io" 6 "net/url" 7 "os" 8 "testing" 9 ) 10 11 func mustParseURL(urlString string) *url.URL { 12 u, err := url.Parse(urlString) 13 if err != nil { 14 panic(err) 15 } 16 return u 17 } 18 19 func captureReader(block func()) (*os.File, *os.File, error) { 20 rOut, wOut, err := os.Pipe() 21 if err != nil { 22 return nil, nil, err 23 } 24 defer wOut.Close() 25 26 rErr, wErr, err := os.Pipe() 27 if err != nil { 28 return nil, nil, err 29 } 30 defer wErr.Close() 31 32 var stdout, stderr *os.File 33 os.Stdout, stdout = wOut, os.Stdout 34 os.Stderr, stderr = wErr, os.Stderr 35 36 defer func() { 37 os.Stdout = stdout 38 os.Stderr = stderr 39 }() 40 41 block() 42 43 wOut.Close() 44 wErr.Close() 45 46 return rOut, rErr, nil 47 } 48 49 func capture(block func()) (string, string, error) { 50 rOut, rErr, err := captureReader(block) 51 if err != nil { 52 return "", "", err 53 } 54 defer rOut.Close() 55 defer rErr.Close() 56 57 bufOut, err := io.ReadAll(rOut) 58 if err != nil { 59 return "", "", err 60 } 61 62 bufErr, err := io.ReadAll(rErr) 63 if err != nil { 64 return "", "", err 65 } 66 67 return string(bufOut), string(bufErr), nil 68 } 69 70 func captureWithInput(in []string, block func()) (string, string, error) { 71 rIn, wIn, err := os.Pipe() 72 if err != nil { 73 return "", "", err 74 } 75 defer rIn.Close() 76 77 var stdin *os.File 78 os.Stdin, stdin = rIn, os.Stdin 79 80 defer func() { os.Stdin = stdin }() 81 82 for _, line := range in { 83 fmt.Fprintln(wIn, line) 84 } 85 wIn.Close() 86 return capture(block) 87 } 88 89 func newTempDir(t *testing.T) string { 90 tmpdir, err := os.MkdirTemp("", "ghq-test") 91 if err != nil { 92 t.Fatal(err) 93 } 94 t.Cleanup(func() { os.RemoveAll(tmpdir) }) 95 96 // Resolve /var/folders/.../T/... to /private/var/... in OSX 97 wd, err := os.Getwd() 98 if err != nil { 99 t.Fatalf("os.Getwd(): %s", err) 100 } 101 102 defer func() { 103 err := os.Chdir(wd) 104 if err != nil { 105 t.Fatalf("os.Chdir(): %s", err) 106 } 107 }() 108 109 err = os.Chdir(tmpdir) 110 if err != nil { 111 t.Fatalf("os.Chdir(): %s", err) 112 } 113 114 tmpdir, err = os.Getwd() 115 if err != nil { 116 t.Fatalf("os.Getwd(): %s", err) 117 } 118 119 s, err := toFullPath(tmpdir) 120 if err != nil { 121 t.Fatalf("toFullPath(%q): %s", tmpdir, err) 122 } 123 return s 124 } 125 126 func setEnv(t *testing.T, key, val string) { 127 orig, ok := os.LookupEnv(key) 128 os.Setenv(key, val) 129 130 t.Cleanup(func() { 131 if ok { 132 os.Setenv(key, orig) 133 } else { 134 os.Unsetenv(key) 135 } 136 }) 137 }