code.gitea.io/gitea@v1.22.3/services/webhook/dingtalk_test.go (about) 1 // Copyright 2019 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package webhook 5 6 import ( 7 "context" 8 "net/url" 9 "testing" 10 11 webhook_model "code.gitea.io/gitea/models/webhook" 12 "code.gitea.io/gitea/modules/json" 13 api "code.gitea.io/gitea/modules/structs" 14 webhook_module "code.gitea.io/gitea/modules/webhook" 15 16 "github.com/stretchr/testify/assert" 17 "github.com/stretchr/testify/require" 18 ) 19 20 func TestDingTalkPayload(t *testing.T) { 21 parseRealSingleURL := func(singleURL string) string { 22 if u, err := url.Parse(singleURL); err == nil { 23 assert.Equal(t, "dingtalk", u.Scheme) 24 assert.Equal(t, "dingtalkclient", u.Host) 25 assert.Equal(t, "/page/link", u.Path) 26 return u.Query().Get("url") 27 } 28 return "" 29 } 30 dc := dingtalkConvertor{} 31 32 t.Run("Create", func(t *testing.T) { 33 p := createTestPayload() 34 35 pl, err := dc.Create(p) 36 require.NoError(t, err) 37 38 assert.Equal(t, "[test/repo] branch test created", pl.ActionCard.Text) 39 assert.Equal(t, "[test/repo] branch test created", pl.ActionCard.Title) 40 assert.Equal(t, "view ref test", pl.ActionCard.SingleTitle) 41 assert.Equal(t, "http://localhost:3000/test/repo/src/test", parseRealSingleURL(pl.ActionCard.SingleURL)) 42 }) 43 44 t.Run("Delete", func(t *testing.T) { 45 p := deleteTestPayload() 46 47 pl, err := dc.Delete(p) 48 require.NoError(t, err) 49 50 assert.Equal(t, "[test/repo] branch test deleted", pl.ActionCard.Text) 51 assert.Equal(t, "[test/repo] branch test deleted", pl.ActionCard.Title) 52 assert.Equal(t, "view ref test", pl.ActionCard.SingleTitle) 53 assert.Equal(t, "http://localhost:3000/test/repo/src/test", parseRealSingleURL(pl.ActionCard.SingleURL)) 54 }) 55 56 t.Run("Fork", func(t *testing.T) { 57 p := forkTestPayload() 58 59 pl, err := dc.Fork(p) 60 require.NoError(t, err) 61 62 assert.Equal(t, "test/repo2 is forked to test/repo", pl.ActionCard.Text) 63 assert.Equal(t, "test/repo2 is forked to test/repo", pl.ActionCard.Title) 64 assert.Equal(t, "view forked repo test/repo", pl.ActionCard.SingleTitle) 65 assert.Equal(t, "http://localhost:3000/test/repo", parseRealSingleURL(pl.ActionCard.SingleURL)) 66 }) 67 68 t.Run("Push", func(t *testing.T) { 69 p := pushTestPayload() 70 71 pl, err := dc.Push(p) 72 require.NoError(t, err) 73 74 assert.Equal(t, "[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.ActionCard.Text) 75 assert.Equal(t, "[test/repo:test] 2 new commits", pl.ActionCard.Title) 76 assert.Equal(t, "view commits", pl.ActionCard.SingleTitle) 77 assert.Equal(t, "http://localhost:3000/test/repo/src/test", parseRealSingleURL(pl.ActionCard.SingleURL)) 78 }) 79 80 t.Run("Issue", func(t *testing.T) { 81 p := issueTestPayload() 82 83 p.Action = api.HookIssueOpened 84 pl, err := dc.Issue(p) 85 require.NoError(t, err) 86 87 assert.Equal(t, "[test/repo] Issue opened: #2 crash by user1\r\n\r\nissue body", pl.ActionCard.Text) 88 assert.Equal(t, "#2 crash", pl.ActionCard.Title) 89 assert.Equal(t, "view issue", pl.ActionCard.SingleTitle) 90 assert.Equal(t, "http://localhost:3000/test/repo/issues/2", parseRealSingleURL(pl.ActionCard.SingleURL)) 91 92 p.Action = api.HookIssueClosed 93 pl, err = dc.Issue(p) 94 require.NoError(t, err) 95 96 assert.Equal(t, "[test/repo] Issue closed: #2 crash by user1", pl.ActionCard.Text) 97 assert.Equal(t, "#2 crash", pl.ActionCard.Title) 98 assert.Equal(t, "view issue", pl.ActionCard.SingleTitle) 99 assert.Equal(t, "http://localhost:3000/test/repo/issues/2", parseRealSingleURL(pl.ActionCard.SingleURL)) 100 }) 101 102 t.Run("IssueComment", func(t *testing.T) { 103 p := issueCommentTestPayload() 104 105 pl, err := dc.IssueComment(p) 106 require.NoError(t, err) 107 108 assert.Equal(t, "[test/repo] New comment on issue #2 crash by user1\r\n\r\nmore info needed", pl.ActionCard.Text) 109 assert.Equal(t, "#2 crash", pl.ActionCard.Title) 110 assert.Equal(t, "view issue comment", pl.ActionCard.SingleTitle) 111 assert.Equal(t, "http://localhost:3000/test/repo/issues/2#issuecomment-4", parseRealSingleURL(pl.ActionCard.SingleURL)) 112 }) 113 114 t.Run("PullRequest", func(t *testing.T) { 115 p := pullRequestTestPayload() 116 117 pl, err := dc.PullRequest(p) 118 require.NoError(t, err) 119 120 assert.Equal(t, "[test/repo] Pull request opened: #12 Fix bug by user1\r\n\r\nfixes bug #2", pl.ActionCard.Text) 121 assert.Equal(t, "#12 Fix bug", pl.ActionCard.Title) 122 assert.Equal(t, "view pull request", pl.ActionCard.SingleTitle) 123 assert.Equal(t, "http://localhost:3000/test/repo/pulls/12", parseRealSingleURL(pl.ActionCard.SingleURL)) 124 }) 125 126 t.Run("PullRequestComment", func(t *testing.T) { 127 p := pullRequestCommentTestPayload() 128 129 pl, err := dc.IssueComment(p) 130 require.NoError(t, err) 131 132 assert.Equal(t, "[test/repo] New comment on pull request #12 Fix bug by user1\r\n\r\nchanges requested", pl.ActionCard.Text) 133 assert.Equal(t, "#12 Fix bug", pl.ActionCard.Title) 134 assert.Equal(t, "view issue comment", pl.ActionCard.SingleTitle) 135 assert.Equal(t, "http://localhost:3000/test/repo/pulls/12#issuecomment-4", parseRealSingleURL(pl.ActionCard.SingleURL)) 136 }) 137 138 t.Run("Review", func(t *testing.T) { 139 p := pullRequestTestPayload() 140 p.Action = api.HookIssueReviewed 141 142 pl, err := dc.Review(p, webhook_module.HookEventPullRequestReviewApproved) 143 require.NoError(t, err) 144 145 assert.Equal(t, "[test/repo] Pull request review approved : #12 Fix bug\r\n\r\ngood job", pl.ActionCard.Text) 146 assert.Equal(t, "[test/repo] Pull request review approved : #12 Fix bug", pl.ActionCard.Title) 147 assert.Equal(t, "view pull request", pl.ActionCard.SingleTitle) 148 assert.Equal(t, "http://localhost:3000/test/repo/pulls/12", parseRealSingleURL(pl.ActionCard.SingleURL)) 149 }) 150 151 t.Run("Repository", func(t *testing.T) { 152 p := repositoryTestPayload() 153 154 pl, err := dc.Repository(p) 155 require.NoError(t, err) 156 157 assert.Equal(t, "[test/repo] Repository created", pl.ActionCard.Text) 158 assert.Equal(t, "[test/repo] Repository created", pl.ActionCard.Title) 159 assert.Equal(t, "view repository", pl.ActionCard.SingleTitle) 160 assert.Equal(t, "http://localhost:3000/test/repo", parseRealSingleURL(pl.ActionCard.SingleURL)) 161 }) 162 163 t.Run("Package", func(t *testing.T) { 164 p := packageTestPayload() 165 166 pl, err := dc.Package(p) 167 require.NoError(t, err) 168 169 assert.Equal(t, "Package created: GiteaContainer:latest by user1", pl.ActionCard.Text) 170 assert.Equal(t, "Package created: GiteaContainer:latest by user1", pl.ActionCard.Title) 171 assert.Equal(t, "view package", pl.ActionCard.SingleTitle) 172 assert.Equal(t, "http://localhost:3000/user1/-/packages/container/GiteaContainer/latest", parseRealSingleURL(pl.ActionCard.SingleURL)) 173 }) 174 175 t.Run("Wiki", func(t *testing.T) { 176 p := wikiTestPayload() 177 178 p.Action = api.HookWikiCreated 179 pl, err := dc.Wiki(p) 180 require.NoError(t, err) 181 182 assert.Equal(t, "[test/repo] New wiki page 'index' (Wiki change comment) by user1", pl.ActionCard.Text) 183 assert.Equal(t, "[test/repo] New wiki page 'index' (Wiki change comment) by user1", pl.ActionCard.Title) 184 assert.Equal(t, "view wiki", pl.ActionCard.SingleTitle) 185 assert.Equal(t, "http://localhost:3000/test/repo/wiki/index", parseRealSingleURL(pl.ActionCard.SingleURL)) 186 187 p.Action = api.HookWikiEdited 188 pl, err = dc.Wiki(p) 189 require.NoError(t, err) 190 191 assert.Equal(t, "[test/repo] Wiki page 'index' edited (Wiki change comment) by user1", pl.ActionCard.Text) 192 assert.Equal(t, "[test/repo] Wiki page 'index' edited (Wiki change comment) by user1", pl.ActionCard.Title) 193 assert.Equal(t, "view wiki", pl.ActionCard.SingleTitle) 194 assert.Equal(t, "http://localhost:3000/test/repo/wiki/index", parseRealSingleURL(pl.ActionCard.SingleURL)) 195 196 p.Action = api.HookWikiDeleted 197 pl, err = dc.Wiki(p) 198 require.NoError(t, err) 199 200 assert.Equal(t, "[test/repo] Wiki page 'index' deleted by user1", pl.ActionCard.Text) 201 assert.Equal(t, "[test/repo] Wiki page 'index' deleted by user1", pl.ActionCard.Title) 202 assert.Equal(t, "view wiki", pl.ActionCard.SingleTitle) 203 assert.Equal(t, "http://localhost:3000/test/repo/wiki/index", parseRealSingleURL(pl.ActionCard.SingleURL)) 204 }) 205 206 t.Run("Release", func(t *testing.T) { 207 p := pullReleaseTestPayload() 208 209 pl, err := dc.Release(p) 210 require.NoError(t, err) 211 212 assert.Equal(t, "[test/repo] Release created: v1.0 by user1", pl.ActionCard.Text) 213 assert.Equal(t, "[test/repo] Release created: v1.0 by user1", pl.ActionCard.Title) 214 assert.Equal(t, "view release", pl.ActionCard.SingleTitle) 215 assert.Equal(t, "http://localhost:3000/test/repo/releases/tag/v1.0", parseRealSingleURL(pl.ActionCard.SingleURL)) 216 }) 217 } 218 219 func TestDingTalkJSONPayload(t *testing.T) { 220 p := pushTestPayload() 221 data, err := p.JSONPayload() 222 require.NoError(t, err) 223 224 hook := &webhook_model.Webhook{ 225 RepoID: 3, 226 IsActive: true, 227 Type: webhook_module.DINGTALK, 228 URL: "https://dingtalk.example.com/", 229 Meta: ``, 230 HTTPMethod: "POST", 231 } 232 task := &webhook_model.HookTask{ 233 HookID: hook.ID, 234 EventType: webhook_module.HookEventPush, 235 PayloadContent: string(data), 236 PayloadVersion: 2, 237 } 238 239 req, reqBody, err := newDingtalkRequest(context.Background(), hook, task) 240 require.NotNil(t, req) 241 require.NotNil(t, reqBody) 242 require.NoError(t, err) 243 244 assert.Equal(t, "POST", req.Method) 245 assert.Equal(t, "https://dingtalk.example.com/", req.URL.String()) 246 assert.Equal(t, "sha256=", req.Header.Get("X-Hub-Signature-256")) 247 assert.Equal(t, "application/json", req.Header.Get("Content-Type")) 248 var body DingtalkPayload 249 err = json.NewDecoder(req.Body).Decode(&body) 250 assert.NoError(t, err) 251 assert.Equal(t, "[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.ActionCard.Text) 252 }