github.com/triarius/goreleaser@v1.12.5/internal/pipe/gomod/gomod_proxy_test.go (about)

     1  package gomod
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"runtime"
     8  	"testing"
     9  
    10  	"github.com/triarius/goreleaser/internal/testlib"
    11  	"github.com/triarius/goreleaser/pkg/config"
    12  	"github.com/triarius/goreleaser/pkg/context"
    13  	"github.com/stretchr/testify/require"
    14  )
    15  
    16  func TestGoModProxy(t *testing.T) {
    17  	t.Run("goreleaser", func(t *testing.T) {
    18  		dir := testlib.Mktmp(t)
    19  		dist := filepath.Join(dir, "dist")
    20  		ctx := context.New(config.Project{
    21  			Dist: dist,
    22  			GoMod: config.GoMod{
    23  				Proxy:    true,
    24  				GoBinary: "go",
    25  			},
    26  			Builds: []config.Build{
    27  				{
    28  					ID:     "foo",
    29  					Goos:   []string{runtime.GOOS},
    30  					Goarch: []string{runtime.GOARCH},
    31  					Main:   ".",
    32  					Dir:    ".",
    33  				},
    34  			},
    35  		})
    36  		ctx.Git.CurrentTag = "v0.161.1"
    37  
    38  		ctx.ModulePath = "github.com/triarius/goreleaser"
    39  
    40  		fakeGoModAndSum(t, ctx.ModulePath)
    41  		require.NoError(t, ProxyPipe{}.Run(ctx))
    42  		requireGoMod(t, ctx.ModulePath, ctx.Git.CurrentTag)
    43  		requireMainGo(t, ctx.ModulePath)
    44  		require.Equal(t, ctx.ModulePath, ctx.Config.Builds[0].Main)
    45  		require.Equal(t, ".", ctx.Config.Builds[0].UnproxiedMain)
    46  		require.Equal(t, filepath.Join(dist, "proxy", "foo"), ctx.Config.Builds[0].Dir)
    47  		require.Equal(t, ".", ctx.Config.Builds[0].UnproxiedDir)
    48  
    49  		require.Equal(t, ctx.ModulePath, ctx.ModulePath)
    50  	})
    51  
    52  	t.Run("nfpm", func(t *testing.T) {
    53  		dir := testlib.Mktmp(t)
    54  		dist := filepath.Join(dir, "dist")
    55  		ctx := context.New(config.Project{
    56  			Dist: dist,
    57  			GoMod: config.GoMod{
    58  				Proxy:    true,
    59  				GoBinary: "go",
    60  			},
    61  			Builds: []config.Build{
    62  				{
    63  					ID:     "foo",
    64  					Goos:   []string{runtime.GOOS},
    65  					Goarch: []string{runtime.GOARCH},
    66  					Main:   "./cmd/nfpm",
    67  				},
    68  			},
    69  		})
    70  		ctx.Git.CurrentTag = "v2.3.1"
    71  
    72  		ctx.ModulePath = "github.com/goreleaser/nfpm/v2"
    73  		fakeGoModAndSum(t, ctx.ModulePath)
    74  		require.NoError(t, ProxyPipe{}.Run(ctx))
    75  		requireGoMod(t, ctx.ModulePath, ctx.Git.CurrentTag)
    76  		requireMainGo(t, ctx.ModulePath+"/cmd/nfpm")
    77  		require.Equal(t, ctx.ModulePath+"/cmd/nfpm", ctx.Config.Builds[0].Main)
    78  		require.Equal(t, filepath.Join(dist, "proxy", "foo"), ctx.Config.Builds[0].Dir)
    79  		require.Equal(t, ctx.ModulePath, ctx.ModulePath)
    80  	})
    81  
    82  	// this repo does not have a go.sum file, which is ok, a project might not have any dependencies
    83  	t.Run("no go.sum", func(t *testing.T) {
    84  		dir := testlib.Mktmp(t)
    85  		dist := filepath.Join(dir, "dist")
    86  		ctx := context.New(config.Project{
    87  			Dist: dist,
    88  			GoMod: config.GoMod{
    89  				Proxy:    true,
    90  				GoBinary: "go",
    91  			},
    92  			Builds: []config.Build{
    93  				{
    94  					ID:     "foo",
    95  					Goos:   []string{runtime.GOOS},
    96  					Goarch: []string{runtime.GOARCH},
    97  				},
    98  			},
    99  		})
   100  		ctx.Git.CurrentTag = "v0.0.1"
   101  
   102  		ctx.ModulePath = "github.com/goreleaser/example-mod-proxy"
   103  		fakeGoMod(t, ctx.ModulePath)
   104  		require.NoError(t, ProxyPipe{}.Run(ctx))
   105  		requireGoMod(t, ctx.ModulePath, ctx.Git.CurrentTag)
   106  		requireMainGo(t, ctx.ModulePath)
   107  		require.Equal(t, ctx.ModulePath, ctx.Config.Builds[0].Main)
   108  		require.Equal(t, filepath.Join(dist, "proxy", "foo"), ctx.Config.Builds[0].Dir)
   109  		require.Equal(t, ctx.ModulePath, ctx.ModulePath)
   110  	})
   111  
   112  	t.Run("no perms", func(t *testing.T) {
   113  		for file, mode := range map[string]os.FileMode{
   114  			"go.mod":          0o500,
   115  			"go.sum":          0o500,
   116  			"main.go":         0o500,
   117  			"../../../go.sum": 0o300,
   118  		} {
   119  			t.Run(file, func(t *testing.T) {
   120  				dir := testlib.Mktmp(t)
   121  				dist := filepath.Join(dir, "dist")
   122  				ctx := context.New(config.Project{
   123  					Dist: dist,
   124  					GoMod: config.GoMod{
   125  						Proxy:    true,
   126  						GoBinary: "go",
   127  					},
   128  					Builds: []config.Build{
   129  						{
   130  							ID:     "foo",
   131  							Goos:   []string{runtime.GOOS},
   132  							Goarch: []string{runtime.GOARCH},
   133  						},
   134  					},
   135  				})
   136  				ctx.Git.CurrentTag = "v0.161.1"
   137  
   138  				ctx.ModulePath = "github.com/triarius/goreleaser"
   139  
   140  				fakeGoModAndSum(t, ctx.ModulePath)
   141  				require.NoError(t, ProxyPipe{}.Run(ctx)) // should succeed at first
   142  
   143  				// change perms of a file and run again, which should now fail on that file.
   144  				require.NoError(t, os.Chmod(filepath.Join(dist, "proxy", "foo", file), mode))
   145  				require.ErrorAs(t, ProxyPipe{}.Run(ctx), &ErrProxy{})
   146  			})
   147  		}
   148  	})
   149  
   150  	t.Run("goreleaser with main.go", func(t *testing.T) {
   151  		dir := testlib.Mktmp(t)
   152  		dist := filepath.Join(dir, "dist")
   153  		ctx := context.New(config.Project{
   154  			Dist: dist,
   155  			GoMod: config.GoMod{
   156  				Proxy:    true,
   157  				GoBinary: "go",
   158  			},
   159  			Builds: []config.Build{
   160  				{
   161  					ID:     "foo",
   162  					Goos:   []string{runtime.GOOS},
   163  					Goarch: []string{runtime.GOARCH},
   164  					Main:   "main.go",
   165  				},
   166  			},
   167  		})
   168  		ctx.Git.CurrentTag = "v0.161.1"
   169  
   170  		ctx.ModulePath = "github.com/triarius/goreleaser"
   171  
   172  		fakeGoModAndSum(t, ctx.ModulePath)
   173  		require.NoError(t, ProxyPipe{}.Run(ctx))
   174  		requireGoMod(t, ctx.ModulePath, ctx.Git.CurrentTag)
   175  		requireMainGo(t, ctx.ModulePath)
   176  		require.Equal(t, ctx.ModulePath, ctx.Config.Builds[0].Main)
   177  		require.Equal(t, filepath.Join(dist, "proxy", "foo"), ctx.Config.Builds[0].Dir)
   178  		require.Equal(t, ctx.ModulePath, ctx.ModulePath)
   179  	})
   180  }
   181  
   182  func TestProxyDescription(t *testing.T) {
   183  	require.NotEmpty(t, ProxyPipe{}.String())
   184  }
   185  
   186  func TestSkip(t *testing.T) {
   187  	t.Run("skip false gomod.proxy", func(t *testing.T) {
   188  		require.True(t, ProxyPipe{}.Skip(context.New(config.Project{})))
   189  	})
   190  
   191  	t.Run("skip snapshot", func(t *testing.T) {
   192  		ctx := context.New(config.Project{
   193  			GoMod: config.GoMod{
   194  				Proxy: true,
   195  			},
   196  		})
   197  		ctx.ModulePath = "github.com/triarius/goreleaser"
   198  		ctx.Snapshot = true
   199  		require.True(t, ProxyPipe{}.Skip(ctx))
   200  	})
   201  
   202  	t.Run("skip not a go module", func(t *testing.T) {
   203  		ctx := context.New(config.Project{
   204  			GoMod: config.GoMod{
   205  				Proxy: true,
   206  			},
   207  		})
   208  		ctx.ModulePath = ""
   209  		require.True(t, ProxyPipe{}.Skip(ctx))
   210  	})
   211  
   212  	t.Run("dont skip", func(t *testing.T) {
   213  		ctx := context.New(config.Project{
   214  			GoMod: config.GoMod{
   215  				Proxy: true,
   216  			},
   217  		})
   218  		ctx.ModulePath = "github.com/triarius/goreleaser"
   219  		require.False(t, ProxyPipe{}.Skip(ctx))
   220  	})
   221  }
   222  
   223  func requireGoMod(tb testing.TB, module, version string) {
   224  	tb.Helper()
   225  
   226  	mod, err := os.ReadFile("dist/proxy/foo/go.mod")
   227  	require.NoError(tb, err)
   228  	require.Contains(tb, string(mod), fmt.Sprintf(`module foo
   229  
   230  go 1.19
   231  
   232  require %s %s
   233  `, module, version))
   234  }
   235  
   236  func requireMainGo(tb testing.TB, module string) {
   237  	tb.Helper()
   238  
   239  	main, err := os.ReadFile("dist/proxy/foo/main.go")
   240  	require.NoError(tb, err)
   241  	require.Equal(tb, fmt.Sprintf(`
   242  // +build main
   243  package main
   244  
   245  import _ "%s"
   246  `, module), string(main))
   247  }
   248  
   249  func fakeGoModAndSum(tb testing.TB, module string) {
   250  	tb.Helper()
   251  
   252  	fakeGoMod(tb, module)
   253  	require.NoError(tb, os.WriteFile("go.sum", []byte("\n"), 0o666))
   254  }
   255  
   256  func fakeGoMod(tb testing.TB, module string) {
   257  	tb.Helper()
   258  	require.NoError(tb, os.WriteFile("go.mod", []byte(fmt.Sprintf("module %s\n", module)), 0o666))
   259  }