github.com/ninadingole/gotest-ls@v0.0.3/main_test.go (about) 1 package main 2 3 import ( 4 "bytes" 5 "fmt" 6 "os" 7 "os/exec" 8 "strings" 9 "testing" 10 11 "github.com/stretchr/testify/require" 12 ) 13 14 func TestListAllTestsForGivenFile(t *testing.T) { 15 t.Parallel() 16 17 var buffer bytes.Buffer 18 19 err := Process(&args{ 20 dirs: []string{"./tests"}, 21 }, &buffer) 22 require.NoError(t, err) 23 24 // This is to make it work on any OS and any folder 25 pwd, err := os.Getwd() 26 require.NoError(t, err) 27 28 fmt.Println(buffer.String()) 29 30 require.JSONEq(t, 31 strings.ReplaceAll(`[{"name":"BenchmarkSomething","fileName":"benchmark_test.go","relativePath":"tests/benchmark_test.go","absolutePath":"##PATH##/tests/benchmark_test.go","line":5,"pos":44},{"name":"Example_something","fileName":"example_test.go","relativePath":"tests/example_test.go","absolutePath":"##PATH##/tests/example_test.go","line":5,"pos":40},{"name":"Test/5_+_5_=_10","fileName":"table_test.go","relativePath":"tests/table_test.go","absolutePath":"##PATH##/tests/table_test.go","line":23,"pos":265},{"name":"Test/5_-_5_=_0","fileName":"table_test.go","relativePath":"tests/table_test.go","absolutePath":"##PATH##/tests/table_test.go","line":30,"pos":355},{"name":"Test/mixed_subtest_1","fileName":"table_test.go","relativePath":"tests/table_test.go","absolutePath":"##PATH##/tests/table_test.go","line":12,"pos":111},{"name":"Test/mixed_test_2","fileName":"table_test.go","relativePath":"tests/table_test.go","absolutePath":"##PATH##/tests/table_test.go","line":48,"pos":635},{"name":"TestSomething","fileName":"sample_test.go","relativePath":"tests/sample_test.go","absolutePath":"##PATH##/tests/sample_test.go","line":7,"pos":49},{"name":"Test_subTestPattern/subtest","fileName":"subtest_test.go","relativePath":"tests/subtest_test.go","absolutePath":"##PATH##/tests/subtest_test.go","line":10,"pos":121},{"name":"Test_subTestPattern/subtest_2","fileName":"subtest_test.go","relativePath":"tests/subtest_test.go","absolutePath":"##PATH##/tests/subtest_test.go","line":15,"pos":193}]`, 32 "##PATH##", pwd), 33 buffer.String()) 34 } 35 36 func Example_errorIfFileAndDirectoryBothAreProvided() { 37 cmd := exec.Command("go", "run", "main.go", "-p", "-f", "./tests/sample_test.go", "./tests") 38 cmd.Stdout = os.Stdout 39 cmd.Stderr = os.Stderr 40 41 if err := cmd.Run(); err == nil { 42 panic("expected error") 43 } 44 45 // Output: ERROR: cannot specify both a file and a directory 46 } 47 48 func Example_errorIfFileProvidedIsDirectory() { 49 cmd := exec.Command("go", "run", "main.go", "-p", "-f", "./tests") 50 cmd.Stdout = os.Stdout 51 cmd.Stderr = os.Stderr 52 53 if err := cmd.Run(); err == nil { 54 panic("expected error") 55 } 56 57 // Output: ERROR: required file, provided directory 58 } 59 60 func Test_process(t *testing.T) { 61 t.Parallel() 62 63 pwd, err := os.Getwd() 64 require.NoError(t, err) 65 66 tests := []struct { 67 name string 68 args args 69 wantErr bool 70 errExpected string 71 checks func(t *testing.T, got string) 72 }{ 73 { 74 name: "should return error if file and directory both are provided", 75 args: args{ 76 pretty: false, 77 file: "./tests/sample_test.go", 78 dirs: []string{"./tests"}, 79 }, 80 wantErr: true, 81 errExpected: errPathIssue.Error(), 82 }, 83 { 84 name: "should return error if file provided is directory", 85 args: args{ 86 pretty: false, 87 file: "./tests", 88 }, 89 wantErr: true, 90 errExpected: errNotAFile.Error(), 91 }, 92 { 93 name: "should return the test details in a file", 94 args: args{ 95 pretty: false, 96 file: "./tests/sample_test.go", 97 }, 98 checks: func(t *testing.T, got string) { 99 t.Helper() 100 101 require.JSONEq(t, fmt.Sprintf(`[{"name":"TestSomething","fileName":"sample_test.go","relativePath":"sample_test.go","absolutePath":"%s/tests/sample_test.go","line":7,"pos":49}]`, pwd), 102 got) 103 }, 104 }, 105 { 106 name: "should return the test details in a file with pretty flag", 107 args: args{ 108 pretty: true, 109 file: "./tests/sample_test.go", 110 }, 111 checks: func(t *testing.T, got string) { 112 t.Helper() 113 114 require.JSONEq(t, fmt.Sprintf(`[ 115 { 116 "name": "TestSomething", 117 "fileName": "sample_test.go", 118 "relativePath": "sample_test.go", 119 "absolutePath": "%s/tests/sample_test.go", 120 "line": 7, 121 "pos": 49 122 } 123 ]`, pwd), got) 124 }, 125 }, 126 { 127 name: "should also return subtests and table tests", 128 args: args{ 129 pretty: false, 130 file: "./tests/table_test.go", 131 }, 132 checks: func(t *testing.T, got string) { 133 t.Helper() 134 135 require.JSONEq(t, strings.ReplaceAll(`[{"name":"Test/5_+_5_=_10","fileName":"table_test.go","relativePath":"table_test.go","absolutePath":"##PATH##/tests/table_test.go","line":23,"pos":265},{"name":"Test/5_-_5_=_0","fileName":"table_test.go","relativePath":"table_test.go","absolutePath":"##PATH##/tests/table_test.go","line":30,"pos":355},{"name":"Test/mixed_subtest_1","fileName":"table_test.go","relativePath":"table_test.go","absolutePath":"##PATH##/tests/table_test.go","line":12,"pos":111},{"name":"Test/mixed_test_2","fileName":"table_test.go","relativePath":"table_test.go","absolutePath":"##PATH##/tests/table_test.go","line":48,"pos":635}]`, "##PATH##", pwd), got) 136 }, 137 }, 138 { 139 name: "should show help if no arguments are provided", 140 args: args{}, 141 checks: func(t *testing.T, got string) { 142 t.Helper() 143 144 require.Equal(t, `gotest-ls provides a list of all tests in a package or a file in JSON format. 145 146 Usage: 147 gotest-ls [flags] [directories] 148 149 Examples: 150 gotest-ls . 151 gotest-ls -p ./cmd 152 gotest-ls -p ./cmd ./pkg 153 gotest-ls -f ./pkg/random_test.go 154 gotest-ls -p -f ./pkg/random_test.go 155 156 Flags: 157 -f, --file string Path to a file, cannot be used with directories 158 -h, --help help for gotest-ls 159 -p, --pretty Pretty print the output in JSON format 160 `, got) 161 }, 162 }, 163 { 164 name: "return error if directory does not exist", 165 args: args{ 166 dirs: []string{"./false-directory"}, 167 }, 168 wantErr: true, 169 errExpected: errUnknown.Error() + ": lstat ./false-directory: no such file or directory", 170 }, 171 { 172 name: "return error if there is no test in the directory", 173 args: args{ 174 dirs: []string{"./dead-tests"}, 175 }, 176 checks: func(t *testing.T, got string) { 177 t.Helper() 178 179 require.Equal(t, "No tests found\n", got) 180 }, 181 }, 182 } 183 for _, tt := range tests { 184 tt := tt 185 186 t.Run(tt.name, func(t *testing.T) { 187 t.Parallel() 188 writer := &bytes.Buffer{} 189 190 err := Process(&tt.args, writer) 191 192 if tt.wantErr { 193 require.Error(t, err) 194 require.Equal(t, tt.errExpected, err.Error()) 195 } else { 196 require.NoError(t, err) 197 } 198 199 if tt.checks != nil { 200 tt.checks(t, writer.String()) 201 } 202 }) 203 } 204 }