github.com/jasei/goreleaser@v0.62.4-0.20180312171904-62cb6a8963a6/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  	"sync"
    10  	"testing"
    11  
    12  	"github.com/goreleaser/goreleaser/config"
    13  	"github.com/goreleaser/goreleaser/context"
    14  	"github.com/goreleaser/goreleaser/internal/artifact"
    15  	"github.com/goreleaser/goreleaser/internal/testlib"
    16  	"github.com/stretchr/testify/assert"
    17  )
    18  
    19  func TestPipeDescription(t *testing.T) {
    20  	assert.NotEmpty(t, Pipe{}.String())
    21  }
    22  
    23  func TestRunPipe(t *testing.T) {
    24  	folder, err := ioutil.TempDir("", "goreleasertest")
    25  	assert.NoError(t, err)
    26  	tarfile, err := os.Create(filepath.Join(folder, "bin.tar.gz"))
    27  	assert.NoError(t, err)
    28  	debfile, err := os.Create(filepath.Join(folder, "bin.deb"))
    29  	assert.NoError(t, err)
    30  	var config = config.Project{
    31  		Dist: folder,
    32  		Release: config.Release{
    33  			GitHub: config.Repo{
    34  				Owner: "test",
    35  				Name:  "test",
    36  			},
    37  		},
    38  	}
    39  	var ctx = context.New(config)
    40  	ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"}
    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  	client := &DummyClient{
    71  		FailToCreateRelease: true,
    72  	}
    73  	assert.Error(t, doRun(ctx, client))
    74  	assert.False(t, client.CreatedRelease)
    75  	assert.False(t, client.UploadedFile)
    76  }
    77  
    78  func TestRunPipeWithFileThatDontExist(t *testing.T) {
    79  	var config = config.Project{
    80  		Release: config.Release{
    81  			GitHub: config.Repo{
    82  				Owner: "test",
    83  				Name:  "test",
    84  			},
    85  		},
    86  	}
    87  	var ctx = context.New(config)
    88  	ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"}
    89  	ctx.Artifacts.Add(artifact.Artifact{
    90  		Type: artifact.UploadableArchive,
    91  		Name: "bin.tar.gz",
    92  		Path: "/nope/nope/nope",
    93  	})
    94  	client := &DummyClient{}
    95  	assert.Error(t, doRun(ctx, client))
    96  	assert.True(t, client.CreatedRelease)
    97  	assert.False(t, client.UploadedFile)
    98  }
    99  
   100  func TestRunPipeUploadFailure(t *testing.T) {
   101  	folder, err := ioutil.TempDir("", "goreleasertest")
   102  	assert.NoError(t, err)
   103  	tarfile, err := os.Create(filepath.Join(folder, "bin.tar.gz"))
   104  	assert.NoError(t, err)
   105  	var config = config.Project{
   106  		Release: config.Release{
   107  			GitHub: config.Repo{
   108  				Owner: "test",
   109  				Name:  "test",
   110  			},
   111  		},
   112  	}
   113  	var ctx = context.New(config)
   114  	ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"}
   115  	ctx.Artifacts.Add(artifact.Artifact{
   116  		Type: artifact.UploadableArchive,
   117  		Name: "bin.tar.gz",
   118  		Path: tarfile.Name(),
   119  	})
   120  	client := &DummyClient{
   121  		FailToUpload: true,
   122  	}
   123  	assert.Error(t, doRun(ctx, client))
   124  	assert.True(t, client.CreatedRelease)
   125  	assert.False(t, client.UploadedFile)
   126  }
   127  
   128  func TestSnapshot(t *testing.T) {
   129  	var ctx = &context.Context{
   130  		SkipPublish: true,
   131  		Parallelism: 1,
   132  	}
   133  	client := &DummyClient{}
   134  	testlib.AssertSkipped(t, doRun(ctx, client))
   135  	assert.False(t, client.CreatedRelease)
   136  	assert.False(t, client.UploadedFile)
   137  }
   138  
   139  func TestDefault(t *testing.T) {
   140  	_, back := testlib.Mktmp(t)
   141  	defer back()
   142  	testlib.GitInit(t)
   143  	testlib.GitRemoteAdd(t, "git@github.com:goreleaser/goreleaser.git")
   144  
   145  	var ctx = &context.Context{
   146  		Config: config.Project{},
   147  	}
   148  	assert.NoError(t, Pipe{}.Default(ctx))
   149  	assert.Equal(t, "goreleaser", ctx.Config.Release.GitHub.Name)
   150  	assert.Equal(t, "goreleaser", ctx.Config.Release.GitHub.Owner)
   151  }
   152  
   153  func TestDefaultFilled(t *testing.T) {
   154  	_, back := testlib.Mktmp(t)
   155  	defer back()
   156  	testlib.GitInit(t)
   157  	testlib.GitRemoteAdd(t, "git@github.com:goreleaser/goreleaser.git")
   158  
   159  	var ctx = &context.Context{
   160  		Config: config.Project{
   161  			Release: config.Release{
   162  				GitHub: config.Repo{
   163  					Name:  "foo",
   164  					Owner: "bar",
   165  				},
   166  			},
   167  		},
   168  	}
   169  	assert.NoError(t, Pipe{}.Default(ctx))
   170  	assert.Equal(t, "foo", ctx.Config.Release.GitHub.Name)
   171  	assert.Equal(t, "bar", ctx.Config.Release.GitHub.Owner)
   172  }
   173  
   174  func TestDefaultNotAGitRepo(t *testing.T) {
   175  	_, back := testlib.Mktmp(t)
   176  	defer back()
   177  	var ctx = &context.Context{
   178  		Config: config.Project{},
   179  	}
   180  	assert.EqualError(t, Pipe{}.Default(ctx), "current folder is not a git repository")
   181  	assert.Empty(t, ctx.Config.Release.GitHub.String())
   182  }
   183  
   184  func TestDefaultGitRepoWithoutOrigin(t *testing.T) {
   185  	_, back := testlib.Mktmp(t)
   186  	defer back()
   187  	var ctx = &context.Context{
   188  		Config: config.Project{},
   189  	}
   190  	testlib.GitInit(t)
   191  	assert.EqualError(t, Pipe{}.Default(ctx), "repository doesn't have an `origin` remote")
   192  	assert.Empty(t, ctx.Config.Release.GitHub.String())
   193  }
   194  
   195  func TestDefaultNotAGitRepoSnapshot(t *testing.T) {
   196  	_, back := testlib.Mktmp(t)
   197  	defer back()
   198  	var ctx = &context.Context{
   199  		Config: config.Project{},
   200  	}
   201  	ctx.Snapshot = true
   202  	assert.NoError(t, Pipe{}.Default(ctx))
   203  	assert.Empty(t, ctx.Config.Release.GitHub.String())
   204  }
   205  
   206  func TestDefaultGitRepoWithoutRemote(t *testing.T) {
   207  	_, back := testlib.Mktmp(t)
   208  	defer back()
   209  	var ctx = &context.Context{
   210  		Config: config.Project{},
   211  	}
   212  	assert.Error(t, Pipe{}.Default(ctx))
   213  	assert.Empty(t, ctx.Config.Release.GitHub.String())
   214  }
   215  
   216  type DummyClient struct {
   217  	FailToCreateRelease bool
   218  	FailToUpload        bool
   219  	CreatedRelease      bool
   220  	UploadedFile        bool
   221  	UploadedFileNames   []string
   222  	Lock                sync.Mutex
   223  }
   224  
   225  func (client *DummyClient) CreateRelease(ctx *context.Context, body string) (releaseID int64, err error) {
   226  	if client.FailToCreateRelease {
   227  		return 0, errors.New("release failed")
   228  	}
   229  	client.CreatedRelease = true
   230  	return
   231  }
   232  
   233  func (client *DummyClient) CreateFile(ctx *context.Context, commitAuthor config.CommitAuthor, repo config.Repo, content bytes.Buffer, path, msg string) (err error) {
   234  	return
   235  }
   236  
   237  func (client *DummyClient) Upload(ctx *context.Context, releaseID int64, name string, file *os.File) (err error) {
   238  	client.Lock.Lock()
   239  	defer client.Lock.Unlock()
   240  	if client.FailToUpload {
   241  		return errors.New("upload failed")
   242  	}
   243  	client.UploadedFile = true
   244  	client.UploadedFileNames = append(client.UploadedFileNames, name)
   245  	return
   246  }