github.com/palantir/godel-dep-plugin@v1.1.1-0.20201218041358-274eaa9b1310/integration_test/integration_test.go (about) 1 // Copyright (c) 2018 Palantir Technologies Inc. All rights reserved. 2 // Use of this source code is governed by the Apache License, Version 2.0 3 // that can be found in the LICENSE file. 4 5 package integration_test 6 7 import ( 8 "bytes" 9 "fmt" 10 "io/ioutil" 11 "os" 12 "path" 13 "testing" 14 15 "github.com/nmiyake/pkg/dirs" 16 "github.com/nmiyake/pkg/gofiles" 17 "github.com/palantir/godel/framework/pluginapitester" 18 "github.com/palantir/godel/pkg/products/v2/products" 19 "github.com/stretchr/testify/assert" 20 "github.com/stretchr/testify/require" 21 ) 22 23 const godelYML = `exclude: 24 names: 25 - "\\..+" 26 - "vendor" 27 paths: 28 - "godel" 29 ` 30 31 func TestRunDep(t *testing.T) { 32 pluginPath, err := products.Bin("dep-plugin") 33 require.NoError(t, err) 34 35 projectDir, cleanup, err := dirs.TempDir(".", "") 36 require.NoError(t, err) 37 defer cleanup() 38 39 origWd, err := os.Getwd() 40 require.NoError(t, err) 41 defer func() { 42 err = os.Chdir(origWd) 43 require.NoError(t, err) 44 }() 45 err = os.Chdir(projectDir) 46 require.NoError(t, err) 47 48 err = os.MkdirAll(path.Join(projectDir, "godel", "config"), 0755) 49 require.NoError(t, err) 50 err = ioutil.WriteFile(path.Join(projectDir, "godel", "config", "godel.yml"), []byte(godelYML), 0644) 51 require.NoError(t, err) 52 53 _, err = os.Stat("vendor") 54 require.True(t, os.IsNotExist(err)) 55 56 outputBuf := &bytes.Buffer{} 57 runPluginCleanup, err := pluginapitester.RunPlugin(pluginapitester.NewPluginProvider(pluginPath), nil, "run-dep", []string{"init"}, projectDir, false, outputBuf) 58 defer runPluginCleanup() 59 require.NoError(t, err, "Output: %s", outputBuf.String()) 60 61 _, err = os.Stat("vendor") 62 assert.NoError(t, err, "Output: %s", outputBuf.String()) 63 _, err = os.Stat("Gopkg.lock") 64 assert.NoError(t, err, "Output: %s", outputBuf.String()) 65 _, err = os.Stat("Gopkg.toml") 66 assert.NoError(t, err, "Output: %s", outputBuf.String()) 67 } 68 69 func TestDep(t *testing.T) { 70 pluginPath, err := products.Bin("dep-plugin") 71 require.NoError(t, err) 72 73 projectDir, cleanup, err := dirs.TempDir(".", "") 74 require.NoError(t, err) 75 defer cleanup() 76 77 origWd, err := os.Getwd() 78 require.NoError(t, err) 79 defer func() { 80 err = os.Chdir(origWd) 81 require.NoError(t, err) 82 }() 83 err = os.Chdir(projectDir) 84 require.NoError(t, err) 85 86 err = os.MkdirAll(path.Join(projectDir, "godel", "config"), 0755) 87 require.NoError(t, err) 88 err = ioutil.WriteFile(path.Join(projectDir, "godel", "config", "godel.yml"), []byte(godelYML), 0644) 89 require.NoError(t, err) 90 91 _, err = os.Stat("vendor") 92 require.True(t, os.IsNotExist(err)) 93 94 outputBuf := &bytes.Buffer{} 95 runPluginCleanup, err := pluginapitester.RunPlugin(pluginapitester.NewPluginProvider(pluginPath), nil, "run-dep", []string{"init"}, projectDir, false, outputBuf) 96 defer runPluginCleanup() 97 require.NoError(t, err, "Output: %s", outputBuf.String()) 98 99 specs := []gofiles.GoFileSpec{ 100 { 101 RelPath: "foo.go", 102 Src: `package foo; import _ "github.com/pkg/errors";`, 103 }, 104 } 105 106 _, err = gofiles.Write(projectDir, specs) 107 require.NoError(t, err) 108 109 outputBuf = &bytes.Buffer{} 110 runPluginCleanup, err = pluginapitester.RunPlugin(pluginapitester.NewPluginProvider(pluginPath), nil, "dep", nil, projectDir, false, outputBuf) 111 defer runPluginCleanup() 112 require.NoError(t, err, "Output: %s", outputBuf.String()) 113 114 _, err = os.Stat("vendor/github.com/pkg/errors") 115 assert.NoError(t, err, "Output: %s", outputBuf.String()) 116 } 117 118 func TestDepVerifyApplyFalseFails(t *testing.T) { 119 pluginPath, err := products.Bin("dep-plugin") 120 require.NoError(t, err) 121 122 projectDir, cleanup, err := dirs.TempDir(".", "") 123 require.NoError(t, err) 124 defer cleanup() 125 126 origWd, err := os.Getwd() 127 require.NoError(t, err) 128 defer func() { 129 err = os.Chdir(origWd) 130 require.NoError(t, err) 131 }() 132 err = os.Chdir(projectDir) 133 require.NoError(t, err) 134 135 err = os.MkdirAll(path.Join(projectDir, "godel", "config"), 0755) 136 require.NoError(t, err) 137 err = ioutil.WriteFile(path.Join(projectDir, "godel", "config", "godel.yml"), []byte(godelYML), 0644) 138 require.NoError(t, err) 139 140 _, err = os.Stat("vendor") 141 require.True(t, os.IsNotExist(err)) 142 143 outputBuf := &bytes.Buffer{} 144 runPluginCleanup, err := pluginapitester.RunPlugin(pluginapitester.NewPluginProvider(pluginPath), nil, "run-dep", []string{"init"}, projectDir, false, outputBuf) 145 defer runPluginCleanup() 146 require.NoError(t, err, "Output: %s", outputBuf.String()) 147 148 specs := []gofiles.GoFileSpec{ 149 { 150 RelPath: "foo.go", 151 Src: `package foo; import _ "github.com/pkg/errors";`, 152 }, 153 } 154 155 _, err = gofiles.Write(projectDir, specs) 156 require.NoError(t, err) 157 158 outputBuf = &bytes.Buffer{} 159 runPluginCleanup, err = pluginapitester.RunPlugin(pluginapitester.NewPluginProvider(pluginPath), nil, "dep", []string{"--verify"}, projectDir, false, outputBuf) 160 defer runPluginCleanup() 161 require.Error(t, err) 162 assert.Equal(t, "Error: # Gopkg.lock is out of sync:\ngithub.com/pkg/errors: imported or required, but missing from Gopkg.lock's input-imports\n\n", outputBuf.String()) 163 } 164 165 func TestDepVerifyApplyFalseExecErrorFails(t *testing.T) { 166 pluginPath, err := products.Bin("dep-plugin") 167 require.NoError(t, err) 168 169 projectDir, cleanup, err := dirs.TempDir(".", "") 170 require.NoError(t, err) 171 defer cleanup() 172 173 origWd, err := os.Getwd() 174 require.NoError(t, err) 175 defer func() { 176 err = os.Chdir(origWd) 177 require.NoError(t, err) 178 }() 179 err = os.Chdir(projectDir) 180 require.NoError(t, err) 181 182 err = os.MkdirAll(path.Join(projectDir, "godel", "config"), 0755) 183 require.NoError(t, err) 184 err = ioutil.WriteFile(path.Join(projectDir, "godel", "config", "godel.yml"), []byte(godelYML), 0644) 185 require.NoError(t, err) 186 187 _, err = os.Stat("vendor") 188 require.True(t, os.IsNotExist(err)) 189 190 outputBuf := &bytes.Buffer{} 191 runPluginCleanup, err := pluginapitester.RunPlugin(pluginapitester.NewPluginProvider(pluginPath), nil, "run-dep", []string{"init"}, projectDir, false, outputBuf) 192 defer runPluginCleanup() 193 require.NoError(t, err, "Output: %s", outputBuf.String()) 194 195 // note: import path is not quoted, so this does not compile 196 specs := []gofiles.GoFileSpec{ 197 { 198 RelPath: "foo.go", 199 Src: `package foo; import _ github.com/pkg/errors;`, 200 }, 201 } 202 203 files, err := gofiles.Write(projectDir, specs) 204 require.NoError(t, err) 205 206 outputBuf = &bytes.Buffer{} 207 runPluginCleanup, err = pluginapitester.RunPlugin(pluginapitester.NewPluginProvider(pluginPath), nil, "dep", []string{}, projectDir, false, outputBuf) 208 defer runPluginCleanup() 209 require.Error(t, err) 210 // if verification is due to error besides vendor state not matching expected state, verification output should 211 // include error output 212 assert.Equal(t, fmt.Sprintf(`found 1 errors in the package tree: 213 %s:1:23: expected 'STRING', found github 214 `, files["foo.go"].Path), outputBuf.String()) 215 }