github.com/windmeup/goreleaser@v1.21.95/internal/pipe/release/release_test.go (about)

     1  package release
     2  
     3  import (
     4  	"os"
     5  	"path/filepath"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/require"
    10  	"github.com/windmeup/goreleaser/internal/artifact"
    11  	"github.com/windmeup/goreleaser/internal/client"
    12  	"github.com/windmeup/goreleaser/internal/testctx"
    13  	"github.com/windmeup/goreleaser/internal/testlib"
    14  	"github.com/windmeup/goreleaser/pkg/config"
    15  	"github.com/windmeup/goreleaser/pkg/context"
    16  )
    17  
    18  func TestPipeDescription(t *testing.T) {
    19  	require.NotEmpty(t, Pipe{}.String())
    20  }
    21  
    22  func createTmpFile(tb testing.TB, folder, path string) string {
    23  	tb.Helper()
    24  	f, err := os.Create(filepath.Join(folder, path))
    25  	require.NoError(tb, err)
    26  	require.NoError(tb, f.Close())
    27  	return f.Name()
    28  }
    29  
    30  func TestRunPipeWithoutIDsThenDoesNotFilter(t *testing.T) {
    31  	folder := t.TempDir()
    32  	tarfile := createTmpFile(t, folder, "bin.tar.gz")
    33  	srcfile := createTmpFile(t, folder, "source.tar.gz")
    34  	debfile := createTmpFile(t, folder, "bin.deb")
    35  	checksumfile := createTmpFile(t, folder, "checksum")
    36  	checksumsigfile := createTmpFile(t, folder, "checksum.sig")
    37  	checksumpemfile := createTmpFile(t, folder, "checksum.pem")
    38  	filteredtarfile := createTmpFile(t, folder, "filtered.tar.gz")
    39  	filtereddebfile := createTmpFile(t, folder, "filtered.deb")
    40  
    41  	config := config.Project{
    42  		Dist: folder,
    43  		Release: config.Release{
    44  			GitHub: config.Repo{
    45  				Owner: "test",
    46  				Name:  "test",
    47  			},
    48  		},
    49  	}
    50  	ctx := testctx.NewWithCfg(config, testctx.WithCurrentTag("v1.0.0"))
    51  	ctx.Artifacts.Add(&artifact.Artifact{
    52  		Type: artifact.UploadableArchive,
    53  		Name: "bin.tar.gz",
    54  		Path: tarfile,
    55  		Extra: map[string]interface{}{
    56  			artifact.ExtraID: "foo",
    57  		},
    58  	})
    59  	ctx.Artifacts.Add(&artifact.Artifact{
    60  		Type: artifact.LinuxPackage,
    61  		Name: "bin.deb",
    62  		Path: debfile,
    63  		Extra: map[string]interface{}{
    64  			artifact.ExtraID: "foo",
    65  		},
    66  	})
    67  	ctx.Artifacts.Add(&artifact.Artifact{
    68  		Type: artifact.UploadableArchive,
    69  		Name: "filtered.tar.gz",
    70  		Path: filteredtarfile,
    71  		Extra: map[string]interface{}{
    72  			artifact.ExtraID: "bar",
    73  		},
    74  	})
    75  	ctx.Artifacts.Add(&artifact.Artifact{
    76  		Type: artifact.LinuxPackage,
    77  		Name: "filtered.deb",
    78  		Path: filtereddebfile,
    79  		Extra: map[string]interface{}{
    80  			artifact.ExtraID: "bar",
    81  		},
    82  	})
    83  	ctx.Artifacts.Add(&artifact.Artifact{
    84  		Type: artifact.UploadableSourceArchive,
    85  		Name: "source.tar.gz",
    86  		Path: srcfile,
    87  		Extra: map[string]interface{}{
    88  			artifact.ExtraFormat: "tar.gz",
    89  		},
    90  	})
    91  
    92  	ctx.Artifacts.Add(&artifact.Artifact{
    93  		Type: artifact.Checksum,
    94  		Name: "checksum",
    95  		Path: checksumfile,
    96  		Extra: map[string]interface{}{
    97  			artifact.ExtraID: "bar",
    98  		},
    99  	})
   100  	ctx.Artifacts.Add(&artifact.Artifact{
   101  		Type: artifact.Signature,
   102  		Name: "checksum.sig",
   103  		Path: checksumsigfile,
   104  		Extra: map[string]interface{}{
   105  			artifact.ExtraID: "bar",
   106  		},
   107  	})
   108  	ctx.Artifacts.Add(&artifact.Artifact{
   109  		Type: artifact.Certificate,
   110  		Name: "checksum.pem",
   111  		Path: checksumpemfile,
   112  		Extra: map[string]interface{}{
   113  			artifact.ExtraID: "bar",
   114  		},
   115  	})
   116  	client := &client.Mock{}
   117  	require.NoError(t, doPublish(ctx, client))
   118  	require.True(t, client.CreatedRelease)
   119  	require.True(t, client.UploadedFile)
   120  	require.Contains(t, client.UploadedFileNames, "source.tar.gz")
   121  	require.Contains(t, client.UploadedFileNames, "bin.deb")
   122  	require.Contains(t, client.UploadedFileNames, "bin.tar.gz")
   123  	require.Contains(t, client.UploadedFileNames, "filtered.deb")
   124  	require.Contains(t, client.UploadedFileNames, "filtered.tar.gz")
   125  	require.Contains(t, client.UploadedFileNames, "checksum")
   126  	require.Contains(t, client.UploadedFileNames, "checksum.pem")
   127  	require.Contains(t, client.UploadedFileNames, "checksum.sig")
   128  }
   129  
   130  func TestRunPipeWithIDsThenFilters(t *testing.T) {
   131  	folder := t.TempDir()
   132  	tarfile, err := os.Create(filepath.Join(folder, "bin.tar.gz"))
   133  	require.NoError(t, err)
   134  	require.NoError(t, tarfile.Close())
   135  	debfile, err := os.Create(filepath.Join(folder, "bin.deb"))
   136  	require.NoError(t, err)
   137  	require.NoError(t, debfile.Close())
   138  	filteredtarfile, err := os.Create(filepath.Join(folder, "filtered.tar.gz"))
   139  	require.NoError(t, err)
   140  	require.NoError(t, filteredtarfile.Close())
   141  	filtereddebfile, err := os.Create(filepath.Join(folder, "filtered.deb"))
   142  	require.NoError(t, err)
   143  	require.NoError(t, filtereddebfile.Close())
   144  
   145  	config := config.Project{
   146  		Dist: folder,
   147  		Release: config.Release{
   148  			GitHub: config.Repo{
   149  				Owner: "test",
   150  				Name:  "test",
   151  			},
   152  			IDs: []string{"foo"},
   153  			ExtraFiles: []config.ExtraFile{
   154  				{Glob: "./testdata/**/*"},
   155  			},
   156  		},
   157  	}
   158  	ctx := testctx.NewWithCfg(config, testctx.WithCurrentTag("v1.0.0"))
   159  	ctx.Artifacts.Add(&artifact.Artifact{
   160  		Type: artifact.UploadableArchive,
   161  		Name: "bin.tar.gz",
   162  		Path: tarfile.Name(),
   163  		Extra: map[string]interface{}{
   164  			artifact.ExtraID: "foo",
   165  		},
   166  	})
   167  	ctx.Artifacts.Add(&artifact.Artifact{
   168  		Type: artifact.LinuxPackage,
   169  		Name: "bin.deb",
   170  		Path: debfile.Name(),
   171  		Extra: map[string]interface{}{
   172  			artifact.ExtraID: "foo",
   173  		},
   174  	})
   175  	ctx.Artifacts.Add(&artifact.Artifact{
   176  		Type: artifact.UploadableArchive,
   177  		Name: "filtered.tar.gz",
   178  		Path: filteredtarfile.Name(),
   179  		Extra: map[string]interface{}{
   180  			artifact.ExtraID: "bar",
   181  		},
   182  	})
   183  	ctx.Artifacts.Add(&artifact.Artifact{
   184  		Type: artifact.LinuxPackage,
   185  		Name: "filtered.deb",
   186  		Path: filtereddebfile.Name(),
   187  		Extra: map[string]interface{}{
   188  			artifact.ExtraID: "bar",
   189  		},
   190  	})
   191  	client := &client.Mock{}
   192  	require.NoError(t, doPublish(ctx, client))
   193  	require.True(t, client.CreatedRelease)
   194  	require.True(t, client.UploadedFile)
   195  	require.Contains(t, client.UploadedFileNames, "bin.deb")
   196  	require.Contains(t, client.UploadedFileNames, "bin.tar.gz")
   197  	require.Contains(t, client.UploadedFileNames, "f1")
   198  	require.NotContains(t, client.UploadedFileNames, "filtered.deb")
   199  	require.NotContains(t, client.UploadedFileNames, "filtered.tar.gz")
   200  }
   201  
   202  func TestRunPipeReleaseCreationFailed(t *testing.T) {
   203  	config := config.Project{
   204  		Release: config.Release{
   205  			GitHub: config.Repo{
   206  				Owner: "test",
   207  				Name:  "test",
   208  			},
   209  		},
   210  	}
   211  	ctx := testctx.NewWithCfg(config, testctx.WithCurrentTag("v1.0.0"))
   212  	client := &client.Mock{
   213  		FailToCreateRelease: true,
   214  	}
   215  	require.Error(t, doPublish(ctx, client))
   216  	require.False(t, client.CreatedRelease)
   217  	require.False(t, client.UploadedFile)
   218  }
   219  
   220  func TestRunPipeWithFileThatDontExist(t *testing.T) {
   221  	config := config.Project{
   222  		Release: config.Release{
   223  			GitHub: config.Repo{
   224  				Owner: "test",
   225  				Name:  "test",
   226  			},
   227  		},
   228  	}
   229  	ctx := testctx.NewWithCfg(config, testctx.WithCurrentTag("v1.0.0"))
   230  	ctx.Artifacts.Add(&artifact.Artifact{
   231  		Type: artifact.UploadableArchive,
   232  		Name: "bin.tar.gz",
   233  		Path: "/nope/nope/nope",
   234  	})
   235  	client := &client.Mock{}
   236  	require.Error(t, doPublish(ctx, client))
   237  	require.True(t, client.CreatedRelease)
   238  	require.False(t, client.UploadedFile)
   239  }
   240  
   241  func TestRunPipeUploadFailure(t *testing.T) {
   242  	folder := t.TempDir()
   243  	tarfile, err := os.Create(filepath.Join(folder, "bin.tar.gz"))
   244  	require.NoError(t, err)
   245  	config := config.Project{
   246  		Release: config.Release{
   247  			GitHub: config.Repo{
   248  				Owner: "test",
   249  				Name:  "test",
   250  			},
   251  		},
   252  	}
   253  	ctx := testctx.NewWithCfg(config, testctx.WithCurrentTag("v1.0.0"))
   254  	ctx.Artifacts.Add(&artifact.Artifact{
   255  		Type: artifact.UploadableArchive,
   256  		Name: "bin.tar.gz",
   257  		Path: tarfile.Name(),
   258  	})
   259  	client := &client.Mock{
   260  		FailToUpload: true,
   261  	}
   262  	require.EqualError(t, doPublish(ctx, client), "failed to upload bin.tar.gz after 1 tries: upload failed")
   263  	require.True(t, client.CreatedRelease)
   264  	require.False(t, client.UploadedFile)
   265  }
   266  
   267  func TestRunPipeExtraFileNotFound(t *testing.T) {
   268  	config := config.Project{
   269  		Release: config.Release{
   270  			GitHub: config.Repo{
   271  				Owner: "test",
   272  				Name:  "test",
   273  			},
   274  			ExtraFiles: []config.ExtraFile{
   275  				{Glob: "./testdata/f1.txt"},
   276  				{Glob: "./nope"},
   277  			},
   278  		},
   279  	}
   280  	ctx := testctx.NewWithCfg(config, testctx.WithCurrentTag("v1.0.0"))
   281  	client := &client.Mock{}
   282  	require.EqualError(t, doPublish(ctx, client), "globbing failed for pattern ./nope: matching \"./nope\": file does not exist")
   283  	require.True(t, client.CreatedRelease)
   284  	require.False(t, client.UploadedFile)
   285  }
   286  
   287  func TestRunPipeExtraOverride(t *testing.T) {
   288  	config := config.Project{
   289  		Release: config.Release{
   290  			GitHub: config.Repo{
   291  				Owner: "test",
   292  				Name:  "test",
   293  			},
   294  			ExtraFiles: []config.ExtraFile{
   295  				{Glob: "./testdata/**/*"},
   296  				{Glob: "./testdata/upload_same_name/f1"},
   297  			},
   298  		},
   299  	}
   300  	ctx := testctx.NewWithCfg(config, testctx.WithCurrentTag("v1.0.0"))
   301  	client := &client.Mock{}
   302  	require.NoError(t, doPublish(ctx, client))
   303  	require.True(t, client.CreatedRelease)
   304  	require.True(t, client.UploadedFile)
   305  	require.Contains(t, client.UploadedFileNames, "f1")
   306  	require.True(t, strings.HasSuffix(client.UploadedFilePaths["f1"], "testdata/upload_same_name/f1"))
   307  }
   308  
   309  func TestRunPipeUploadRetry(t *testing.T) {
   310  	folder := t.TempDir()
   311  	tarfile, err := os.Create(filepath.Join(folder, "bin.tar.gz"))
   312  	require.NoError(t, err)
   313  	config := config.Project{
   314  		Release: config.Release{
   315  			GitHub: config.Repo{
   316  				Owner: "test",
   317  				Name:  "test",
   318  			},
   319  		},
   320  	}
   321  	ctx := testctx.NewWithCfg(config, testctx.WithCurrentTag("v1.0.0"))
   322  	ctx.Artifacts.Add(&artifact.Artifact{
   323  		Type: artifact.UploadableArchive,
   324  		Name: "bin.tar.gz",
   325  		Path: tarfile.Name(),
   326  	})
   327  	client := &client.Mock{
   328  		FailFirstUpload: true,
   329  	}
   330  	require.NoError(t, doPublish(ctx, client))
   331  	require.True(t, client.CreatedRelease)
   332  	require.True(t, client.UploadedFile)
   333  }
   334  
   335  func TestDefault(t *testing.T) {
   336  	testlib.Mktmp(t)
   337  	testlib.GitInit(t)
   338  	testlib.GitRemoteAdd(t, "git@github.com:goreleaser/goreleaser.git")
   339  
   340  	ctx := testctx.NewWithCfg(
   341  		config.Project{
   342  			GitHubURLs: config.GitHubURLs{
   343  				Download: "https://github.com",
   344  			},
   345  		},
   346  		testctx.GitHubTokenType,
   347  		testctx.WithCurrentTag("v1.0.0"),
   348  	)
   349  	require.NoError(t, Pipe{}.Default(ctx))
   350  	require.Equal(t, "goreleaser", ctx.Config.Release.GitHub.Name)
   351  	require.Equal(t, "goreleaser", ctx.Config.Release.GitHub.Owner)
   352  	require.Equal(t, "https://github.com/windmeup/goreleaser/releases/tag/v1.0.0", ctx.ReleaseURL)
   353  }
   354  
   355  func TestDefaultInvalidURL(t *testing.T) {
   356  	testlib.Mktmp(t)
   357  	testlib.GitInit(t)
   358  	testlib.GitRemoteAdd(t, "git@github.com:goreleaser.git")
   359  	ctx := testctx.NewWithCfg(
   360  		config.Project{
   361  			GitHubURLs: config.GitHubURLs{
   362  				Download: "https://github.com",
   363  			},
   364  		},
   365  		testctx.GitHubTokenType,
   366  		testctx.WithCurrentTag("v1.0.0"),
   367  	)
   368  	require.Error(t, Pipe{}.Default(ctx))
   369  }
   370  
   371  func TestDefaultWithGitlab(t *testing.T) {
   372  	testlib.Mktmp(t)
   373  	testlib.GitInit(t)
   374  	testlib.GitRemoteAdd(t, "git@gitlab.com:gitlabowner/gitlabrepo.git")
   375  
   376  	ctx := testctx.NewWithCfg(
   377  		config.Project{
   378  			GitLabURLs: config.GitLabURLs{
   379  				Download: "https://gitlab.com",
   380  			},
   381  		},
   382  		testctx.GitLabTokenType,
   383  		testctx.WithCurrentTag("v1.0.0"),
   384  	)
   385  	require.NoError(t, Pipe{}.Default(ctx))
   386  	require.Equal(t, "gitlabrepo", ctx.Config.Release.GitLab.Name)
   387  	require.Equal(t, "gitlabowner", ctx.Config.Release.GitLab.Owner)
   388  	require.Equal(t, "https://gitlab.com/gitlabowner/gitlabrepo/-/releases/v1.0.0", ctx.ReleaseURL)
   389  }
   390  
   391  func TestDefaultWithGitlabInvalidURL(t *testing.T) {
   392  	testlib.Mktmp(t)
   393  	testlib.GitInit(t)
   394  	testlib.GitRemoteAdd(t, "git@gitlab.com:gitlabrepo.git")
   395  	ctx := testctx.NewWithCfg(
   396  		config.Project{
   397  			GitLabURLs: config.GitLabURLs{
   398  				Download: "https://gitlab.com",
   399  			},
   400  		},
   401  		testctx.GiteaTokenType,
   402  		testctx.WithCurrentTag("v1.0.0"),
   403  	)
   404  	require.Error(t, Pipe{}.Default(ctx))
   405  }
   406  
   407  func TestDefaultWithGitea(t *testing.T) {
   408  	testlib.Mktmp(t)
   409  	testlib.GitInit(t)
   410  	testlib.GitRemoteAdd(t, "git@gitea.example.com:giteaowner/gitearepo.git")
   411  
   412  	ctx := testctx.NewWithCfg(
   413  		config.Project{
   414  			GiteaURLs: config.GiteaURLs{
   415  				Download: "https://git.honk.com",
   416  			},
   417  		},
   418  		testctx.GiteaTokenType,
   419  		testctx.WithCurrentTag("v1.0.0"),
   420  	)
   421  	require.NoError(t, Pipe{}.Default(ctx))
   422  	require.Equal(t, "gitearepo", ctx.Config.Release.Gitea.Name)
   423  	require.Equal(t, "giteaowner", ctx.Config.Release.Gitea.Owner)
   424  	require.Equal(t, "https://git.honk.com/giteaowner/gitearepo/releases/tag/v1.0.0", ctx.ReleaseURL)
   425  }
   426  
   427  func TestDefaultWithGiteaInvalidURL(t *testing.T) {
   428  	testlib.Mktmp(t)
   429  	testlib.GitInit(t)
   430  	testlib.GitRemoteAdd(t, "git@gitea.example.com:gitearepo.git")
   431  	ctx := testctx.NewWithCfg(
   432  		config.Project{
   433  			GiteaURLs: config.GiteaURLs{
   434  				Download: "https://git.honk.com",
   435  			},
   436  		},
   437  		testctx.GiteaTokenType,
   438  		testctx.WithCurrentTag("v1.0.0"),
   439  	)
   440  	require.Error(t, Pipe{}.Default(ctx))
   441  }
   442  
   443  func TestDefaultPreRelease(t *testing.T) {
   444  	testlib.Mktmp(t)
   445  	testlib.GitInit(t)
   446  	testlib.GitRemoteAdd(t, "git@github.com:goreleaser/goreleaser.git")
   447  
   448  	t.Run("prerelease", func(t *testing.T) {
   449  		ctx := testctx.NewWithCfg(config.Project{
   450  			Release: config.Release{
   451  				Prerelease: "true",
   452  			},
   453  		})
   454  		ctx.TokenType = context.TokenTypeGitHub
   455  		ctx.Semver = context.Semver{
   456  			Major: 1,
   457  			Minor: 0,
   458  			Patch: 0,
   459  		}
   460  		require.NoError(t, Pipe{}.Default(ctx))
   461  		require.True(t, ctx.PreRelease)
   462  	})
   463  
   464  	t.Run("release", func(t *testing.T) {
   465  		ctx := testctx.NewWithCfg(config.Project{
   466  			Release: config.Release{},
   467  		})
   468  		ctx.TokenType = context.TokenTypeGitHub
   469  		ctx.Semver = context.Semver{
   470  			Major:      1,
   471  			Minor:      0,
   472  			Patch:      0,
   473  			Prerelease: "rc1",
   474  		}
   475  		require.NoError(t, Pipe{}.Default(ctx))
   476  		require.False(t, ctx.PreRelease)
   477  	})
   478  
   479  	t.Run("auto-release", func(t *testing.T) {
   480  		ctx := testctx.NewWithCfg(
   481  			config.Project{
   482  				Release: config.Release{
   483  					Prerelease: "auto",
   484  				},
   485  			},
   486  			testctx.GitHubTokenType,
   487  			testctx.WithSemver(1, 0, 0, ""),
   488  		)
   489  		require.NoError(t, Pipe{}.Default(ctx))
   490  		require.Equal(t, false, ctx.PreRelease)
   491  	})
   492  
   493  	t.Run("auto-rc", func(t *testing.T) {
   494  		ctx := testctx.NewWithCfg(
   495  			config.Project{
   496  				Release: config.Release{
   497  					Prerelease: "auto",
   498  				},
   499  			},
   500  			testctx.GitHubTokenType,
   501  			testctx.WithSemver(1, 0, 0, "rc1"),
   502  		)
   503  		require.NoError(t, Pipe{}.Default(ctx))
   504  		require.Equal(t, true, ctx.PreRelease)
   505  	})
   506  
   507  	t.Run("auto-rc-github-setup", func(t *testing.T) {
   508  		ctx := testctx.NewWithCfg(
   509  			config.Project{
   510  				Release: config.Release{
   511  					GitHub: config.Repo{
   512  						Name:  "foo",
   513  						Owner: "foo",
   514  					},
   515  					Prerelease: "auto",
   516  				},
   517  			},
   518  			testctx.GitHubTokenType,
   519  			testctx.WithSemver(1, 0, 0, "rc1"),
   520  		)
   521  		require.NoError(t, Pipe{}.Default(ctx))
   522  		require.Equal(t, true, ctx.PreRelease)
   523  	})
   524  }
   525  
   526  func TestDefaultPipeDisabled(t *testing.T) {
   527  	testlib.Mktmp(t)
   528  	testlib.GitInit(t)
   529  	testlib.GitRemoteAdd(t, "git@github.com:goreleaser/goreleaser.git")
   530  
   531  	ctx := testctx.NewWithCfg(config.Project{
   532  		Release: config.Release{
   533  			Disable: "true",
   534  		},
   535  	})
   536  	ctx.TokenType = context.TokenTypeGitHub
   537  	testlib.AssertSkipped(t, Pipe{}.Default(ctx))
   538  	require.Empty(t, ctx.Config.Release.GitHub.Name)
   539  	require.Empty(t, ctx.Config.Release.GitHub.Owner)
   540  }
   541  
   542  func TestDefaultFilled(t *testing.T) {
   543  	testlib.Mktmp(t)
   544  	testlib.GitInit(t)
   545  	testlib.GitRemoteAdd(t, "git@github.com:goreleaser/goreleaser.git")
   546  
   547  	ctx := testctx.NewWithCfg(config.Project{
   548  		Release: config.Release{
   549  			GitHub: config.Repo{
   550  				Name:  "foo",
   551  				Owner: "bar",
   552  			},
   553  		},
   554  	})
   555  	ctx.TokenType = context.TokenTypeGitHub
   556  	require.NoError(t, Pipe{}.Default(ctx))
   557  	require.Equal(t, "foo", ctx.Config.Release.GitHub.Name)
   558  	require.Equal(t, "bar", ctx.Config.Release.GitHub.Owner)
   559  }
   560  
   561  func TestDefaultNotAGitRepo(t *testing.T) {
   562  	testlib.Mktmp(t)
   563  	ctx := testctx.New(testctx.GitHubTokenType)
   564  	require.EqualError(t, Pipe{}.Default(ctx), "current folder is not a git repository")
   565  	require.Empty(t, ctx.Config.Release.GitHub.String())
   566  }
   567  
   568  func TestDefaultGitRepoWithoutOrigin(t *testing.T) {
   569  	testlib.Mktmp(t)
   570  	ctx := testctx.New(testctx.GitHubTokenType)
   571  	testlib.GitInit(t)
   572  	require.EqualError(t, Pipe{}.Default(ctx), "no remote configured to list refs from")
   573  	require.Empty(t, ctx.Config.Release.GitHub.String())
   574  }
   575  
   576  func TestDefaultNotAGitRepoSnapshot(t *testing.T) {
   577  	testlib.Mktmp(t)
   578  	ctx := testctx.New(testctx.GitHubTokenType, testctx.Snapshot)
   579  	require.NoError(t, Pipe{}.Default(ctx))
   580  	require.Empty(t, ctx.Config.Release.GitHub.String())
   581  }
   582  
   583  func TestDefaultGitRepoWithoutRemote(t *testing.T) {
   584  	testlib.Mktmp(t)
   585  	ctx := testctx.New(testctx.GitHubTokenType)
   586  	require.Error(t, Pipe{}.Default(ctx))
   587  	require.Empty(t, ctx.Config.Release.GitHub.String())
   588  }
   589  
   590  func TestDefaultMultipleReleasesDefined(t *testing.T) {
   591  	ctx := testctx.NewWithCfg(config.Project{
   592  		Release: config.Release{
   593  			GitHub: config.Repo{
   594  				Owner: "githubName",
   595  				Name:  "githubName",
   596  			},
   597  			GitLab: config.Repo{
   598  				Owner: "gitlabOwner",
   599  				Name:  "gitlabName",
   600  			},
   601  			Gitea: config.Repo{
   602  				Owner: "giteaOwner",
   603  				Name:  "giteaName",
   604  			},
   605  		},
   606  	})
   607  	require.EqualError(t, Pipe{}.Default(ctx), ErrMultipleReleases.Error())
   608  }
   609  
   610  func TestSkip(t *testing.T) {
   611  	t.Run("skip", func(t *testing.T) {
   612  		ctx := testctx.NewWithCfg(config.Project{
   613  			Release: config.Release{
   614  				Disable: "true",
   615  			},
   616  		})
   617  		b, err := Pipe{}.Skip(ctx)
   618  		require.NoError(t, err)
   619  		require.True(t, b)
   620  	})
   621  
   622  	t.Run("skip tmpl", func(t *testing.T) {
   623  		ctx := testctx.NewWithCfg(config.Project{
   624  			Env: []string{"FOO=true"},
   625  			Release: config.Release{
   626  				Disable: "{{ .Env.FOO }}",
   627  			},
   628  		})
   629  		b, err := Pipe{}.Skip(ctx)
   630  		require.NoError(t, err)
   631  		require.True(t, b)
   632  	})
   633  
   634  	t.Run("tmpl err", func(t *testing.T) {
   635  		ctx := testctx.NewWithCfg(config.Project{
   636  			Release: config.Release{
   637  				Disable: "{{ .Env.FOO }}",
   638  			},
   639  		})
   640  		_, err := Pipe{}.Skip(ctx)
   641  		require.Error(t, err)
   642  	})
   643  
   644  	t.Run("skip upload", func(t *testing.T) {
   645  		ctx := testctx.NewWithCfg(config.Project{
   646  			Env: []string{"FOO=true"},
   647  			Release: config.Release{
   648  				SkipUpload: "{{ .Env.FOO }}",
   649  			},
   650  		})
   651  		client := &client.Mock{}
   652  		testlib.AssertSkipped(t, doPublish(ctx, client))
   653  		require.True(t, client.CreatedRelease)
   654  		require.False(t, client.UploadedFile)
   655  	})
   656  
   657  	t.Run("skip upload tmpl", func(t *testing.T) {
   658  		ctx := testctx.NewWithCfg(config.Project{
   659  			Release: config.Release{
   660  				SkipUpload: "true",
   661  			},
   662  		})
   663  		client := &client.Mock{}
   664  		testlib.AssertSkipped(t, doPublish(ctx, client))
   665  		require.True(t, client.CreatedRelease)
   666  		require.False(t, client.UploadedFile)
   667  	})
   668  
   669  	t.Run("dont skip", func(t *testing.T) {
   670  		b, err := Pipe{}.Skip(testctx.New())
   671  		require.NoError(t, err)
   672  		require.False(t, b)
   673  	})
   674  }