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  }