gitee.com/mirrors_opencollective/goreleaser@v0.45.0/pipeline/release/release_test.go (about)

     1  package release
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  	"testing"
    10  
    11  	"github.com/goreleaser/goreleaser/config"
    12  	"github.com/goreleaser/goreleaser/context"
    13  	"github.com/goreleaser/goreleaser/internal/artifact"
    14  	"github.com/goreleaser/goreleaser/internal/testlib"
    15  	"github.com/stretchr/testify/assert"
    16  )
    17  
    18  func TestPipeDescription(t *testing.T) {
    19  	assert.NotEmpty(t, Pipe{}.String())
    20  }
    21  
    22  func TestRunPipe(t *testing.T) {
    23  	folder, err := ioutil.TempDir("", "goreleasertest")
    24  	assert.NoError(t, err)
    25  	tarfile, err := os.Create(filepath.Join(folder, "bin.tar.gz"))
    26  	assert.NoError(t, err)
    27  	debfile, err := os.Create(filepath.Join(folder, "bin.deb"))
    28  	assert.NoError(t, err)
    29  	var config = config.Project{
    30  		Dist: folder,
    31  		Release: config.Release{
    32  			GitHub: config.Repo{
    33  				Owner: "test",
    34  				Name:  "test",
    35  			},
    36  		},
    37  	}
    38  	var ctx = context.New(config)
    39  	ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"}
    40  	ctx.Publish = true
    41  	ctx.Artifacts.Add(artifact.Artifact{
    42  		Type: artifact.UploadableArchive,
    43  		Name: "bin.tar.gz",
    44  		Path: tarfile.Name(),
    45  	})
    46  	ctx.Artifacts.Add(artifact.Artifact{
    47  		Type: artifact.LinuxPackage,
    48  		Name: "bin.deb",
    49  		Path: debfile.Name(),
    50  	})
    51  	client := &DummyClient{}
    52  	assert.NoError(t, doRun(ctx, client))
    53  	assert.True(t, client.CreatedRelease)
    54  	assert.True(t, client.UploadedFile)
    55  	assert.Contains(t, client.UploadedFileNames, "bin.deb")
    56  	assert.Contains(t, client.UploadedFileNames, "bin.tar.gz")
    57  }
    58  
    59  func TestRunPipeReleaseCreationFailed(t *testing.T) {
    60  	var config = config.Project{
    61  		Release: config.Release{
    62  			GitHub: config.Repo{
    63  				Owner: "test",
    64  				Name:  "test",
    65  			},
    66  		},
    67  	}
    68  	var ctx = context.New(config)
    69  	ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"}
    70  	ctx.Publish = true
    71  	client := &DummyClient{
    72  		FailToCreateRelease: true,
    73  	}
    74  	assert.Error(t, doRun(ctx, client))
    75  	assert.False(t, client.CreatedRelease)
    76  	assert.False(t, client.UploadedFile)
    77  }
    78  
    79  func TestRunPipeWithFileThatDontExist(t *testing.T) {
    80  	var config = config.Project{
    81  		Release: config.Release{
    82  			GitHub: config.Repo{
    83  				Owner: "test",
    84  				Name:  "test",
    85  			},
    86  		},
    87  	}
    88  	var ctx = context.New(config)
    89  	ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"}
    90  	ctx.Publish = true
    91  	ctx.Artifacts.Add(artifact.Artifact{
    92  		Type: artifact.UploadableArchive,
    93  		Name: "bin.tar.gz",
    94  		Path: "/nope/nope/nope",
    95  	})
    96  	client := &DummyClient{}
    97  	assert.Error(t, doRun(ctx, client))
    98  	assert.True(t, client.CreatedRelease)
    99  	assert.False(t, client.UploadedFile)
   100  }
   101  
   102  func TestRunPipeUploadFailure(t *testing.T) {
   103  	folder, err := ioutil.TempDir("", "goreleasertest")
   104  	assert.NoError(t, err)
   105  	tarfile, err := os.Create(filepath.Join(folder, "bin.tar.gz"))
   106  	assert.NoError(t, err)
   107  	var config = config.Project{
   108  		Release: config.Release{
   109  			GitHub: config.Repo{
   110  				Owner: "test",
   111  				Name:  "test",
   112  			},
   113  		},
   114  	}
   115  	var ctx = context.New(config)
   116  	ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"}
   117  	ctx.Publish = true
   118  	ctx.Artifacts.Add(artifact.Artifact{
   119  		Type: artifact.UploadableArchive,
   120  		Name: "bin.tar.gz",
   121  		Path: tarfile.Name(),
   122  	})
   123  	client := &DummyClient{
   124  		FailToUpload: true,
   125  	}
   126  	assert.Error(t, doRun(ctx, client))
   127  	assert.True(t, client.CreatedRelease)
   128  	assert.False(t, client.UploadedFile)
   129  }
   130  
   131  func TestSkipPublish(t *testing.T) {
   132  	var ctx = &context.Context{
   133  		Publish:     false,
   134  		Parallelism: 1,
   135  	}
   136  	client := &DummyClient{}
   137  	testlib.AssertSkipped(t, doRun(ctx, client))
   138  	assert.False(t, client.CreatedRelease)
   139  	assert.False(t, client.UploadedFile)
   140  }
   141  
   142  func TestDefault(t *testing.T) {
   143  	_, back := testlib.Mktmp(t)
   144  	defer back()
   145  	testlib.GitInit(t)
   146  	testlib.GitRemoteAdd(t, "git@github.com:goreleaser/goreleaser.git")
   147  
   148  	var ctx = &context.Context{
   149  		Config: config.Project{},
   150  	}
   151  	assert.NoError(t, Pipe{}.Default(ctx))
   152  	assert.Equal(t, "goreleaser", ctx.Config.Release.GitHub.Name)
   153  	assert.Equal(t, "goreleaser", ctx.Config.Release.GitHub.Owner)
   154  }
   155  
   156  func TestDefaultFilled(t *testing.T) {
   157  	_, back := testlib.Mktmp(t)
   158  	defer back()
   159  	testlib.GitInit(t)
   160  	testlib.GitRemoteAdd(t, "git@github.com:goreleaser/goreleaser.git")
   161  
   162  	var ctx = &context.Context{
   163  		Config: config.Project{
   164  			Release: config.Release{
   165  				GitHub: config.Repo{
   166  					Name:  "foo",
   167  					Owner: "bar",
   168  				},
   169  			},
   170  		},
   171  	}
   172  	assert.NoError(t, Pipe{}.Default(ctx))
   173  	assert.Equal(t, "foo", ctx.Config.Release.GitHub.Name)
   174  	assert.Equal(t, "bar", ctx.Config.Release.GitHub.Owner)
   175  }
   176  
   177  func TestDefaultNotAGitRepo(t *testing.T) {
   178  	_, back := testlib.Mktmp(t)
   179  	defer back()
   180  	testlib.GitInit(t)
   181  	var ctx = &context.Context{
   182  		Config: config.Project{},
   183  	}
   184  	assert.Error(t, Pipe{}.Default(ctx))
   185  	assert.Empty(t, ctx.Config.Release.GitHub.String())
   186  }
   187  
   188  func TestDefaultGitRepoWithoutRemote(t *testing.T) {
   189  	_, back := testlib.Mktmp(t)
   190  	defer back()
   191  	var ctx = &context.Context{
   192  		Config: config.Project{},
   193  	}
   194  	assert.Error(t, Pipe{}.Default(ctx))
   195  	assert.Empty(t, ctx.Config.Release.GitHub.String())
   196  }
   197  
   198  type DummyClient struct {
   199  	FailToCreateRelease bool
   200  	FailToUpload        bool
   201  	CreatedRelease      bool
   202  	UploadedFile        bool
   203  	UploadedFileNames   []string
   204  }
   205  
   206  func (client *DummyClient) CreateRelease(ctx *context.Context, body string) (releaseID int, err error) {
   207  	if client.FailToCreateRelease {
   208  		return 0, errors.New("release failed")
   209  	}
   210  	client.CreatedRelease = true
   211  	return
   212  }
   213  
   214  func (client *DummyClient) CreateFile(ctx *context.Context, content bytes.Buffer, path string) (err error) {
   215  	return
   216  }
   217  
   218  func (client *DummyClient) Upload(ctx *context.Context, releaseID int, name string, file *os.File) (err error) {
   219  	if client.FailToUpload {
   220  		return errors.New("upload failed")
   221  	}
   222  	client.UploadedFile = true
   223  	client.UploadedFileNames = append(client.UploadedFileNames, name)
   224  	return
   225  }