github.com/rliebz/gometalinter@v2.0.2-0.20171206234108-d5a071029e07+incompatible/main_test.go (about) 1 package main 2 3 import ( 4 "io/ioutil" 5 "os" 6 "path/filepath" 7 "testing" 8 "time" 9 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 "gopkg.in/alecthomas/kingpin.v3-unstable" 13 ) 14 15 func TestRelativePackagePath(t *testing.T) { 16 var testcases = []struct { 17 dir string 18 expected string 19 }{ 20 { 21 dir: "/abs/path", 22 expected: "/abs/path", 23 }, 24 { 25 dir: ".", 26 expected: ".", 27 }, 28 { 29 dir: "./foo", 30 expected: "./foo", 31 }, 32 { 33 dir: "relative/path", 34 expected: "./relative/path", 35 }, 36 } 37 38 for _, testcase := range testcases { 39 assert.Equal(t, testcase.expected, relativePackagePath(testcase.dir)) 40 } 41 } 42 43 func TestResolvePathsNoPaths(t *testing.T) { 44 paths := resolvePaths(nil, nil) 45 assert.Equal(t, []string{"."}, paths) 46 } 47 48 func TestResolvePathsNoExpands(t *testing.T) { 49 // Non-expanded paths should not be filtered by the skip path list 50 paths := resolvePaths([]string{".", "foo", "foo/bar"}, []string{"foo/bar"}) 51 expected := []string{".", "./foo", "./foo/bar"} 52 assert.Equal(t, expected, paths) 53 } 54 55 func TestResolvePathsWithExpands(t *testing.T) { 56 tmpdir, cleanup := setupTempDir(t) 57 defer cleanup() 58 59 mkGoFile(t, tmpdir, "file.go") 60 mkDir(t, tmpdir, "exclude") 61 mkDir(t, tmpdir, "other", "exclude") 62 mkDir(t, tmpdir, "include") 63 mkDir(t, tmpdir, "include", "foo") 64 mkDir(t, tmpdir, "duplicate") 65 mkDir(t, tmpdir, ".exclude") 66 mkDir(t, tmpdir, "include", ".exclude") 67 mkDir(t, tmpdir, "_exclude") 68 mkDir(t, tmpdir, "include", "_exclude") 69 70 filterPaths := []string{"exclude", "other/exclude"} 71 paths := resolvePaths([]string{"./...", "foo", "duplicate"}, filterPaths) 72 73 expected := []string{ 74 ".", 75 "./duplicate", 76 "./foo", 77 "./include", 78 "./include/foo", 79 } 80 assert.Equal(t, expected, paths) 81 } 82 83 func setupTempDir(t *testing.T) (string, func()) { 84 tmpdir, err := ioutil.TempDir("", "test-expand-paths") 85 require.NoError(t, err) 86 87 oldwd, err := os.Getwd() 88 require.NoError(t, err) 89 require.NoError(t, os.Chdir(tmpdir)) 90 91 return tmpdir, func() { 92 os.RemoveAll(tmpdir) 93 require.NoError(t, os.Chdir(oldwd)) 94 } 95 } 96 97 func mkDir(t *testing.T, paths ...string) { 98 fullPath := filepath.Join(paths...) 99 require.NoError(t, os.MkdirAll(fullPath, 0755)) 100 mkGoFile(t, fullPath, "file.go") 101 } 102 103 func mkGoFile(t *testing.T, path string, filename string) { 104 content := []byte("package foo") 105 err := ioutil.WriteFile(filepath.Join(path, filename), content, 0644) 106 require.NoError(t, err) 107 } 108 109 func TestPathFilter(t *testing.T) { 110 skip := []string{"exclude", "skip.go"} 111 pathFilter := newPathFilter(skip) 112 113 var testcases = []struct { 114 path string 115 expected bool 116 }{ 117 {path: "exclude", expected: true}, 118 {path: "something/skip.go", expected: true}, 119 {path: "skip.go", expected: true}, 120 {path: ".git", expected: true}, 121 {path: "_ignore", expected: true}, 122 {path: "include.go", expected: false}, 123 {path: ".", expected: false}, 124 {path: "..", expected: false}, 125 } 126 127 for _, testcase := range testcases { 128 assert.Equal(t, testcase.expected, pathFilter(testcase.path), testcase.path) 129 } 130 } 131 132 func TestLoadConfigWithDeadline(t *testing.T) { 133 originalConfig := *config 134 defer func() { config = &originalConfig }() 135 136 tmpfile, err := ioutil.TempFile("", "test-config") 137 require.NoError(t, err) 138 defer os.Remove(tmpfile.Name()) 139 140 _, err = tmpfile.Write([]byte(`{"Deadline": "3m"}`)) 141 require.NoError(t, err) 142 require.NoError(t, tmpfile.Close()) 143 144 filename := tmpfile.Name() 145 err = loadConfig(nil, &kingpin.ParseElement{Value: &filename}, nil) 146 require.NoError(t, err) 147 148 require.Equal(t, 3*time.Minute, config.Deadline.Duration()) 149 } 150 151 func TestDeadlineFlag(t *testing.T) { 152 app := kingpin.New("test-app", "") 153 setupFlags(app) 154 _, err := app.Parse([]string{"--deadline", "2m"}) 155 require.NoError(t, err) 156 require.Equal(t, 2*time.Minute, config.Deadline.Duration()) 157 } 158 159 func TestAddPath(t *testing.T) { 160 paths := []string{"existing"} 161 assert.Equal(t, paths, addPath(paths, "existing")) 162 expected := []string{"existing", "new"} 163 assert.Equal(t, expected, addPath(paths, "new")) 164 } 165 166 func TestSetupFlagsLinterFlag(t *testing.T) { 167 originalConfig := *config 168 defer func() { config = &originalConfig }() 169 170 app := kingpin.New("test-app", "") 171 setupFlags(app) 172 _, err := app.Parse([]string{"--linter", "a:b:c"}) 173 require.NoError(t, err) 174 linter, ok := config.Linters["a"] 175 assert.True(t, ok) 176 assert.Equal(t, "b", linter.Command) 177 assert.Equal(t, "c", linter.Pattern) 178 } 179 180 func TestSetupFlagsConfigWithLinterString(t *testing.T) { 181 originalConfig := *config 182 defer func() { config = &originalConfig }() 183 184 tmpfile, err := ioutil.TempFile("", "test-config") 185 require.NoError(t, err) 186 defer os.Remove(tmpfile.Name()) 187 188 _, err = tmpfile.Write([]byte(`{"Linters": {"linter": "command:path"} }`)) 189 require.NoError(t, err) 190 require.NoError(t, tmpfile.Close()) 191 192 app := kingpin.New("test-app", "") 193 setupFlags(app) 194 195 _, err = app.Parse([]string{"--config", tmpfile.Name()}) 196 require.NoError(t, err) 197 linter, ok := config.Linters["linter"] 198 assert.True(t, ok) 199 assert.Equal(t, "command", linter.Command) 200 assert.Equal(t, "path", linter.Pattern) 201 } 202 203 func TestSetupFlagsConfigWithLinterMap(t *testing.T) { 204 originalConfig := *config 205 defer func() { config = &originalConfig }() 206 207 tmpfile, err := ioutil.TempFile("", "test-config") 208 require.NoError(t, err) 209 defer os.Remove(tmpfile.Name()) 210 211 _, err = tmpfile.Write([]byte(`{"Linters": 212 {"linter": 213 { "Command": "command" }}}`)) 214 require.NoError(t, err) 215 require.NoError(t, tmpfile.Close()) 216 217 app := kingpin.New("test-app", "") 218 setupFlags(app) 219 220 _, err = app.Parse([]string{"--config", tmpfile.Name()}) 221 require.NoError(t, err) 222 linter, ok := config.Linters["linter"] 223 assert.True(t, ok) 224 assert.Equal(t, "command", linter.Command) 225 assert.Equal(t, "", linter.Pattern) 226 } 227 228 func TestSetupFlagsConfigAndLinterFlag(t *testing.T) { 229 originalConfig := *config 230 defer func() { config = &originalConfig }() 231 232 tmpfile, err := ioutil.TempFile("", "test-config") 233 require.NoError(t, err) 234 defer os.Remove(tmpfile.Name()) 235 236 _, err = tmpfile.Write([]byte(`{"Linters": 237 {"linter": { "Command": "some-command" }}}`)) 238 require.NoError(t, err) 239 require.NoError(t, tmpfile.Close()) 240 241 app := kingpin.New("test-app", "") 242 setupFlags(app) 243 244 _, err = app.Parse([]string{ 245 "--config", tmpfile.Name(), 246 "--linter", "linter:command:pattern"}) 247 require.NoError(t, err) 248 linter, ok := config.Linters["linter"] 249 assert.True(t, ok) 250 assert.Equal(t, "command", linter.Command) 251 assert.Equal(t, "pattern", linter.Pattern) 252 }