github.com/joselitofilho/goreleaser@v0.155.1-0.20210123221854-e4891856c593/internal/client/gitea_test.go (about) 1 package client 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "strings" 8 "testing" 9 10 "code.gitea.io/sdk/gitea" 11 "github.com/goreleaser/goreleaser/internal/artifact" 12 "github.com/goreleaser/goreleaser/pkg/config" 13 "github.com/goreleaser/goreleaser/pkg/context" 14 "github.com/jarcoal/httpmock" 15 "github.com/stretchr/testify/require" 16 "github.com/stretchr/testify/suite" 17 ) 18 19 type GetInstanceURLSuite struct { 20 suite.Suite 21 } 22 23 func (s *GetInstanceURLSuite) TestWithScheme() { 24 t := s.T() 25 rootURL := "https://gitea.com" 26 result, err := getInstanceURL(rootURL + "/api/v1") 27 require.NoError(t, err) 28 require.Equal(t, rootURL, result) 29 } 30 31 func (s *GetInstanceURLSuite) TestParseError() { 32 t := s.T() 33 host := "://wrong.gitea.com" 34 result, err := getInstanceURL(host) 35 require.Error(t, err) 36 require.Empty(t, result) 37 } 38 39 func (s *GetInstanceURLSuite) TestNoScheme() { 40 t := s.T() 41 host := "gitea.com" 42 result, err := getInstanceURL(host) 43 require.Error(t, err) 44 require.Empty(t, result) 45 } 46 47 func (s *GetInstanceURLSuite) TestEmpty() { 48 t := s.T() 49 result, err := getInstanceURL("") 50 require.Error(t, err) 51 require.Empty(t, result) 52 } 53 54 func TestGetInstanceURLSuite(t *testing.T) { 55 suite.Run(t, new(GetInstanceURLSuite)) 56 } 57 58 type GiteaReleasesTestSuite struct { 59 suite.Suite 60 url string 61 owner string 62 repoName string 63 tag string 64 client *giteaClient 65 releasesURL string 66 title string 67 description string 68 ctx *context.Context 69 commit string 70 isDraft bool 71 isPrerelease bool 72 releaseURL string 73 releaseID int64 74 } 75 76 func (s *GiteaReleasesTestSuite) SetupTest() { 77 httpmock.Activate() 78 s.url = "https://gitea.example.com" 79 s.owner = "owner" 80 s.repoName = "repoName" 81 s.releasesURL = fmt.Sprintf( 82 "%v/api/v1/repos/%v/%v/releases", 83 s.url, 84 s.owner, 85 s.repoName, 86 ) 87 s.tag = "tag" 88 s.title = "gitea_release_title" 89 s.description = "gitea release description" 90 s.commit = "some commit hash" 91 s.isDraft = false 92 s.isPrerelease = true 93 s.ctx = &context.Context{ 94 Version: "6.6.6", 95 Config: config.Project{ 96 ProjectName: "project", 97 Release: config.Release{ 98 NameTemplate: "{{ .ProjectName }}_{{ .Version }}", 99 Gitea: config.Repo{ 100 Owner: s.owner, 101 Name: s.repoName, 102 }, 103 Draft: s.isDraft, 104 }, 105 }, 106 Env: context.Env{}, 107 Semver: context.Semver{ 108 Major: 6, 109 Minor: 6, 110 Patch: 6, 111 }, 112 Git: context.GitInfo{ 113 CurrentTag: s.tag, 114 Commit: s.commit, 115 ShortCommit: s.commit[0:2], 116 URL: "https://gitea.com/goreleaser/goreleaser.git", 117 }, 118 PreRelease: s.isPrerelease, 119 } 120 s.releaseID = 666 121 s.releaseURL = fmt.Sprintf("%v/%v", s.releasesURL, s.releaseID) 122 httpmock.RegisterResponder("GET", fmt.Sprintf("%s/api/v1/version", s.url), httpmock.NewStringResponder(200, "{\"version\":\"1.12.0\"}")) 123 newClient, err := gitea.NewClient(s.url) 124 require.NoError(s.T(), err) 125 s.client = &giteaClient{client: newClient} 126 } 127 128 func (s *GiteaReleasesTestSuite) TearDownTest() { 129 httpmock.DeactivateAndReset() 130 } 131 132 type GetExistingReleaseSuite struct { 133 GiteaReleasesTestSuite 134 } 135 136 func (s *GetExistingReleaseSuite) TestNoReleases() { 137 t := s.T() 138 httpmock.RegisterResponder("GET", s.releasesURL, httpmock.NewStringResponder(200, "[]")) 139 140 release, err := s.client.getExistingRelease(s.owner, s.repoName, s.tag) 141 require.Nil(t, release) 142 require.NoError(t, err) 143 } 144 145 func (s *GetExistingReleaseSuite) TestNoRepo() { 146 t := s.T() 147 httpmock.RegisterResponder("GET", s.releasesURL, httpmock.NewStringResponder(404, "")) 148 149 release, err := s.client.getExistingRelease(s.owner, s.repoName, s.tag) 150 require.Nil(t, release) 151 require.Error(t, err) 152 } 153 154 func (s *GetExistingReleaseSuite) TestReleaseExists() { 155 t := s.T() 156 release := gitea.Release{TagName: s.tag} 157 resp, err := httpmock.NewJsonResponder(200, []gitea.Release{release}) 158 require.NoError(t, err) 159 httpmock.RegisterResponder("GET", s.releasesURL, resp) 160 161 result, err := s.client.getExistingRelease(s.owner, s.repoName, s.tag) 162 require.NotNil(t, result) 163 require.Equal(t, *result, release) 164 require.NoError(t, err) 165 166 } 167 168 func TestGetExistingReleaseSuite(t *testing.T) { 169 suite.Run(t, new(GetExistingReleaseSuite)) 170 } 171 172 type GiteacreateReleaseSuite struct { 173 GiteaReleasesTestSuite 174 } 175 176 func (s *GiteacreateReleaseSuite) TestSuccess() { 177 t := s.T() 178 expectedRelease := gitea.Release{ 179 TagName: s.tag, 180 Target: s.commit, 181 Note: s.description, 182 IsDraft: s.isDraft, 183 IsPrerelease: s.isPrerelease, 184 } 185 resp, err := httpmock.NewJsonResponder(200, &expectedRelease) 186 require.NoError(t, err) 187 httpmock.RegisterResponder("POST", s.releasesURL, resp) 188 189 release, err := s.client.createRelease(s.ctx, s.title, s.description) 190 require.NoError(t, err) 191 require.NotNil(t, release) 192 require.Equal(t, expectedRelease, *release) 193 } 194 195 func (s *GiteacreateReleaseSuite) TestError() { 196 t := s.T() 197 httpmock.RegisterResponder("POST", s.releasesURL, httpmock.NewStringResponder(400, "")) 198 199 release, err := s.client.createRelease(s.ctx, s.title, s.description) 200 require.Error(t, err) 201 require.Nil(t, release) 202 } 203 204 func TestGiteacreateReleaseSuite(t *testing.T) { 205 suite.Run(t, new(GiteacreateReleaseSuite)) 206 } 207 208 type GiteaupdateReleaseSuite struct { 209 GiteaReleasesTestSuite 210 } 211 212 func (s *GiteaupdateReleaseSuite) SetupTest() { 213 s.GiteaReleasesTestSuite.SetupTest() 214 } 215 216 func (s *GiteaupdateReleaseSuite) TestSuccess() { 217 t := s.T() 218 expectedRelease := gitea.Release{ 219 TagName: s.tag, 220 Target: s.commit, 221 Note: s.description, 222 IsDraft: s.isDraft, 223 IsPrerelease: s.isPrerelease, 224 } 225 resp, err := httpmock.NewJsonResponder(200, &expectedRelease) 226 require.NoError(t, err) 227 httpmock.RegisterResponder("PATCH", s.releaseURL, resp) 228 229 release, err := s.client.updateRelease(s.ctx, s.title, s.description, s.releaseID) 230 require.NoError(t, err) 231 require.NotNil(t, release) 232 } 233 234 func (s *GiteaupdateReleaseSuite) TestError() { 235 t := s.T() 236 httpmock.RegisterResponder("PATCH", s.releaseURL, httpmock.NewStringResponder(400, "")) 237 238 release, err := s.client.updateRelease(s.ctx, s.title, s.description, s.releaseID) 239 require.Error(t, err) 240 require.Nil(t, release) 241 } 242 243 func (s *GiteaupdateReleaseSuite) TestGiteaCreateFile() { 244 t := s.T() 245 fileEndpoint := fmt.Sprintf("%s/api/v1/repos/%s/%s/contents/%s", s.url, s.owner, s.repoName, "file.txt") 246 247 httpmock.RegisterResponder("GET", fmt.Sprintf("%s/api/v1/version", s.url), httpmock.NewStringResponder(200, "{\"version\":\"1.12.0\"}")) 248 httpmock.RegisterResponder("GET", fileEndpoint, httpmock.NewStringResponder(404, "")) 249 httpmock.RegisterResponder("POST", fileEndpoint, httpmock.NewStringResponder(201, "{\n \"content\": {\n \"name\": \"test.file\",\n \"path\": \"test.file\",\n \"sha\": \"3b18e512dba79e4c8300dd08aeb37f8e728b8dad\",\n \"type\": \"file\",\n \"size\": 12,\n \"encoding\": \"base64\",\n \"content\": \"aGVsbG8gd29ybGQK\"\n }\n}")) 250 251 author := config.CommitAuthor{Name: s.owner} 252 repo := Repo{Owner: s.owner, Name: s.repoName} 253 content := []byte("hello world") 254 path := "file.txt" 255 message := "add hello world" 256 err := s.client.CreateFile(s.ctx, author, repo, content, path, message) 257 require.Nil(t, err) 258 } 259 260 func TestGiteaupdateReleaseSuite(t *testing.T) { 261 suite.Run(t, new(GiteaupdateReleaseSuite)) 262 } 263 264 type GiteaCreateReleaseSuite struct { 265 GiteaReleasesTestSuite 266 } 267 268 func (s *GiteaCreateReleaseSuite) TestTemplateError() { 269 t := s.T() 270 s.ctx.Config.Release.NameTemplate = "{{ .NoKeyLikeThat }}" 271 272 releaseID, err := s.client.CreateRelease(s.ctx, s.description) 273 require.Empty(t, releaseID) 274 require.Error(t, err) 275 } 276 277 func (s *GiteaCreateReleaseSuite) TestErrorGettingExisitngRelease() { 278 t := s.T() 279 httpmock.RegisterResponder("GET", s.releasesURL, httpmock.NewStringResponder(404, "")) 280 281 releaseID, err := s.client.CreateRelease(s.ctx, s.description) 282 require.Empty(t, releaseID) 283 require.Error(t, err) 284 } 285 286 func (s *GiteaCreateReleaseSuite) TestErrorUpdatingRelease() { 287 t := s.T() 288 expectedRelease := gitea.Release{TagName: s.tag} 289 resp, err := httpmock.NewJsonResponder(200, []gitea.Release{expectedRelease}) 290 require.NoError(t, err) 291 httpmock.RegisterResponder("GET", s.releasesURL, resp) 292 httpmock.RegisterResponder("PATCH", s.releaseURL, httpmock.NewStringResponder(400, "")) 293 294 releaseID, err := s.client.CreateRelease(s.ctx, s.description) 295 require.Empty(t, releaseID) 296 require.Error(t, err) 297 } 298 299 func (s *GiteaCreateReleaseSuite) TestSuccessUpdatingRelease() { 300 t := s.T() 301 expectedRelease := gitea.Release{ 302 ID: 666, 303 TagName: s.tag, 304 Target: s.commit, 305 Note: s.description, 306 IsDraft: s.isDraft, 307 IsPrerelease: s.isPrerelease, 308 } 309 resp, err := httpmock.NewJsonResponder(200, []gitea.Release{expectedRelease}) 310 require.NoError(t, err) 311 httpmock.RegisterResponder("GET", s.releasesURL, resp) 312 resp, err = httpmock.NewJsonResponder(200, &expectedRelease) 313 require.NoError(t, err) 314 httpmock.RegisterResponder("PATCH", s.releaseURL, resp) 315 316 newDescription := "NewDescription" 317 releaseID, err := s.client.CreateRelease(s.ctx, newDescription) 318 require.Equal(t, fmt.Sprint(expectedRelease.ID), releaseID) 319 require.NoError(t, err) 320 } 321 322 func (s *GiteaCreateReleaseSuite) TestErrorCreatingRelease() { 323 t := s.T() 324 httpmock.RegisterResponder("GET", s.releasesURL, httpmock.NewStringResponder(200, "[]")) 325 httpmock.RegisterResponder("POST", s.releasesURL, httpmock.NewStringResponder(400, "")) 326 327 releaseID, err := s.client.CreateRelease(s.ctx, s.description) 328 require.Empty(t, releaseID) 329 require.Error(t, err) 330 } 331 332 func (s *GiteaCreateReleaseSuite) TestSuccessCreatingRelease() { 333 t := s.T() 334 httpmock.RegisterResponder("GET", s.releasesURL, httpmock.NewStringResponder(200, "[]")) 335 expectedRelease := gitea.Release{ 336 ID: 666, 337 TagName: s.tag, 338 Target: s.commit, 339 Note: s.description, 340 IsDraft: s.isDraft, 341 IsPrerelease: s.isPrerelease, 342 } 343 resp, err := httpmock.NewJsonResponder(200, &expectedRelease) 344 require.NoError(t, err) 345 httpmock.RegisterResponder("POST", s.releasesURL, resp) 346 347 releaseID, err := s.client.CreateRelease(s.ctx, s.description) 348 require.Equal(t, fmt.Sprint(expectedRelease.ID), releaseID) 349 require.NoError(t, err) 350 } 351 352 func TestGiteaCreateReleaseSuite(t *testing.T) { 353 suite.Run(t, new(GiteaCreateReleaseSuite)) 354 } 355 356 type GiteaUploadSuite struct { 357 GiteaReleasesTestSuite 358 artifact *artifact.Artifact 359 file *os.File 360 releaseAttachmentsURL string 361 } 362 363 func (s *GiteaUploadSuite) SetupTest() { 364 t := s.T() 365 s.GiteaReleasesTestSuite.SetupTest() 366 s.artifact = &artifact.Artifact{Name: "ArtifactName"} 367 file, err := ioutil.TempFile(t.TempDir(), "gitea_test_tempfile") 368 require.NoError(t, err) 369 t.Cleanup(func() { file.Close() }) 370 require.NotNil(t, file) 371 s.file = file 372 s.releaseAttachmentsURL = fmt.Sprintf("%v/assets", s.releaseURL) 373 } 374 375 func (s *GiteaUploadSuite) TearDownTest() { 376 t := s.T() 377 s.GiteaReleasesTestSuite.TearDownTest() 378 err := s.file.Close() 379 require.NoError(t, err) 380 } 381 382 func (s *GiteaUploadSuite) TestErrorParsingReleaseID() { 383 t := s.T() 384 err := s.client.Upload(s.ctx, "notint", s.artifact, s.file) 385 require.EqualError(t, err, "strconv.ParseInt: parsing \"notint\": invalid syntax") 386 } 387 388 func (s *GiteaUploadSuite) TestErrorCreatingReleaseAttachment() { 389 t := s.T() 390 httpmock.RegisterResponder("POST", s.releaseAttachmentsURL, httpmock.NewStringResponder(400, "")) 391 392 err := s.client.Upload(s.ctx, fmt.Sprint(s.releaseID), s.artifact, s.file) 393 require.True(t, strings.HasPrefix(err.Error(), "Unknown API Error: 400")) 394 } 395 396 func (s *GiteaUploadSuite) TestSuccess() { 397 t := s.T() 398 attachment := gitea.Attachment{} 399 resp, err := httpmock.NewJsonResponder(200, &attachment) 400 require.NoError(t, err) 401 httpmock.RegisterResponder("POST", s.releaseAttachmentsURL, resp) 402 403 err = s.client.Upload(s.ctx, fmt.Sprint(s.releaseID), s.artifact, s.file) 404 require.NoError(t, err) 405 } 406 407 func TestGiteaUploadSuite(t *testing.T) { 408 suite.Run(t, new(GiteaUploadSuite)) 409 } 410 411 func TestGiteaReleaseURLTemplate(t *testing.T) { 412 var ctx = context.New(config.Project{ 413 GiteaURLs: config.GiteaURLs{ 414 API: "https://gitea.com/api/v1", 415 Download: "https://gitea.com", 416 }, 417 Release: config.Release{ 418 Gitea: config.Repo{ 419 Owner: "owner", 420 Name: "name", 421 }, 422 }, 423 }) 424 client, err := NewGitea(ctx, ctx.Token) 425 require.NoError(t, err) 426 427 urlTpl, err := client.ReleaseURLTemplate(ctx) 428 require.NoError(t, err) 429 430 expectedUrl := "https://gitea.com/owner/name/releases/download/{{ .Tag }}/{{ .ArtifactName }}" 431 require.Equal(t, expectedUrl, urlTpl) 432 }