github.com/jdhenke/godel@v0.0.0-20161213181855-abeb3861bf0d/apps/distgo/pkg/imports/imports_test.go (about)

     1  // Copyright 2016 Palantir Technologies, Inc.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  //     http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package imports_test
    16  
    17  import (
    18  	"io/ioutil"
    19  	"path"
    20  	"path/filepath"
    21  	"testing"
    22  	"time"
    23  
    24  	"github.com/nmiyake/pkg/dirs"
    25  	"github.com/nmiyake/pkg/gofiles"
    26  	"github.com/stretchr/testify/assert"
    27  	"github.com/stretchr/testify/require"
    28  
    29  	"github.com/palantir/godel/apps/distgo/pkg/imports"
    30  )
    31  
    32  func TestAllFiles(t *testing.T) {
    33  	tmpDir, cleanup, err := dirs.TempDir(".", "")
    34  	defer cleanup()
    35  	require.NoError(t, err)
    36  
    37  	for i, currCase := range []struct {
    38  		pkgPath string
    39  		files   []gofiles.GoFileSpec
    40  		want    func(projectDir string) imports.GoFiles
    41  	}{
    42  		// returns files for primary package
    43  		{
    44  			pkgPath: ".",
    45  			files: []gofiles.GoFileSpec{
    46  				{
    47  					RelPath: "main.go",
    48  					Src:     `package main; import "fmt"; func main() {}`,
    49  				},
    50  				{
    51  					RelPath: "main_helper.go",
    52  					Src:     `package main; func Helper() string { return "helper" }`,
    53  				},
    54  			},
    55  			want: func(projectDir string) imports.GoFiles {
    56  				absPkgDir, err := filepath.Abs(projectDir)
    57  				require.NoError(t, err)
    58  				return imports.GoFiles(map[string][]string{
    59  					absPkgDir: {
    60  						"main.go",
    61  						"main_helper.go",
    62  					},
    63  				})
    64  			},
    65  		},
    66  		// test files are excluded
    67  		{
    68  			pkgPath: ".",
    69  			files: []gofiles.GoFileSpec{
    70  				{
    71  					RelPath: "main.go",
    72  					Src:     `package main; import "fmt"; func main() {}`,
    73  				},
    74  				{
    75  					RelPath: "main_test.go",
    76  					Src:     `package main; import "testing"; func TestMain(t *testing.T) {}`,
    77  				},
    78  				{
    79  					RelPath: "another_test.go",
    80  					Src:     `package main_test; import "testing"; func TestMain(t *testing.T) {}`,
    81  				},
    82  			},
    83  			want: func(projectDir string) imports.GoFiles {
    84  				absPkgDir, err := filepath.Abs(projectDir)
    85  				require.NoError(t, err)
    86  				return imports.GoFiles(map[string][]string{
    87  					absPkgDir: {
    88  						"main.go",
    89  					},
    90  				})
    91  			},
    92  		},
    93  		// returns files for primary package and imported package
    94  		{
    95  			pkgPath: ".",
    96  			files: []gofiles.GoFileSpec{
    97  				{
    98  					RelPath: "main.go",
    99  					Src:     `package main; import "fmt"; import "{{index . "foo/foo.go"}}"; func main() { fmt.Println(foo.Foo()) }`,
   100  				},
   101  				{
   102  					RelPath: "foo/foo.go",
   103  					Src:     `package foo; func Foo() string { return "foo" }`,
   104  				},
   105  				{
   106  					RelPath: "foo/foo_helper.go",
   107  					Src:     `package foo`,
   108  				},
   109  			},
   110  			want: func(projectDir string) imports.GoFiles {
   111  				absPkgDir, err := filepath.Abs(projectDir)
   112  				require.NoError(t, err)
   113  				return imports.GoFiles(map[string][]string{
   114  					absPkgDir: {
   115  						"main.go",
   116  					},
   117  					path.Join(absPkgDir, "foo"): {
   118  						"foo.go",
   119  						"foo_helper.go",
   120  					},
   121  				})
   122  			},
   123  		},
   124  		// returns vendored dependency files
   125  		{
   126  			pkgPath: ".",
   127  			files: []gofiles.GoFileSpec{
   128  				{
   129  					RelPath: "main.go",
   130  					Src:     `package main; import "fmt"; import "github.com/foo"; func main() { fmt.Println(foo.Foo()) }`,
   131  				},
   132  				{
   133  					RelPath: "vendor/github.com/foo/foo.go",
   134  					Src:     `package foo; func Foo() string { return "foo" }`,
   135  				},
   136  				{
   137  					RelPath: "vendor/github.com/foo/bar/bar.go",
   138  					Src:     `package bar`,
   139  				},
   140  			},
   141  			want: func(projectDir string) imports.GoFiles {
   142  				absPkgDir, err := filepath.Abs(projectDir)
   143  				require.NoError(t, err)
   144  				return imports.GoFiles(map[string][]string{
   145  					absPkgDir: {
   146  						"main.go",
   147  					},
   148  					path.Join(absPkgDir, "vendor/github.com/foo"): {
   149  						"foo.go",
   150  					},
   151  				})
   152  			},
   153  		},
   154  	} {
   155  		currProjectDir, err := ioutil.TempDir(tmpDir, "")
   156  		require.NoError(t, err, "Case %d", i)
   157  
   158  		_, err = gofiles.Write(currProjectDir, currCase.files)
   159  		require.NoError(t, err, "Case %d", i)
   160  
   161  		got, err := imports.AllFiles(currProjectDir)
   162  		require.NoError(t, err, "Case %d", i)
   163  		assert.Equal(t, currCase.want(currProjectDir), got, "Case %d", i)
   164  	}
   165  }
   166  
   167  func TestNewerThanFileIsNewer(t *testing.T) {
   168  	tmpDir, cleanup, err := dirs.TempDir(".", "")
   169  	defer cleanup()
   170  	require.NoError(t, err)
   171  
   172  	tmpFile, err := ioutil.TempFile(tmpDir, "")
   173  	require.NoError(t, err)
   174  	fi, err := tmpFile.Stat()
   175  	require.NoError(t, err)
   176  	err = tmpFile.Close()
   177  	require.NoError(t, err)
   178  
   179  	// sleep for 1 second to ensure that mtimes differ
   180  	time.Sleep(time.Second)
   181  
   182  	err = ioutil.WriteFile(path.Join(tmpDir, "main.go"), []byte(`package main; import "fmt"; func main() {}`), 0644)
   183  	require.NoError(t, err)
   184  
   185  	goFiles, err := imports.AllFiles(tmpDir)
   186  	require.NoError(t, err)
   187  
   188  	newer, err := goFiles.NewerThan(fi)
   189  	require.NoError(t, err)
   190  	assert.True(t, newer)
   191  }
   192  
   193  func TestNewerThanFileIsNotNewer(t *testing.T) {
   194  	tmpDir, cleanup, err := dirs.TempDir(".", "")
   195  	defer cleanup()
   196  	require.NoError(t, err)
   197  
   198  	err = ioutil.WriteFile(path.Join(tmpDir, "main.go"), []byte(`package main; import "fmt"; func main() {}`), 0644)
   199  	require.NoError(t, err)
   200  
   201  	goFiles, err := imports.AllFiles(tmpDir)
   202  	require.NoError(t, err)
   203  
   204  	// sleep for 1 second to ensure that mtimes differ
   205  	time.Sleep(time.Second)
   206  
   207  	tmpFile, err := ioutil.TempFile(tmpDir, "")
   208  	require.NoError(t, err)
   209  	fi, err := tmpFile.Stat()
   210  	require.NoError(t, err)
   211  	err = tmpFile.Close()
   212  	require.NoError(t, err)
   213  
   214  	newer, err := goFiles.NewerThan(fi)
   215  	require.NoError(t, err)
   216  	assert.False(t, newer)
   217  }