github.com/posener/gitfs@v1.2.2-0.20200410105819-ea4e48d73ab9/cmd/gitfs/main_test.go (about)

     1  package main
     2  
     3  import (
     4  	"io/ioutil"
     5  	"os"
     6  	"os/exec"
     7  	"path/filepath"
     8  	"regexp"
     9  	"testing"
    10  
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  func TestRun(t *testing.T) {
    16  	defer clean()
    17  	t.Run("Successful run", func(t *testing.T) {
    18  		stderr, err := runGo(t, "run", ".", "-out", "testout1.go", "../../examples/templates/...")
    19  		assert.NoErrorf(t, err, "Expected success, got error: %s", stderr)
    20  
    21  		// Test the output file.
    22  		data, err := ioutil.ReadFile("testout1.go")
    23  		require.NoError(t, err)
    24  		assert.True(t, regexp.MustCompile(`package main`).Match(data))
    25  
    26  		stderr, err = runGo(t, "build", ".")
    27  		require.NoErrorf(t, err, "Build failed: %s", stderr)
    28  		stderr, err = runGo(t, "test", "./...", "-run", "TestGitFS")
    29  		require.NoErrorf(t, err, "Test failed: %s", stderr)
    30  	})
    31  
    32  	t.Run("Pattern must be provided", func(t *testing.T) {
    33  		_, err := runGo(t, "run", ".", "-out", "testout2.go")
    34  		assert.Error(t, err)
    35  
    36  		// Test that file was deleted after failure.
    37  		_, err = os.Stat("testout2.go")
    38  		assert.Error(t, err)
    39  	})
    40  }
    41  
    42  func TestGetOut(t *testing.T) {
    43  	t.Parallel()
    44  	tests := []struct {
    45  		out  string
    46  		want string
    47  	}{
    48  		{out: "", want: "gitfs.go"},
    49  		// A local file stay the same.
    50  		{out: "f.go", want: "f.go"},
    51  		// A dir is appended with file.
    52  		{out: "/tmp", want: "/tmp/gitfs.go"},
    53  		// Local dir is appended with a file.
    54  		{out: ".", want: "gitfs.go"},
    55  		{out: "..", want: "../gitfs.go"},
    56  		// A file in a dir stay the same.
    57  		{out: "/tmp/f.go", want: "/tmp/f.go"},
    58  	}
    59  	for _, tt := range tests {
    60  		t.Run(tt.out, func(t *testing.T) {
    61  			got, err := getOut(tt.out)
    62  			require.NoError(t, err)
    63  			assert.Equal(t, tt.want, got)
    64  		})
    65  	}
    66  }
    67  
    68  func TestGetOut_fail(t *testing.T) {
    69  	t.Parallel()
    70  	tests := []string{
    71  		// Output must be in existing directory.
    72  		"nosuchdir/testout.go",
    73  		// Output directory must exists.
    74  		"nosuchdir/",
    75  	}
    76  	for _, out := range tests {
    77  		t.Run(out, func(t *testing.T) {
    78  			_, err := getOut(out)
    79  			assert.Error(t, err)
    80  		})
    81  	}
    82  }
    83  
    84  func TestGetPkg(t *testing.T) {
    85  	t.Parallel()
    86  	tests := []struct {
    87  		pkg  string
    88  		out  string
    89  		want string
    90  	}{
    91  		{pkg: "foo", want: "foo"},
    92  		{out: "", want: "main"},
    93  		{out: ".", want: "main"},
    94  		{out: "../../", want: "gitfs"},
    95  	}
    96  	for _, tt := range tests {
    97  		t.Run(tt.out, func(t *testing.T) {
    98  			got, err := getPkg(tt.pkg, tt.out)
    99  			require.NoError(t, err)
   100  			assert.Equal(t, tt.want, got)
   101  		})
   102  	}
   103  }
   104  
   105  func runGo(t *testing.T, args ...string) (stderr string, err error) {
   106  	cmd := exec.Command("go", args...)
   107  	stderrBuf, err := cmd.StderrPipe()
   108  	if err != nil {
   109  		t.Fatal(err)
   110  	}
   111  	require.NoError(t, cmd.Start())
   112  	stderrBytes, err := ioutil.ReadAll(stderrBuf)
   113  	if err != nil {
   114  		t.Fatal(err)
   115  	}
   116  	err = cmd.Wait()
   117  	return string(stderrBytes), err
   118  }
   119  
   120  func clean() {
   121  	paths, err := filepath.Glob("testout*.go")
   122  	if err != nil {
   123  		panic(err)
   124  	}
   125  	for _, path := range paths {
   126  		os.Remove(path)
   127  	}
   128  }