code.gitea.io/gitea@v1.22.3/services/webhook/msteams_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 api "code.gitea.io/gitea/modules/structs" 13 webhook_module "code.gitea.io/gitea/modules/webhook" 14 15 "github.com/stretchr/testify/assert" 16 "github.com/stretchr/testify/require" 17 ) 18 19 func TestMSTeamsPayload(t *testing.T) { 20 mc := msteamsConvertor{} 21 t.Run("Create", func(t *testing.T) { 22 p := createTestPayload() 23 24 pl, err := mc.Create(p) 25 require.NoError(t, err) 26 27 assert.Equal(t, "[test/repo] branch test created", pl.Title) 28 assert.Equal(t, "[test/repo] branch test created", pl.Summary) 29 assert.Len(t, pl.Sections, 1) 30 assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle) 31 assert.Empty(t, pl.Sections[0].Text) 32 assert.Len(t, pl.Sections[0].Facts, 2) 33 for _, fact := range pl.Sections[0].Facts { 34 if fact.Name == "Repository:" { 35 assert.Equal(t, p.Repo.FullName, fact.Value) 36 } else if fact.Name == "branch:" { 37 assert.Equal(t, "test", fact.Value) 38 } else { 39 t.Fail() 40 } 41 } 42 assert.Len(t, pl.PotentialAction, 1) 43 assert.Len(t, pl.PotentialAction[0].Targets, 1) 44 assert.Equal(t, "http://localhost:3000/test/repo/src/test", pl.PotentialAction[0].Targets[0].URI) 45 }) 46 47 t.Run("Delete", func(t *testing.T) { 48 p := deleteTestPayload() 49 50 pl, err := mc.Delete(p) 51 require.NoError(t, err) 52 53 assert.Equal(t, "[test/repo] branch test deleted", pl.Title) 54 assert.Equal(t, "[test/repo] branch test deleted", pl.Summary) 55 assert.Len(t, pl.Sections, 1) 56 assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle) 57 assert.Empty(t, pl.Sections[0].Text) 58 assert.Len(t, pl.Sections[0].Facts, 2) 59 for _, fact := range pl.Sections[0].Facts { 60 if fact.Name == "Repository:" { 61 assert.Equal(t, p.Repo.FullName, fact.Value) 62 } else if fact.Name == "branch:" { 63 assert.Equal(t, "test", fact.Value) 64 } else { 65 t.Fail() 66 } 67 } 68 assert.Len(t, pl.PotentialAction, 1) 69 assert.Len(t, pl.PotentialAction[0].Targets, 1) 70 assert.Equal(t, "http://localhost:3000/test/repo/src/test", pl.PotentialAction[0].Targets[0].URI) 71 }) 72 73 t.Run("Fork", func(t *testing.T) { 74 p := forkTestPayload() 75 76 pl, err := mc.Fork(p) 77 require.NoError(t, err) 78 79 assert.Equal(t, "test/repo2 is forked to test/repo", pl.Title) 80 assert.Equal(t, "test/repo2 is forked to test/repo", pl.Summary) 81 assert.Len(t, pl.Sections, 1) 82 assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle) 83 assert.Empty(t, pl.Sections[0].Text) 84 assert.Len(t, pl.Sections[0].Facts, 2) 85 for _, fact := range pl.Sections[0].Facts { 86 if fact.Name == "Repository:" { 87 assert.Equal(t, p.Repo.FullName, fact.Value) 88 } else if fact.Name == "Forkee:" { 89 assert.Equal(t, p.Forkee.FullName, fact.Value) 90 } else { 91 t.Fail() 92 } 93 } 94 assert.Len(t, pl.PotentialAction, 1) 95 assert.Len(t, pl.PotentialAction[0].Targets, 1) 96 assert.Equal(t, "http://localhost:3000/test/repo", pl.PotentialAction[0].Targets[0].URI) 97 }) 98 99 t.Run("Push", func(t *testing.T) { 100 p := pushTestPayload() 101 102 pl, err := mc.Push(p) 103 require.NoError(t, err) 104 105 assert.Equal(t, "[test/repo:test] 2 new commits", pl.Title) 106 assert.Equal(t, "[test/repo:test] 2 new commits", pl.Summary) 107 assert.Len(t, pl.Sections, 1) 108 assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle) 109 assert.Equal(t, "[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1\n\n[2020558](http://localhost:3000/test/repo/commit/2020558fe2e34debb818a514715839cabd25e778) commit message - user1", pl.Sections[0].Text) 110 assert.Len(t, pl.Sections[0].Facts, 2) 111 for _, fact := range pl.Sections[0].Facts { 112 if fact.Name == "Repository:" { 113 assert.Equal(t, p.Repo.FullName, fact.Value) 114 } else if fact.Name == "Commit count:" { 115 assert.Equal(t, "2", fact.Value) 116 } else { 117 t.Fail() 118 } 119 } 120 assert.Len(t, pl.PotentialAction, 1) 121 assert.Len(t, pl.PotentialAction[0].Targets, 1) 122 assert.Equal(t, "http://localhost:3000/test/repo/src/test", pl.PotentialAction[0].Targets[0].URI) 123 }) 124 125 t.Run("Issue", func(t *testing.T) { 126 p := issueTestPayload() 127 128 p.Action = api.HookIssueOpened 129 pl, err := mc.Issue(p) 130 require.NoError(t, err) 131 132 assert.Equal(t, "[test/repo] Issue opened: #2 crash", pl.Title) 133 assert.Equal(t, "[test/repo] Issue opened: #2 crash", pl.Summary) 134 assert.Len(t, pl.Sections, 1) 135 assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle) 136 assert.Equal(t, "issue body", pl.Sections[0].Text) 137 assert.Len(t, pl.Sections[0].Facts, 2) 138 for _, fact := range pl.Sections[0].Facts { 139 if fact.Name == "Repository:" { 140 assert.Equal(t, p.Repository.FullName, fact.Value) 141 } else if fact.Name == "Issue #:" { 142 assert.Equal(t, "2", fact.Value) 143 } else { 144 t.Fail() 145 } 146 } 147 assert.Len(t, pl.PotentialAction, 1) 148 assert.Len(t, pl.PotentialAction[0].Targets, 1) 149 assert.Equal(t, "http://localhost:3000/test/repo/issues/2", pl.PotentialAction[0].Targets[0].URI) 150 151 p.Action = api.HookIssueClosed 152 pl, err = mc.Issue(p) 153 require.NoError(t, err) 154 155 assert.Equal(t, "[test/repo] Issue closed: #2 crash", pl.Title) 156 assert.Equal(t, "[test/repo] Issue closed: #2 crash", pl.Summary) 157 assert.Len(t, pl.Sections, 1) 158 assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle) 159 assert.Empty(t, pl.Sections[0].Text) 160 assert.Len(t, pl.Sections[0].Facts, 2) 161 for _, fact := range pl.Sections[0].Facts { 162 if fact.Name == "Repository:" { 163 assert.Equal(t, p.Repository.FullName, fact.Value) 164 } else if fact.Name == "Issue #:" { 165 assert.Equal(t, "2", fact.Value) 166 } else { 167 t.Fail() 168 } 169 } 170 assert.Len(t, pl.PotentialAction, 1) 171 assert.Len(t, pl.PotentialAction[0].Targets, 1) 172 assert.Equal(t, "http://localhost:3000/test/repo/issues/2", pl.PotentialAction[0].Targets[0].URI) 173 }) 174 175 t.Run("IssueComment", func(t *testing.T) { 176 p := issueCommentTestPayload() 177 178 pl, err := mc.IssueComment(p) 179 require.NoError(t, err) 180 181 assert.Equal(t, "[test/repo] New comment on issue #2 crash", pl.Title) 182 assert.Equal(t, "[test/repo] New comment on issue #2 crash", pl.Summary) 183 assert.Len(t, pl.Sections, 1) 184 assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle) 185 assert.Equal(t, "more info needed", pl.Sections[0].Text) 186 assert.Len(t, pl.Sections[0].Facts, 2) 187 for _, fact := range pl.Sections[0].Facts { 188 if fact.Name == "Repository:" { 189 assert.Equal(t, p.Repository.FullName, fact.Value) 190 } else if fact.Name == "Issue #:" { 191 assert.Equal(t, "2", fact.Value) 192 } else { 193 t.Fail() 194 } 195 } 196 assert.Len(t, pl.PotentialAction, 1) 197 assert.Len(t, pl.PotentialAction[0].Targets, 1) 198 assert.Equal(t, "http://localhost:3000/test/repo/issues/2#issuecomment-4", pl.PotentialAction[0].Targets[0].URI) 199 }) 200 201 t.Run("PullRequest", func(t *testing.T) { 202 p := pullRequestTestPayload() 203 204 pl, err := mc.PullRequest(p) 205 require.NoError(t, err) 206 207 assert.Equal(t, "[test/repo] Pull request opened: #12 Fix bug", pl.Title) 208 assert.Equal(t, "[test/repo] Pull request opened: #12 Fix bug", pl.Summary) 209 assert.Len(t, pl.Sections, 1) 210 assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle) 211 assert.Equal(t, "fixes bug #2", pl.Sections[0].Text) 212 assert.Len(t, pl.Sections[0].Facts, 2) 213 for _, fact := range pl.Sections[0].Facts { 214 if fact.Name == "Repository:" { 215 assert.Equal(t, p.Repository.FullName, fact.Value) 216 } else if fact.Name == "Pull request #:" { 217 assert.Equal(t, "12", fact.Value) 218 } else { 219 t.Fail() 220 } 221 } 222 assert.Len(t, pl.PotentialAction, 1) 223 assert.Len(t, pl.PotentialAction[0].Targets, 1) 224 assert.Equal(t, "http://localhost:3000/test/repo/pulls/12", pl.PotentialAction[0].Targets[0].URI) 225 }) 226 227 t.Run("PullRequestComment", func(t *testing.T) { 228 p := pullRequestCommentTestPayload() 229 230 pl, err := mc.IssueComment(p) 231 require.NoError(t, err) 232 233 assert.Equal(t, "[test/repo] New comment on pull request #12 Fix bug", pl.Title) 234 assert.Equal(t, "[test/repo] New comment on pull request #12 Fix bug", pl.Summary) 235 assert.Len(t, pl.Sections, 1) 236 assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle) 237 assert.Equal(t, "changes requested", pl.Sections[0].Text) 238 assert.Len(t, pl.Sections[0].Facts, 2) 239 for _, fact := range pl.Sections[0].Facts { 240 if fact.Name == "Repository:" { 241 assert.Equal(t, p.Repository.FullName, fact.Value) 242 } else if fact.Name == "Issue #:" { 243 assert.Equal(t, "12", fact.Value) 244 } else { 245 t.Fail() 246 } 247 } 248 assert.Len(t, pl.PotentialAction, 1) 249 assert.Len(t, pl.PotentialAction[0].Targets, 1) 250 assert.Equal(t, "http://localhost:3000/test/repo/pulls/12#issuecomment-4", pl.PotentialAction[0].Targets[0].URI) 251 }) 252 253 t.Run("Review", func(t *testing.T) { 254 p := pullRequestTestPayload() 255 p.Action = api.HookIssueReviewed 256 257 pl, err := mc.Review(p, webhook_module.HookEventPullRequestReviewApproved) 258 require.NoError(t, err) 259 260 assert.Equal(t, "[test/repo] Pull request review approved: #12 Fix bug", pl.Title) 261 assert.Equal(t, "[test/repo] Pull request review approved: #12 Fix bug", pl.Summary) 262 assert.Len(t, pl.Sections, 1) 263 assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle) 264 assert.Equal(t, "good job", pl.Sections[0].Text) 265 assert.Len(t, pl.Sections[0].Facts, 2) 266 for _, fact := range pl.Sections[0].Facts { 267 if fact.Name == "Repository:" { 268 assert.Equal(t, p.Repository.FullName, fact.Value) 269 } else if fact.Name == "Pull request #:" { 270 assert.Equal(t, "12", fact.Value) 271 } else { 272 t.Fail() 273 } 274 } 275 assert.Len(t, pl.PotentialAction, 1) 276 assert.Len(t, pl.PotentialAction[0].Targets, 1) 277 assert.Equal(t, "http://localhost:3000/test/repo/pulls/12", pl.PotentialAction[0].Targets[0].URI) 278 }) 279 280 t.Run("Repository", func(t *testing.T) { 281 p := repositoryTestPayload() 282 283 pl, err := mc.Repository(p) 284 require.NoError(t, err) 285 286 assert.Equal(t, "[test/repo] Repository created", pl.Title) 287 assert.Equal(t, "[test/repo] Repository created", pl.Summary) 288 assert.Len(t, pl.Sections, 1) 289 assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle) 290 assert.Empty(t, pl.Sections[0].Text) 291 assert.Len(t, pl.Sections[0].Facts, 1) 292 for _, fact := range pl.Sections[0].Facts { 293 if fact.Name == "Repository:" { 294 assert.Equal(t, p.Repository.FullName, fact.Value) 295 } else { 296 t.Fail() 297 } 298 } 299 assert.Len(t, pl.PotentialAction, 1) 300 assert.Len(t, pl.PotentialAction[0].Targets, 1) 301 assert.Equal(t, "http://localhost:3000/test/repo", pl.PotentialAction[0].Targets[0].URI) 302 }) 303 304 t.Run("Package", func(t *testing.T) { 305 p := packageTestPayload() 306 307 pl, err := mc.Package(p) 308 require.NoError(t, err) 309 310 assert.Equal(t, "Package created: GiteaContainer:latest", pl.Title) 311 assert.Equal(t, "Package created: GiteaContainer:latest", pl.Summary) 312 assert.Len(t, pl.Sections, 1) 313 assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle) 314 assert.Empty(t, pl.Sections[0].Text) 315 assert.Len(t, pl.Sections[0].Facts, 1) 316 for _, fact := range pl.Sections[0].Facts { 317 if fact.Name == "Package:" { 318 assert.Equal(t, p.Package.Name, fact.Value) 319 } else { 320 t.Fail() 321 } 322 } 323 assert.Len(t, pl.PotentialAction, 1) 324 assert.Len(t, pl.PotentialAction[0].Targets, 1) 325 assert.Equal(t, "http://localhost:3000/user1/-/packages/container/GiteaContainer/latest", pl.PotentialAction[0].Targets[0].URI) 326 }) 327 328 t.Run("Wiki", func(t *testing.T) { 329 p := wikiTestPayload() 330 331 p.Action = api.HookWikiCreated 332 pl, err := mc.Wiki(p) 333 require.NoError(t, err) 334 335 assert.Equal(t, "[test/repo] New wiki page 'index' (Wiki change comment)", pl.Title) 336 assert.Equal(t, "[test/repo] New wiki page 'index' (Wiki change comment)", pl.Summary) 337 assert.Len(t, pl.Sections, 1) 338 assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle) 339 assert.Equal(t, "", pl.Sections[0].Text) 340 assert.Len(t, pl.Sections[0].Facts, 2) 341 for _, fact := range pl.Sections[0].Facts { 342 if fact.Name == "Repository:" { 343 assert.Equal(t, p.Repository.FullName, fact.Value) 344 } else { 345 t.Fail() 346 } 347 } 348 assert.Len(t, pl.PotentialAction, 1) 349 assert.Len(t, pl.PotentialAction[0].Targets, 1) 350 assert.Equal(t, "http://localhost:3000/test/repo/wiki/index", pl.PotentialAction[0].Targets[0].URI) 351 352 p.Action = api.HookWikiEdited 353 pl, err = mc.Wiki(p) 354 require.NoError(t, err) 355 356 assert.Equal(t, "[test/repo] Wiki page 'index' edited (Wiki change comment)", pl.Title) 357 assert.Equal(t, "[test/repo] Wiki page 'index' edited (Wiki change comment)", pl.Summary) 358 assert.Len(t, pl.Sections, 1) 359 assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle) 360 assert.Equal(t, "", pl.Sections[0].Text) 361 assert.Len(t, pl.Sections[0].Facts, 2) 362 for _, fact := range pl.Sections[0].Facts { 363 if fact.Name == "Repository:" { 364 assert.Equal(t, p.Repository.FullName, fact.Value) 365 } else { 366 t.Fail() 367 } 368 } 369 assert.Len(t, pl.PotentialAction, 1) 370 assert.Len(t, pl.PotentialAction[0].Targets, 1) 371 assert.Equal(t, "http://localhost:3000/test/repo/wiki/index", pl.PotentialAction[0].Targets[0].URI) 372 373 p.Action = api.HookWikiDeleted 374 pl, err = mc.Wiki(p) 375 require.NoError(t, err) 376 377 assert.Equal(t, "[test/repo] Wiki page 'index' deleted", pl.Title) 378 assert.Equal(t, "[test/repo] Wiki page 'index' deleted", pl.Summary) 379 assert.Len(t, pl.Sections, 1) 380 assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle) 381 assert.Empty(t, pl.Sections[0].Text) 382 assert.Len(t, pl.Sections[0].Facts, 2) 383 for _, fact := range pl.Sections[0].Facts { 384 if fact.Name == "Repository:" { 385 assert.Equal(t, p.Repository.FullName, fact.Value) 386 } else { 387 t.Fail() 388 } 389 } 390 assert.Len(t, pl.PotentialAction, 1) 391 assert.Len(t, pl.PotentialAction[0].Targets, 1) 392 assert.Equal(t, "http://localhost:3000/test/repo/wiki/index", pl.PotentialAction[0].Targets[0].URI) 393 }) 394 395 t.Run("Release", func(t *testing.T) { 396 p := pullReleaseTestPayload() 397 398 pl, err := mc.Release(p) 399 require.NoError(t, err) 400 401 assert.Equal(t, "[test/repo] Release created: v1.0", pl.Title) 402 assert.Equal(t, "[test/repo] Release created: v1.0", pl.Summary) 403 assert.Len(t, pl.Sections, 1) 404 assert.Equal(t, "user1", pl.Sections[0].ActivitySubtitle) 405 assert.Empty(t, pl.Sections[0].Text) 406 assert.Len(t, pl.Sections[0].Facts, 2) 407 for _, fact := range pl.Sections[0].Facts { 408 if fact.Name == "Repository:" { 409 assert.Equal(t, p.Repository.FullName, fact.Value) 410 } else if fact.Name == "Tag:" { 411 assert.Equal(t, "v1.0", fact.Value) 412 } else { 413 t.Fail() 414 } 415 } 416 assert.Len(t, pl.PotentialAction, 1) 417 assert.Len(t, pl.PotentialAction[0].Targets, 1) 418 assert.Equal(t, "http://localhost:3000/test/repo/releases/tag/v1.0", pl.PotentialAction[0].Targets[0].URI) 419 }) 420 } 421 422 func TestMSTeamsJSONPayload(t *testing.T) { 423 p := pushTestPayload() 424 data, err := p.JSONPayload() 425 require.NoError(t, err) 426 427 hook := &webhook_model.Webhook{ 428 RepoID: 3, 429 IsActive: true, 430 Type: webhook_module.MSTEAMS, 431 URL: "https://msteams.example.com/", 432 Meta: ``, 433 HTTPMethod: "POST", 434 } 435 task := &webhook_model.HookTask{ 436 HookID: hook.ID, 437 EventType: webhook_module.HookEventPush, 438 PayloadContent: string(data), 439 PayloadVersion: 2, 440 } 441 442 req, reqBody, err := newMSTeamsRequest(context.Background(), hook, task) 443 require.NotNil(t, req) 444 require.NotNil(t, reqBody) 445 require.NoError(t, err) 446 447 assert.Equal(t, "POST", req.Method) 448 assert.Equal(t, "https://msteams.example.com/", req.URL.String()) 449 assert.Equal(t, "sha256=", req.Header.Get("X-Hub-Signature-256")) 450 assert.Equal(t, "application/json", req.Header.Get("Content-Type")) 451 var body MSTeamsPayload 452 err = json.NewDecoder(req.Body).Decode(&body) 453 assert.NoError(t, err) 454 assert.Equal(t, "[test/repo:test] 2 new commits", body.Summary) 455 }