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 }