gitea源码

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. // Copyright 2021 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package webhook
  4. import (
  5. "testing"
  6. webhook_model "code.gitea.io/gitea/models/webhook"
  7. "code.gitea.io/gitea/modules/json"
  8. api "code.gitea.io/gitea/modules/structs"
  9. webhook_module "code.gitea.io/gitea/modules/webhook"
  10. "github.com/stretchr/testify/assert"
  11. "github.com/stretchr/testify/require"
  12. )
  13. func TestFeishuPayload(t *testing.T) {
  14. fc := feishuConvertor{}
  15. t.Run("Create", func(t *testing.T) {
  16. p := createTestPayload()
  17. pl, err := fc.Create(p)
  18. require.NoError(t, err)
  19. assert.Equal(t, `[test/repo] branch test created`, pl.Content.Text)
  20. })
  21. t.Run("Delete", func(t *testing.T) {
  22. p := deleteTestPayload()
  23. pl, err := fc.Delete(p)
  24. require.NoError(t, err)
  25. assert.Equal(t, `[test/repo] branch test deleted`, pl.Content.Text)
  26. })
  27. t.Run("Fork", func(t *testing.T) {
  28. p := forkTestPayload()
  29. pl, err := fc.Fork(p)
  30. require.NoError(t, err)
  31. assert.Equal(t, `test/repo2 is forked to test/repo`, pl.Content.Text)
  32. })
  33. t.Run("Push", func(t *testing.T) {
  34. p := pushTestPayload()
  35. pl, err := fc.Push(p)
  36. require.NoError(t, err)
  37. assert.Equal(t, "[test/repo:test] \r\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1\r\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1", pl.Content.Text)
  38. })
  39. t.Run("Issue", func(t *testing.T) {
  40. p := issueTestPayload()
  41. p.Action = api.HookIssueOpened
  42. pl, err := fc.Issue(p)
  43. require.NoError(t, err)
  44. assert.Equal(t, "[Issue-test/repo #2]: opened\ncrash\nhttp://localhost:3000/test/repo/issues/2\nIssue by user1\nOperator: user1\nAssignees: user1\n\nissue body", pl.Content.Text)
  45. p.Action = api.HookIssueClosed
  46. pl, err = fc.Issue(p)
  47. require.NoError(t, err)
  48. assert.Equal(t, "[Issue-test/repo #2]: closed\ncrash\nhttp://localhost:3000/test/repo/issues/2\nIssue by user1\nOperator: user1\nAssignees: user1\n\nissue body", pl.Content.Text)
  49. })
  50. t.Run("IssueComment", func(t *testing.T) {
  51. p := issueCommentTestPayload()
  52. pl, err := fc.IssueComment(p)
  53. require.NoError(t, err)
  54. assert.Equal(t, "[Comment-test/repo #2]: created\ncrash\nhttp://localhost:3000/test/repo/issues/2\nIssue by user1\nOperator: user1\n\nmore info needed", pl.Content.Text)
  55. })
  56. t.Run("PullRequest", func(t *testing.T) {
  57. p := pullRequestTestPayload()
  58. pl, err := fc.PullRequest(p)
  59. require.NoError(t, err)
  60. assert.Equal(t, "[PullRequest-test/repo #12]: opened\nFix bug\nhttp://localhost:3000/test/repo/pulls/12\nPullRequest by user1\nOperator: user1\nAssignees: user1\n\nfixes bug #2", pl.Content.Text)
  61. })
  62. t.Run("PullRequestComment", func(t *testing.T) {
  63. p := pullRequestCommentTestPayload()
  64. pl, err := fc.IssueComment(p)
  65. require.NoError(t, err)
  66. assert.Equal(t, "[Comment-test/repo #12]: created\nFix bug\nhttp://localhost:3000/test/repo/pulls/12\nPullRequest by user1\nOperator: user1\n\nchanges requested", pl.Content.Text)
  67. })
  68. t.Run("Review", func(t *testing.T) {
  69. p := pullRequestTestPayload()
  70. p.Action = api.HookIssueReviewed
  71. pl, err := fc.Review(p, webhook_module.HookEventPullRequestReviewApproved)
  72. require.NoError(t, err)
  73. assert.Equal(t, "[test/repo] Pull request review approved : #12 Fix bug\r\n\r\ngood job", pl.Content.Text)
  74. })
  75. t.Run("Repository", func(t *testing.T) {
  76. p := repositoryTestPayload()
  77. pl, err := fc.Repository(p)
  78. require.NoError(t, err)
  79. assert.Equal(t, "[test/repo] Repository created", pl.Content.Text)
  80. })
  81. t.Run("Package", func(t *testing.T) {
  82. p := packageTestPayload()
  83. pl, err := fc.Package(p)
  84. require.NoError(t, err)
  85. assert.Equal(t, "Package created: GiteaContainer:latest by user1", pl.Content.Text)
  86. })
  87. t.Run("Wiki", func(t *testing.T) {
  88. p := wikiTestPayload()
  89. p.Action = api.HookWikiCreated
  90. pl, err := fc.Wiki(p)
  91. require.NoError(t, err)
  92. assert.Equal(t, "[test/repo] New wiki page 'index' (Wiki change comment) by user1", pl.Content.Text)
  93. p.Action = api.HookWikiEdited
  94. pl, err = fc.Wiki(p)
  95. require.NoError(t, err)
  96. assert.Equal(t, "[test/repo] Wiki page 'index' edited (Wiki change comment) by user1", pl.Content.Text)
  97. p.Action = api.HookWikiDeleted
  98. pl, err = fc.Wiki(p)
  99. require.NoError(t, err)
  100. assert.Equal(t, "[test/repo] Wiki page 'index' deleted by user1", pl.Content.Text)
  101. })
  102. t.Run("Release", func(t *testing.T) {
  103. p := pullReleaseTestPayload()
  104. pl, err := fc.Release(p)
  105. require.NoError(t, err)
  106. assert.Equal(t, "[test/repo] Release created: v1.0 by user1", pl.Content.Text)
  107. })
  108. }
  109. func TestFeishuJSONPayload(t *testing.T) {
  110. p := pushTestPayload()
  111. data, err := p.JSONPayload()
  112. require.NoError(t, err)
  113. hook := &webhook_model.Webhook{
  114. RepoID: 3,
  115. IsActive: true,
  116. Type: webhook_module.FEISHU,
  117. URL: "https://feishu.example.com/",
  118. Meta: `{}`,
  119. HTTPMethod: "POST",
  120. Secret: "secret",
  121. }
  122. task := &webhook_model.HookTask{
  123. HookID: hook.ID,
  124. EventType: webhook_module.HookEventPush,
  125. PayloadContent: string(data),
  126. PayloadVersion: 2,
  127. }
  128. req, reqBody, err := newFeishuRequest(t.Context(), hook, task)
  129. require.NotNil(t, req)
  130. require.NotNil(t, reqBody)
  131. require.NoError(t, err)
  132. assert.Equal(t, "POST", req.Method)
  133. assert.Equal(t, "https://feishu.example.com/", req.URL.String())
  134. assert.Equal(t, "application/json", req.Header.Get("Content-Type"))
  135. var body FeishuPayload
  136. err = json.NewDecoder(req.Body).Decode(&body)
  137. assert.NoError(t, err)
  138. assert.Equal(t, "[test/repo:test] \r\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1\r\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1", body.Content.Text)
  139. assert.Equal(t, feishuGenSign(hook.Secret, body.Timestamp), body.Sign)
  140. // a separate sign test, the result is generated by official python code, so the algo must be correct
  141. assert.Equal(t, "rWZ84lcag1x9aBFhn1gtV4ZN+4gme3pilfQNMk86vKg=", feishuGenSign("a", 1))
  142. }