github.com/motemen/ghq@v1.0.3/helpers_test.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     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  
    25  	rErr, wErr, err := os.Pipe()
    26  	if err != nil {
    27  		return nil, nil, err
    28  	}
    29  
    30  	defer wOut.Close()
    31  	defer wErr.Close()
    32  
    33  	var stdout, stderr *os.File
    34  	os.Stdout, stdout = wOut, os.Stdout
    35  	os.Stderr, stderr = wErr, os.Stderr
    36  
    37  	defer func() {
    38  		os.Stdout = stdout
    39  		os.Stderr = stderr
    40  	}()
    41  
    42  	block()
    43  
    44  	wOut.Close()
    45  	wErr.Close()
    46  
    47  	return rOut, rErr, nil
    48  }
    49  
    50  func capture(block func()) (string, string, error) {
    51  	rOut, rErr, err := captureReader(block)
    52  	if err != nil {
    53  		return "", "", err
    54  	}
    55  	defer rOut.Close()
    56  	defer rErr.Close()
    57  
    58  	bufOut, err := ioutil.ReadAll(rOut)
    59  	if err != nil {
    60  		return "", "", err
    61  	}
    62  
    63  	bufErr, err := ioutil.ReadAll(rErr)
    64  	if err != nil {
    65  		return "", "", err
    66  	}
    67  
    68  	return string(bufOut), string(bufErr), nil
    69  }
    70  
    71  func captureWithInput(in []string, block func()) (string, string, error) {
    72  	rIn, wIn, err := os.Pipe()
    73  	if err != nil {
    74  		return "", "", err
    75  	}
    76  	defer rIn.Close()
    77  	var stdin *os.File
    78  	os.Stdin, stdin = rIn, os.Stdin
    79  	defer func() { os.Stdin = stdin }()
    80  	for _, line := range in {
    81  		fmt.Fprintln(wIn, line)
    82  	}
    83  	wIn.Close()
    84  	return capture(block)
    85  }
    86  
    87  func newTempDir(t *testing.T) string {
    88  	tmpdir, err := ioutil.TempDir("", "ghq-test")
    89  	if err != nil {
    90  		t.Fatal(err)
    91  	}
    92  	// Resolve /var/folders/.../T/... to /private/var/... in OSX
    93  	wd, err := os.Getwd()
    94  	if err != nil {
    95  		t.Fatalf("os.Getwd(): %s", err)
    96  	}
    97  
    98  	defer func() {
    99  		err := os.Chdir(wd)
   100  		if err != nil {
   101  			t.Fatalf("os.Chdir(): %s", err)
   102  		}
   103  	}()
   104  
   105  	err = os.Chdir(tmpdir)
   106  	if err != nil {
   107  		t.Fatalf("os.Chdir(): %s", err)
   108  	}
   109  
   110  	tmpdir, err = os.Getwd()
   111  	if err != nil {
   112  		t.Fatalf("os.Getwd(): %s", err)
   113  	}
   114  
   115  	s, err := toFullPath(tmpdir)
   116  	if err != nil {
   117  		t.Fatalf("toFullPath(%q): %s", tmpdir, err)
   118  	}
   119  	return s
   120  }
   121  
   122  func tmpEnv(key, val string) func() {
   123  	orig, ok := os.LookupEnv(key)
   124  	os.Setenv(key, val)
   125  
   126  	return func() {
   127  		if ok {
   128  			os.Setenv(key, orig)
   129  		} else {
   130  			os.Unsetenv(key)
   131  		}
   132  	}
   133  }