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 }