github.com/szyn/goreleaser@v0.76.1-0.20180517112710-333da09a1297/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 TestPipeDisabled(t *testing.T) {
   140  	var ctx = context.New(config.Project{
   141  		Release: config.Release{
   142  			Disable: true,
   143  		},
   144  	})
   145  	client := &DummyClient{}
   146  	testlib.AssertSkipped(t, doRun(ctx, client))
   147  	assert.False(t, client.CreatedRelease)
   148  	assert.False(t, client.UploadedFile)
   149  }
   150  
   151  func TestDefault(t *testing.T) {
   152  	_, back := testlib.Mktmp(t)
   153  	defer back()
   154  	testlib.GitInit(t)
   155  	testlib.GitRemoteAdd(t, "git@github.com:goreleaser/goreleaser.git")
   156  
   157  	var ctx = context.New(config.Project{})
   158  	assert.NoError(t, Pipe{}.Default(ctx))
   159  	assert.Equal(t, "goreleaser", ctx.Config.Release.GitHub.Name)
   160  	assert.Equal(t, "goreleaser", ctx.Config.Release.GitHub.Owner)
   161  }
   162  
   163  func TestDefaultPipeDisabled(t *testing.T) {
   164  	_, back := testlib.Mktmp(t)
   165  	defer back()
   166  	testlib.GitInit(t)
   167  	testlib.GitRemoteAdd(t, "git@github.com:goreleaser/goreleaser.git")
   168  
   169  	var ctx = context.New(config.Project{
   170  		Release: config.Release{
   171  			Disable: true,
   172  		},
   173  	})
   174  	assert.NoError(t, Pipe{}.Default(ctx))
   175  	assert.Equal(t, "", ctx.Config.Release.GitHub.Name)
   176  	assert.Equal(t, "", ctx.Config.Release.GitHub.Owner)
   177  }
   178  
   179  func TestDefaultFilled(t *testing.T) {
   180  	_, back := testlib.Mktmp(t)
   181  	defer back()
   182  	testlib.GitInit(t)
   183  	testlib.GitRemoteAdd(t, "git@github.com:goreleaser/goreleaser.git")
   184  
   185  	var ctx = &context.Context{
   186  		Config: config.Project{
   187  			Release: config.Release{
   188  				GitHub: config.Repo{
   189  					Name:  "foo",
   190  					Owner: "bar",
   191  				},
   192  			},
   193  		},
   194  	}
   195  	assert.NoError(t, Pipe{}.Default(ctx))
   196  	assert.Equal(t, "foo", ctx.Config.Release.GitHub.Name)
   197  	assert.Equal(t, "bar", ctx.Config.Release.GitHub.Owner)
   198  }
   199  
   200  func TestDefaultNotAGitRepo(t *testing.T) {
   201  	_, back := testlib.Mktmp(t)
   202  	defer back()
   203  	var ctx = &context.Context{
   204  		Config: config.Project{},
   205  	}
   206  	assert.EqualError(t, Pipe{}.Default(ctx), "current folder is not a git repository")
   207  	assert.Empty(t, ctx.Config.Release.GitHub.String())
   208  }
   209  
   210  func TestDefaultGitRepoWithoutOrigin(t *testing.T) {
   211  	_, back := testlib.Mktmp(t)
   212  	defer back()
   213  	var ctx = &context.Context{
   214  		Config: config.Project{},
   215  	}
   216  	testlib.GitInit(t)
   217  	assert.EqualError(t, Pipe{}.Default(ctx), "repository doesn't have an `origin` remote")
   218  	assert.Empty(t, ctx.Config.Release.GitHub.String())
   219  }
   220  
   221  func TestDefaultNotAGitRepoSnapshot(t *testing.T) {
   222  	_, back := testlib.Mktmp(t)
   223  	defer back()
   224  	var ctx = &context.Context{
   225  		Config: config.Project{},
   226  	}
   227  	ctx.Snapshot = true
   228  	assert.NoError(t, Pipe{}.Default(ctx))
   229  	assert.Empty(t, ctx.Config.Release.GitHub.String())
   230  }
   231  
   232  func TestDefaultGitRepoWithoutRemote(t *testing.T) {
   233  	_, back := testlib.Mktmp(t)
   234  	defer back()
   235  	var ctx = &context.Context{
   236  		Config: config.Project{},
   237  	}
   238  	assert.Error(t, Pipe{}.Default(ctx))
   239  	assert.Empty(t, ctx.Config.Release.GitHub.String())
   240  }
   241  
   242  type DummyClient struct {
   243  	FailToCreateRelease bool
   244  	FailToUpload        bool
   245  	CreatedRelease      bool
   246  	UploadedFile        bool
   247  	UploadedFileNames   []string
   248  	Lock                sync.Mutex
   249  }
   250  
   251  func (client *DummyClient) CreateRelease(ctx *context.Context, body string) (releaseID int64, err error) {
   252  	if client.FailToCreateRelease {
   253  		return 0, errors.New("release failed")
   254  	}
   255  	client.CreatedRelease = true
   256  	return
   257  }
   258  
   259  func (client *DummyClient) CreateFile(ctx *context.Context, commitAuthor config.CommitAuthor, repo config.Repo, content bytes.Buffer, path, msg string) (err error) {
   260  	return
   261  }
   262  
   263  func (client *DummyClient) Upload(ctx *context.Context, releaseID int64, name string, file *os.File) (err error) {
   264  	client.Lock.Lock()
   265  	defer client.Lock.Unlock()
   266  	if client.FailToUpload {
   267  		return errors.New("upload failed")
   268  	}
   269  	client.UploadedFile = true
   270  	client.UploadedFileNames = append(client.UploadedFileNames, name)
   271  	return
   272  }