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  }