code.gitea.io/gitea@v1.22.3/services/webhook/discord_test.go (about) 1 // Copyright 2021 The Gitea Authors. All rights reserved. 2 // SPDX-License-Identifier: MIT 3 4 package webhook 5 6 import ( 7 "context" 8 "testing" 9 10 webhook_model "code.gitea.io/gitea/models/webhook" 11 "code.gitea.io/gitea/modules/json" 12 "code.gitea.io/gitea/modules/setting" 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 TestDiscordPayload(t *testing.T) { 21 dc := discordConvertor{} 22 23 t.Run("Create", func(t *testing.T) { 24 p := createTestPayload() 25 26 pl, err := dc.Create(p) 27 require.NoError(t, err) 28 29 assert.Len(t, pl.Embeds, 1) 30 assert.Equal(t, "[test/repo] branch test created", pl.Embeds[0].Title) 31 assert.Empty(t, pl.Embeds[0].Description) 32 assert.Equal(t, "http://localhost:3000/test/repo/src/test", pl.Embeds[0].URL) 33 assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name) 34 assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL) 35 assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL) 36 }) 37 38 t.Run("Delete", func(t *testing.T) { 39 p := deleteTestPayload() 40 41 pl, err := dc.Delete(p) 42 require.NoError(t, err) 43 44 assert.Len(t, pl.Embeds, 1) 45 assert.Equal(t, "[test/repo] branch test deleted", pl.Embeds[0].Title) 46 assert.Empty(t, pl.Embeds[0].Description) 47 assert.Equal(t, "http://localhost:3000/test/repo/src/test", pl.Embeds[0].URL) 48 assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name) 49 assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL) 50 assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL) 51 }) 52 53 t.Run("Fork", func(t *testing.T) { 54 p := forkTestPayload() 55 56 pl, err := dc.Fork(p) 57 require.NoError(t, err) 58 59 assert.Len(t, pl.Embeds, 1) 60 assert.Equal(t, "test/repo2 is forked to test/repo", pl.Embeds[0].Title) 61 assert.Empty(t, pl.Embeds[0].Description) 62 assert.Equal(t, "http://localhost:3000/test/repo", pl.Embeds[0].URL) 63 assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name) 64 assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL) 65 assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL) 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.Len(t, pl.Embeds, 1) 75 assert.Equal(t, "[test/repo:test] 2 new commits", pl.Embeds[0].Title) 76 assert.Equal(t, "[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1", pl.Embeds[0].Description) 77 assert.Equal(t, "http://localhost:3000/test/repo/src/test", pl.Embeds[0].URL) 78 assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name) 79 assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL) 80 assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL) 81 }) 82 83 t.Run("PushWithLongCommitMessage", func(t *testing.T) { 84 p := pushTestMultilineCommitMessagePayload() 85 86 pl, err := dc.Push(p) 87 require.NoError(t, err) 88 89 assert.Len(t, pl.Embeds, 1) 90 assert.Equal(t, "[test/repo:test] 2 new commits", pl.Embeds[0].Title) 91 assert.Equal(t, "[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) This is a commit summary ⚠️⚠️⚠️⚠️ containing 你好... - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) This is a commit summary ⚠️⚠️⚠️⚠️ containing 你好... - user1", pl.Embeds[0].Description) 92 assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name) 93 assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL) 94 assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL) 95 }) 96 97 t.Run("Issue", func(t *testing.T) { 98 p := issueTestPayload() 99 100 p.Action = api.HookIssueOpened 101 pl, err := dc.Issue(p) 102 require.NoError(t, err) 103 104 assert.Len(t, pl.Embeds, 1) 105 assert.Equal(t, "[test/repo] Issue opened: #2 crash", pl.Embeds[0].Title) 106 assert.Equal(t, "issue body", pl.Embeds[0].Description) 107 assert.Equal(t, "http://localhost:3000/test/repo/issues/2", pl.Embeds[0].URL) 108 assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name) 109 assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL) 110 assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL) 111 112 p.Action = api.HookIssueClosed 113 pl, err = dc.Issue(p) 114 require.NoError(t, err) 115 116 assert.Len(t, pl.Embeds, 1) 117 assert.Equal(t, "[test/repo] Issue closed: #2 crash", pl.Embeds[0].Title) 118 assert.Empty(t, pl.Embeds[0].Description) 119 assert.Equal(t, "http://localhost:3000/test/repo/issues/2", pl.Embeds[0].URL) 120 assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name) 121 assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL) 122 assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL) 123 }) 124 125 t.Run("IssueComment", func(t *testing.T) { 126 p := issueCommentTestPayload() 127 128 pl, err := dc.IssueComment(p) 129 require.NoError(t, err) 130 131 assert.Len(t, pl.Embeds, 1) 132 assert.Equal(t, "[test/repo] New comment on issue #2 crash", pl.Embeds[0].Title) 133 assert.Equal(t, "more info needed", pl.Embeds[0].Description) 134 assert.Equal(t, "http://localhost:3000/test/repo/issues/2#issuecomment-4", pl.Embeds[0].URL) 135 assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name) 136 assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL) 137 assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL) 138 }) 139 140 t.Run("PullRequest", func(t *testing.T) { 141 p := pullRequestTestPayload() 142 143 pl, err := dc.PullRequest(p) 144 require.NoError(t, err) 145 146 assert.Len(t, pl.Embeds, 1) 147 assert.Equal(t, "[test/repo] Pull request opened: #12 Fix bug", pl.Embeds[0].Title) 148 assert.Equal(t, "fixes bug #2", pl.Embeds[0].Description) 149 assert.Equal(t, "http://localhost:3000/test/repo/pulls/12", pl.Embeds[0].URL) 150 assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name) 151 assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL) 152 assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL) 153 }) 154 155 t.Run("PullRequestComment", func(t *testing.T) { 156 p := pullRequestCommentTestPayload() 157 158 pl, err := dc.IssueComment(p) 159 require.NoError(t, err) 160 161 assert.Len(t, pl.Embeds, 1) 162 assert.Equal(t, "[test/repo] New comment on pull request #12 Fix bug", pl.Embeds[0].Title) 163 assert.Equal(t, "changes requested", pl.Embeds[0].Description) 164 assert.Equal(t, "http://localhost:3000/test/repo/pulls/12#issuecomment-4", pl.Embeds[0].URL) 165 assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name) 166 assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL) 167 assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL) 168 }) 169 170 t.Run("Review", func(t *testing.T) { 171 p := pullRequestTestPayload() 172 p.Action = api.HookIssueReviewed 173 174 pl, err := dc.Review(p, webhook_module.HookEventPullRequestReviewApproved) 175 require.NoError(t, err) 176 177 assert.Len(t, pl.Embeds, 1) 178 assert.Equal(t, "[test/repo] Pull request review approved: #12 Fix bug", pl.Embeds[0].Title) 179 assert.Equal(t, "good job", pl.Embeds[0].Description) 180 assert.Equal(t, "http://localhost:3000/test/repo/pulls/12", pl.Embeds[0].URL) 181 assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name) 182 assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL) 183 assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL) 184 }) 185 186 t.Run("Repository", func(t *testing.T) { 187 p := repositoryTestPayload() 188 189 pl, err := dc.Repository(p) 190 require.NoError(t, err) 191 192 assert.Len(t, pl.Embeds, 1) 193 assert.Equal(t, "[test/repo] Repository created", pl.Embeds[0].Title) 194 assert.Empty(t, pl.Embeds[0].Description) 195 assert.Equal(t, "http://localhost:3000/test/repo", pl.Embeds[0].URL) 196 assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name) 197 assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL) 198 assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL) 199 }) 200 201 t.Run("Package", func(t *testing.T) { 202 p := packageTestPayload() 203 204 pl, err := dc.Package(p) 205 require.NoError(t, err) 206 207 assert.Len(t, pl.Embeds, 1) 208 assert.Equal(t, "Package created: GiteaContainer:latest", pl.Embeds[0].Title) 209 assert.Empty(t, pl.Embeds[0].Description) 210 assert.Equal(t, "http://localhost:3000/user1/-/packages/container/GiteaContainer/latest", pl.Embeds[0].URL) 211 assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name) 212 assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL) 213 assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL) 214 }) 215 216 t.Run("Wiki", func(t *testing.T) { 217 p := wikiTestPayload() 218 219 p.Action = api.HookWikiCreated 220 pl, err := dc.Wiki(p) 221 require.NoError(t, err) 222 223 assert.Len(t, pl.Embeds, 1) 224 assert.Equal(t, "[test/repo] New wiki page 'index' (Wiki change comment)", pl.Embeds[0].Title) 225 assert.Equal(t, "Wiki change comment", pl.Embeds[0].Description) 226 assert.Equal(t, "http://localhost:3000/test/repo/wiki/index", pl.Embeds[0].URL) 227 assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name) 228 assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL) 229 assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL) 230 231 p.Action = api.HookWikiEdited 232 pl, err = dc.Wiki(p) 233 require.NoError(t, err) 234 235 assert.Len(t, pl.Embeds, 1) 236 assert.Equal(t, "[test/repo] Wiki page 'index' edited (Wiki change comment)", pl.Embeds[0].Title) 237 assert.Equal(t, "Wiki change comment", pl.Embeds[0].Description) 238 assert.Equal(t, "http://localhost:3000/test/repo/wiki/index", pl.Embeds[0].URL) 239 assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name) 240 assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL) 241 assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL) 242 243 p.Action = api.HookWikiDeleted 244 pl, err = dc.Wiki(p) 245 require.NoError(t, err) 246 247 assert.Len(t, pl.Embeds, 1) 248 assert.Equal(t, "[test/repo] Wiki page 'index' deleted", pl.Embeds[0].Title) 249 assert.Empty(t, pl.Embeds[0].Description) 250 assert.Equal(t, "http://localhost:3000/test/repo/wiki/index", pl.Embeds[0].URL) 251 assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name) 252 assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL) 253 assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL) 254 }) 255 256 t.Run("Release", func(t *testing.T) { 257 p := pullReleaseTestPayload() 258 259 pl, err := dc.Release(p) 260 require.NoError(t, err) 261 262 assert.Len(t, pl.Embeds, 1) 263 assert.Equal(t, "[test/repo] Release created: v1.0", pl.Embeds[0].Title) 264 assert.Equal(t, "Note of first stable release", pl.Embeds[0].Description) 265 assert.Equal(t, "http://localhost:3000/test/repo/releases/tag/v1.0", pl.Embeds[0].URL) 266 assert.Equal(t, p.Sender.UserName, pl.Embeds[0].Author.Name) 267 assert.Equal(t, setting.AppURL+p.Sender.UserName, pl.Embeds[0].Author.URL) 268 assert.Equal(t, p.Sender.AvatarURL, pl.Embeds[0].Author.IconURL) 269 }) 270 } 271 272 func TestDiscordJSONPayload(t *testing.T) { 273 p := pushTestPayload() 274 data, err := p.JSONPayload() 275 require.NoError(t, err) 276 277 hook := &webhook_model.Webhook{ 278 RepoID: 3, 279 IsActive: true, 280 Type: webhook_module.DISCORD, 281 URL: "https://discord.example.com/", 282 Meta: `{}`, 283 HTTPMethod: "POST", 284 } 285 task := &webhook_model.HookTask{ 286 HookID: hook.ID, 287 EventType: webhook_module.HookEventPush, 288 PayloadContent: string(data), 289 PayloadVersion: 2, 290 } 291 292 req, reqBody, err := newDiscordRequest(context.Background(), hook, task) 293 require.NotNil(t, req) 294 require.NotNil(t, reqBody) 295 require.NoError(t, err) 296 297 assert.Equal(t, "POST", req.Method) 298 assert.Equal(t, "https://discord.example.com/", req.URL.String()) 299 assert.Equal(t, "sha256=", req.Header.Get("X-Hub-Signature-256")) 300 assert.Equal(t, "application/json", req.Header.Get("Content-Type")) 301 var body DiscordPayload 302 err = json.NewDecoder(req.Body).Decode(&body) 303 assert.NoError(t, err) 304 assert.Equal(t, "[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1", body.Embeds[0].Description) 305 }