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  }