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 }