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