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