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