github.com/mad-app/mattermost-server@v5.11.1+incompatible/api4/webhook_test.go (about) 1 // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package api4 5 6 import ( 7 "testing" 8 9 "github.com/stretchr/testify/assert" 10 "github.com/stretchr/testify/require" 11 12 "github.com/mattermost/mattermost-server/model" 13 ) 14 15 func TestCreateIncomingWebhook(t *testing.T) { 16 th := Setup().InitBasic() 17 defer th.TearDown() 18 Client := th.Client 19 20 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableIncomingWebhooks = true }) 21 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnablePostUsernameOverride = true }) 22 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnablePostIconOverride = true }) 23 24 defaultRolePermissions := th.SaveDefaultRolePermissions() 25 defer func() { 26 th.RestoreDefaultRolePermissions(defaultRolePermissions) 27 }() 28 th.AddPermissionToRole(model.PERMISSION_MANAGE_INCOMING_WEBHOOKS.Id, model.TEAM_ADMIN_ROLE_ID) 29 th.RemovePermissionFromRole(model.PERMISSION_MANAGE_INCOMING_WEBHOOKS.Id, model.TEAM_USER_ROLE_ID) 30 31 hook := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id} 32 33 rhook, resp := th.SystemAdminClient.CreateIncomingWebhook(hook) 34 CheckNoError(t, resp) 35 36 if rhook.ChannelId != hook.ChannelId { 37 t.Fatal("channel ids didn't match") 38 } 39 40 if rhook.UserId != th.SystemAdminUser.Id { 41 t.Fatal("user ids didn't match") 42 } 43 44 if rhook.TeamId != th.BasicTeam.Id { 45 t.Fatal("team ids didn't match") 46 } 47 48 hook.ChannelId = "junk" 49 _, resp = th.SystemAdminClient.CreateIncomingWebhook(hook) 50 CheckNotFoundStatus(t, resp) 51 52 hook.ChannelId = th.BasicChannel.Id 53 th.LoginTeamAdmin() 54 _, resp = Client.CreateIncomingWebhook(hook) 55 CheckNoError(t, resp) 56 57 th.LoginBasic() 58 _, resp = Client.CreateIncomingWebhook(hook) 59 CheckForbiddenStatus(t, resp) 60 61 th.AddPermissionToRole(model.PERMISSION_MANAGE_INCOMING_WEBHOOKS.Id, model.TEAM_USER_ROLE_ID) 62 63 _, resp = Client.CreateIncomingWebhook(hook) 64 CheckNoError(t, resp) 65 66 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnablePostUsernameOverride = false }) 67 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnablePostIconOverride = false }) 68 69 _, resp = Client.CreateIncomingWebhook(hook) 70 CheckNoError(t, resp) 71 72 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableIncomingWebhooks = false }) 73 _, resp = Client.CreateIncomingWebhook(hook) 74 CheckNotImplementedStatus(t, resp) 75 } 76 77 func TestGetIncomingWebhooks(t *testing.T) { 78 th := Setup().InitBasic() 79 defer th.TearDown() 80 Client := th.Client 81 82 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableIncomingWebhooks = true }) 83 84 defaultRolePermissions := th.SaveDefaultRolePermissions() 85 defer func() { 86 th.RestoreDefaultRolePermissions(defaultRolePermissions) 87 }() 88 th.AddPermissionToRole(model.PERMISSION_MANAGE_INCOMING_WEBHOOKS.Id, model.TEAM_ADMIN_ROLE_ID) 89 th.RemovePermissionFromRole(model.PERMISSION_MANAGE_INCOMING_WEBHOOKS.Id, model.TEAM_USER_ROLE_ID) 90 91 hook := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id} 92 rhook, resp := th.SystemAdminClient.CreateIncomingWebhook(hook) 93 CheckNoError(t, resp) 94 95 hooks, resp := th.SystemAdminClient.GetIncomingWebhooks(0, 1000, "") 96 CheckNoError(t, resp) 97 98 found := false 99 for _, h := range hooks { 100 if rhook.Id == h.Id { 101 found = true 102 } 103 } 104 105 if !found { 106 t.Fatal("missing hook") 107 } 108 109 hooks, resp = th.SystemAdminClient.GetIncomingWebhooks(0, 1, "") 110 CheckNoError(t, resp) 111 112 if len(hooks) != 1 { 113 t.Fatal("should only be 1") 114 } 115 116 hooks, resp = th.SystemAdminClient.GetIncomingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") 117 CheckNoError(t, resp) 118 119 found = false 120 for _, h := range hooks { 121 if rhook.Id == h.Id { 122 found = true 123 } 124 } 125 126 if !found { 127 t.Fatal("missing hook") 128 } 129 130 hooks, resp = th.SystemAdminClient.GetIncomingWebhooksForTeam(model.NewId(), 0, 1000, "") 131 CheckNoError(t, resp) 132 133 if len(hooks) != 0 { 134 t.Fatal("no hooks should be returned") 135 } 136 137 _, resp = Client.GetIncomingWebhooks(0, 1000, "") 138 CheckForbiddenStatus(t, resp) 139 140 th.AddPermissionToRole(model.PERMISSION_MANAGE_INCOMING_WEBHOOKS.Id, model.TEAM_USER_ROLE_ID) 141 142 _, resp = Client.GetIncomingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") 143 CheckNoError(t, resp) 144 145 _, resp = Client.GetIncomingWebhooksForTeam(model.NewId(), 0, 1000, "") 146 CheckForbiddenStatus(t, resp) 147 148 _, resp = Client.GetIncomingWebhooks(0, 1000, "") 149 CheckForbiddenStatus(t, resp) 150 151 Client.Logout() 152 _, resp = Client.GetIncomingWebhooks(0, 1000, "") 153 CheckUnauthorizedStatus(t, resp) 154 } 155 156 func TestGetIncomingWebhook(t *testing.T) { 157 th := Setup().InitBasic() 158 defer th.TearDown() 159 Client := th.SystemAdminClient 160 161 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableIncomingWebhooks = true }) 162 163 var resp *model.Response 164 var rhook *model.IncomingWebhook 165 var hook *model.IncomingWebhook 166 167 t.Run("WhenHookExists", func(t *testing.T) { 168 hook = &model.IncomingWebhook{ChannelId: th.BasicChannel.Id} 169 rhook, resp = Client.CreateIncomingWebhook(hook) 170 CheckNoError(t, resp) 171 172 hook, resp = Client.GetIncomingWebhook(rhook.Id, "") 173 CheckOKStatus(t, resp) 174 }) 175 176 t.Run("WhenHookDoesNotExist", func(t *testing.T) { 177 hook, resp = Client.GetIncomingWebhook(model.NewId(), "") 178 CheckNotFoundStatus(t, resp) 179 }) 180 181 t.Run("WhenInvalidHookID", func(t *testing.T) { 182 hook, resp = Client.GetIncomingWebhook("abc", "") 183 CheckBadRequestStatus(t, resp) 184 }) 185 186 t.Run("WhenUserDoesNotHavePemissions", func(t *testing.T) { 187 th.LoginBasic() 188 Client = th.Client 189 190 _, resp = Client.GetIncomingWebhook(rhook.Id, "") 191 CheckForbiddenStatus(t, resp) 192 }) 193 } 194 195 func TestDeleteIncomingWebhook(t *testing.T) { 196 th := Setup().InitBasic() 197 defer th.TearDown() 198 Client := th.SystemAdminClient 199 200 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableIncomingWebhooks = true }) 201 202 var resp *model.Response 203 var rhook *model.IncomingWebhook 204 var hook *model.IncomingWebhook 205 var status bool 206 207 t.Run("WhenInvalidHookID", func(t *testing.T) { 208 status, resp = Client.DeleteIncomingWebhook("abc") 209 CheckBadRequestStatus(t, resp) 210 }) 211 212 t.Run("WhenHookDoesNotExist", func(t *testing.T) { 213 status, resp = Client.DeleteIncomingWebhook(model.NewId()) 214 CheckNotFoundStatus(t, resp) 215 }) 216 217 t.Run("WhenHookExists", func(t *testing.T) { 218 hook = &model.IncomingWebhook{ChannelId: th.BasicChannel.Id} 219 rhook, resp = Client.CreateIncomingWebhook(hook) 220 CheckNoError(t, resp) 221 222 if status, resp = Client.DeleteIncomingWebhook(rhook.Id); !status { 223 t.Fatal("Delete should have succeeded") 224 } else { 225 CheckOKStatus(t, resp) 226 } 227 228 // Get now should not return this deleted hook 229 _, resp = Client.GetIncomingWebhook(rhook.Id, "") 230 CheckNotFoundStatus(t, resp) 231 }) 232 233 t.Run("WhenUserDoesNotHavePemissions", func(t *testing.T) { 234 hook = &model.IncomingWebhook{ChannelId: th.BasicChannel.Id} 235 rhook, resp = Client.CreateIncomingWebhook(hook) 236 CheckNoError(t, resp) 237 238 th.LoginBasic() 239 Client = th.Client 240 241 _, resp = Client.DeleteIncomingWebhook(rhook.Id) 242 CheckForbiddenStatus(t, resp) 243 }) 244 } 245 246 func TestCreateOutgoingWebhook(t *testing.T) { 247 th := Setup().InitBasic() 248 defer th.TearDown() 249 Client := th.Client 250 251 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOutgoingWebhooks = true }) 252 253 defaultRolePermissions := th.SaveDefaultRolePermissions() 254 defer func() { 255 th.RestoreDefaultRolePermissions(defaultRolePermissions) 256 }() 257 th.AddPermissionToRole(model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS.Id, model.TEAM_ADMIN_ROLE_ID) 258 th.RemovePermissionFromRole(model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS.Id, model.TEAM_USER_ROLE_ID) 259 260 hook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}, Username: "some-user-name", IconURL: "http://some-icon-url/"} 261 262 rhook, resp := th.SystemAdminClient.CreateOutgoingWebhook(hook) 263 CheckNoError(t, resp) 264 265 if rhook.ChannelId != hook.ChannelId { 266 t.Fatal("channel ids didn't match") 267 } else if rhook.CreatorId != th.SystemAdminUser.Id { 268 t.Fatal("user ids didn't match") 269 } else if rhook.TeamId != th.BasicChannel.TeamId { 270 t.Fatal("team ids didn't match") 271 } 272 273 hook.ChannelId = "junk" 274 _, resp = th.SystemAdminClient.CreateOutgoingWebhook(hook) 275 CheckNotFoundStatus(t, resp) 276 277 hook.ChannelId = th.BasicChannel.Id 278 th.LoginTeamAdmin() 279 _, resp = Client.CreateOutgoingWebhook(hook) 280 CheckNoError(t, resp) 281 282 th.LoginBasic() 283 _, resp = Client.CreateOutgoingWebhook(hook) 284 CheckForbiddenStatus(t, resp) 285 286 th.AddPermissionToRole(model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS.Id, model.TEAM_USER_ROLE_ID) 287 288 _, resp = Client.CreateOutgoingWebhook(hook) 289 CheckNoError(t, resp) 290 291 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOutgoingWebhooks = false }) 292 _, resp = Client.CreateOutgoingWebhook(hook) 293 CheckNotImplementedStatus(t, resp) 294 } 295 296 func TestGetOutgoingWebhooks(t *testing.T) { 297 th := Setup().InitBasic() 298 defer th.TearDown() 299 Client := th.Client 300 301 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOutgoingWebhooks = true }) 302 defaultRolePermissions := th.SaveDefaultRolePermissions() 303 defer func() { 304 th.RestoreDefaultRolePermissions(defaultRolePermissions) 305 }() 306 th.AddPermissionToRole(model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS.Id, model.TEAM_ADMIN_ROLE_ID) 307 th.RemovePermissionFromRole(model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS.Id, model.TEAM_USER_ROLE_ID) 308 309 hook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}} 310 rhook, resp := th.SystemAdminClient.CreateOutgoingWebhook(hook) 311 CheckNoError(t, resp) 312 313 hooks, resp := th.SystemAdminClient.GetOutgoingWebhooks(0, 1000, "") 314 CheckNoError(t, resp) 315 316 found := false 317 for _, h := range hooks { 318 if rhook.Id == h.Id { 319 found = true 320 } 321 } 322 323 if !found { 324 t.Fatal("missing hook") 325 } 326 327 hooks, resp = th.SystemAdminClient.GetOutgoingWebhooks(0, 1, "") 328 CheckNoError(t, resp) 329 330 if len(hooks) != 1 { 331 t.Fatal("should only be 1") 332 } 333 334 hooks, resp = th.SystemAdminClient.GetOutgoingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") 335 CheckNoError(t, resp) 336 337 found = false 338 for _, h := range hooks { 339 if rhook.Id == h.Id { 340 found = true 341 } 342 } 343 344 if !found { 345 t.Fatal("missing hook") 346 } 347 348 hooks, resp = th.SystemAdminClient.GetOutgoingWebhooksForTeam(model.NewId(), 0, 1000, "") 349 CheckNoError(t, resp) 350 351 if len(hooks) != 0 { 352 t.Fatal("no hooks should be returned") 353 } 354 355 hooks, resp = th.SystemAdminClient.GetOutgoingWebhooksForChannel(th.BasicChannel.Id, 0, 1000, "") 356 CheckNoError(t, resp) 357 358 found = false 359 for _, h := range hooks { 360 if rhook.Id == h.Id { 361 found = true 362 } 363 } 364 365 if !found { 366 t.Fatal("missing hook") 367 } 368 369 _, resp = th.SystemAdminClient.GetOutgoingWebhooksForChannel(model.NewId(), 0, 1000, "") 370 CheckForbiddenStatus(t, resp) 371 372 _, resp = Client.GetOutgoingWebhooks(0, 1000, "") 373 CheckForbiddenStatus(t, resp) 374 375 th.AddPermissionToRole(model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS.Id, model.TEAM_USER_ROLE_ID) 376 377 _, resp = Client.GetOutgoingWebhooksForTeam(th.BasicTeam.Id, 0, 1000, "") 378 CheckNoError(t, resp) 379 380 _, resp = Client.GetOutgoingWebhooksForTeam(model.NewId(), 0, 1000, "") 381 CheckForbiddenStatus(t, resp) 382 383 _, resp = Client.GetOutgoingWebhooksForChannel(th.BasicChannel.Id, 0, 1000, "") 384 CheckNoError(t, resp) 385 386 _, resp = Client.GetOutgoingWebhooksForChannel(model.NewId(), 0, 1000, "") 387 CheckForbiddenStatus(t, resp) 388 389 _, resp = Client.GetOutgoingWebhooks(0, 1000, "") 390 CheckForbiddenStatus(t, resp) 391 392 Client.Logout() 393 _, resp = Client.GetOutgoingWebhooks(0, 1000, "") 394 CheckUnauthorizedStatus(t, resp) 395 } 396 397 func TestGetOutgoingWebhook(t *testing.T) { 398 th := Setup().InitBasic() 399 defer th.TearDown() 400 Client := th.Client 401 402 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOutgoingWebhooks = true }) 403 404 hook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}} 405 406 rhook, resp := th.SystemAdminClient.CreateOutgoingWebhook(hook) 407 CheckNoError(t, resp) 408 409 getHook, resp := th.SystemAdminClient.GetOutgoingWebhook(rhook.Id) 410 CheckNoError(t, resp) 411 if getHook.Id != rhook.Id { 412 t.Fatal("failed to retrieve the correct outgoing hook") 413 } 414 415 _, resp = Client.GetOutgoingWebhook(rhook.Id) 416 CheckForbiddenStatus(t, resp) 417 418 nonExistentHook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id} 419 _, resp = th.SystemAdminClient.GetOutgoingWebhook(nonExistentHook.Id) 420 CheckNotFoundStatus(t, resp) 421 422 nonExistentHook.Id = model.NewId() 423 _, resp = th.SystemAdminClient.GetOutgoingWebhook(nonExistentHook.Id) 424 CheckInternalErrorStatus(t, resp) 425 } 426 427 func TestUpdateIncomingHook(t *testing.T) { 428 th := Setup().InitBasic() 429 defer th.TearDown() 430 Client := th.Client 431 432 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableIncomingWebhooks = true }) 433 434 defaultRolePermissions := th.SaveDefaultRolePermissions() 435 defer func() { 436 th.RestoreDefaultRolePermissions(defaultRolePermissions) 437 }() 438 th.AddPermissionToRole(model.PERMISSION_MANAGE_INCOMING_WEBHOOKS.Id, model.TEAM_ADMIN_ROLE_ID) 439 th.RemovePermissionFromRole(model.PERMISSION_MANAGE_INCOMING_WEBHOOKS.Id, model.TEAM_USER_ROLE_ID) 440 441 hook1 := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id} 442 443 createdHook, resp := th.SystemAdminClient.CreateIncomingWebhook(hook1) 444 CheckNoError(t, resp) 445 446 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnablePostUsernameOverride = false }) 447 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnablePostIconOverride = false }) 448 449 t.Run("UpdateIncomingHook, overrides disabled", func(t *testing.T) { 450 createdHook.DisplayName = "hook2" 451 createdHook.Description = "description" 452 createdHook.ChannelId = th.BasicChannel2.Id 453 createdHook.Username = "username" 454 createdHook.IconURL = "icon" 455 456 updatedHook, resp := th.SystemAdminClient.UpdateIncomingWebhook(createdHook) 457 CheckNoError(t, resp) 458 if updatedHook != nil { 459 if updatedHook.DisplayName != "hook2" { 460 t.Fatal("Hook name is not updated") 461 } 462 463 if updatedHook.Description != "description" { 464 t.Fatal("Hook description is not updated") 465 } 466 467 if updatedHook.ChannelId != th.BasicChannel2.Id { 468 t.Fatal("Hook channel is not updated") 469 } 470 471 if updatedHook.Username != "" { 472 t.Fatal("Hook username was incorrectly updated") 473 } 474 475 if updatedHook.IconURL != "" { 476 t.Fatal("Hook icon was incorrectly updated") 477 } 478 } else { 479 t.Fatal("should not be nil") 480 } 481 482 //updatedHook, _ = th.App.GetIncomingWebhook(createdHook.Id) 483 assert.Equal(t, updatedHook.ChannelId, createdHook.ChannelId) 484 }) 485 486 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnablePostUsernameOverride = true }) 487 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnablePostIconOverride = true }) 488 489 t.Run("UpdateIncomingHook", func(t *testing.T) { 490 createdHook.DisplayName = "hook2" 491 createdHook.Description = "description" 492 createdHook.ChannelId = th.BasicChannel2.Id 493 createdHook.Username = "username" 494 createdHook.IconURL = "icon" 495 496 updatedHook, resp := th.SystemAdminClient.UpdateIncomingWebhook(createdHook) 497 CheckNoError(t, resp) 498 if updatedHook != nil { 499 if updatedHook.DisplayName != "hook2" { 500 t.Fatal("Hook name is not updated") 501 } 502 503 if updatedHook.Description != "description" { 504 t.Fatal("Hook description is not updated") 505 } 506 507 if updatedHook.ChannelId != th.BasicChannel2.Id { 508 t.Fatal("Hook channel is not updated") 509 } 510 511 if updatedHook.Username != "username" { 512 t.Fatal("Hook username is not updated") 513 } 514 515 if updatedHook.IconURL != "icon" { 516 t.Fatal("Hook icon is not updated") 517 } 518 } else { 519 t.Fatal("should not be nil") 520 } 521 522 //updatedHook, _ = th.App.GetIncomingWebhook(createdHook.Id) 523 assert.Equal(t, updatedHook.ChannelId, createdHook.ChannelId) 524 }) 525 526 t.Run("RetainCreateAt", func(t *testing.T) { 527 hook2 := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id, CreateAt: 100} 528 529 createdHook2, resp := th.SystemAdminClient.CreateIncomingWebhook(hook2) 530 CheckNoError(t, resp) 531 532 createdHook2.DisplayName = "Name2" 533 534 updatedHook, resp := th.SystemAdminClient.UpdateIncomingWebhook(createdHook2) 535 CheckNoError(t, resp) 536 require.NotNil(t, updatedHook) 537 assert.Equal(t, createdHook2.CreateAt, updatedHook.CreateAt) 538 }) 539 540 t.Run("ModifyUpdateAt", func(t *testing.T) { 541 createdHook.DisplayName = "Name3" 542 543 updatedHook, resp := th.SystemAdminClient.UpdateIncomingWebhook(createdHook) 544 CheckNoError(t, resp) 545 if updatedHook != nil { 546 if updatedHook.UpdateAt == createdHook.UpdateAt { 547 t.Fatal("failed - hook updateAt is not updated") 548 } 549 } else { 550 t.Fatal("should not be nil") 551 } 552 }) 553 554 t.Run("UpdateNonExistentHook", func(t *testing.T) { 555 nonExistentHook := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id} 556 557 _, resp := th.SystemAdminClient.UpdateIncomingWebhook(nonExistentHook) 558 CheckNotFoundStatus(t, resp) 559 560 nonExistentHook.Id = model.NewId() 561 _, resp = th.SystemAdminClient.UpdateIncomingWebhook(nonExistentHook) 562 CheckNotFoundStatus(t, resp) 563 }) 564 565 t.Run("UserIsNotAdminOfTeam", func(t *testing.T) { 566 _, resp := Client.UpdateIncomingWebhook(createdHook) 567 CheckForbiddenStatus(t, resp) 568 }) 569 570 th.RemovePermissionFromRole(model.PERMISSION_MANAGE_INCOMING_WEBHOOKS.Id, model.TEAM_USER_ROLE_ID) 571 th.AddPermissionToRole(model.PERMISSION_MANAGE_INCOMING_WEBHOOKS.Id, model.TEAM_ADMIN_ROLE_ID) 572 573 t.Run("OnlyAdminIntegrationsDisabled", func(t *testing.T) { 574 th.AddPermissionToRole(model.PERMISSION_MANAGE_INCOMING_WEBHOOKS.Id, model.TEAM_USER_ROLE_ID) 575 576 t.Run("UpdateHookOfSameUser", func(t *testing.T) { 577 sameUserHook := &model.IncomingWebhook{ChannelId: th.BasicChannel.Id, UserId: th.BasicUser2.Id} 578 579 sameUserHook, resp := Client.CreateIncomingWebhook(sameUserHook) 580 CheckNoError(t, resp) 581 582 _, resp = Client.UpdateIncomingWebhook(sameUserHook) 583 CheckNoError(t, resp) 584 }) 585 586 t.Run("UpdateHookOfDifferentUser", func(t *testing.T) { 587 _, resp := Client.UpdateIncomingWebhook(createdHook) 588 CheckForbiddenStatus(t, resp) 589 }) 590 }) 591 592 th.RemovePermissionFromRole(model.PERMISSION_MANAGE_INCOMING_WEBHOOKS.Id, model.TEAM_USER_ROLE_ID) 593 th.AddPermissionToRole(model.PERMISSION_MANAGE_INCOMING_WEBHOOKS.Id, model.TEAM_ADMIN_ROLE_ID) 594 595 Client.Logout() 596 th.UpdateUserToTeamAdmin(th.BasicUser2, th.BasicTeam) 597 th.LoginBasic2() 598 t.Run("UpdateByDifferentUser", func(t *testing.T) { 599 updatedHook, resp := Client.UpdateIncomingWebhook(createdHook) 600 CheckNoError(t, resp) 601 if updatedHook.UserId == th.BasicUser2.Id { 602 t.Fatal("Hook's creator userId is not retained") 603 } 604 }) 605 606 t.Run("IncomingHooksDisabled", func(t *testing.T) { 607 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableIncomingWebhooks = false }) 608 _, resp := Client.UpdateIncomingWebhook(createdHook) 609 CheckNotImplementedStatus(t, resp) 610 CheckErrorMessage(t, resp, "api.incoming_webhook.disabled.app_error") 611 }) 612 613 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableIncomingWebhooks = true }) 614 615 t.Run("PrivateChannel", func(t *testing.T) { 616 privateChannel := th.CreatePrivateChannel() 617 Client.Logout() 618 th.LoginBasic() 619 createdHook.ChannelId = privateChannel.Id 620 621 _, resp := Client.UpdateIncomingWebhook(createdHook) 622 CheckForbiddenStatus(t, resp) 623 }) 624 625 t.Run("UpdateToNonExistentChannel", func(t *testing.T) { 626 createdHook.ChannelId = "junk" 627 _, resp := th.SystemAdminClient.UpdateIncomingWebhook(createdHook) 628 CheckNotFoundStatus(t, resp) 629 }) 630 631 team := th.CreateTeamWithClient(Client) 632 user := th.CreateUserWithClient(Client) 633 th.LinkUserToTeam(user, team) 634 Client.Logout() 635 Client.Login(user.Id, user.Password) 636 t.Run("UpdateToADifferentTeam", func(t *testing.T) { 637 _, resp := Client.UpdateIncomingWebhook(createdHook) 638 CheckUnauthorizedStatus(t, resp) 639 }) 640 } 641 642 func TestRegenOutgoingHookToken(t *testing.T) { 643 th := Setup().InitBasic() 644 defer th.TearDown() 645 Client := th.Client 646 647 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOutgoingWebhooks = true }) 648 649 hook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, CallbackURLs: []string{"http://nowhere.com"}} 650 rhook, resp := th.SystemAdminClient.CreateOutgoingWebhook(hook) 651 CheckNoError(t, resp) 652 653 _, resp = th.SystemAdminClient.RegenOutgoingHookToken("junk") 654 CheckBadRequestStatus(t, resp) 655 656 //investigate why is act weird on jenkins 657 // _, resp = th.SystemAdminClient.RegenOutgoingHookToken("") 658 // CheckNotFoundStatus(t, resp) 659 660 regenHookToken, resp := th.SystemAdminClient.RegenOutgoingHookToken(rhook.Id) 661 CheckNoError(t, resp) 662 if regenHookToken.Token == rhook.Token { 663 t.Fatal("regen didn't work properly") 664 } 665 666 _, resp = Client.RegenOutgoingHookToken(rhook.Id) 667 CheckForbiddenStatus(t, resp) 668 669 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOutgoingWebhooks = false }) 670 _, resp = th.SystemAdminClient.RegenOutgoingHookToken(rhook.Id) 671 CheckNotImplementedStatus(t, resp) 672 } 673 674 func TestUpdateOutgoingHook(t *testing.T) { 675 th := Setup().InitBasic() 676 defer th.TearDown() 677 Client := th.Client 678 679 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOutgoingWebhooks = true }) 680 defaultRolePermissions := th.SaveDefaultRolePermissions() 681 defer func() { 682 th.RestoreDefaultRolePermissions(defaultRolePermissions) 683 }() 684 th.AddPermissionToRole(model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS.Id, model.TEAM_ADMIN_ROLE_ID) 685 th.RemovePermissionFromRole(model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS.Id, model.TEAM_USER_ROLE_ID) 686 687 createdHook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, 688 CallbackURLs: []string{"http://nowhere.com"}, TriggerWords: []string{"cats"}} 689 690 createdHook, webookResp := th.SystemAdminClient.CreateOutgoingWebhook(createdHook) 691 CheckNoError(t, webookResp) 692 693 t.Run("UpdateOutgoingWebhook", func(t *testing.T) { 694 createdHook.DisplayName = "Cats" 695 createdHook.Description = "Get me some cats" 696 697 updatedHook, resp := th.SystemAdminClient.UpdateOutgoingWebhook(createdHook) 698 CheckNoError(t, resp) 699 if updatedHook.DisplayName != "Cats" { 700 t.Fatal("did not update") 701 } 702 if updatedHook.Description != "Get me some cats" { 703 t.Fatal("did not update") 704 } 705 }) 706 707 t.Run("OutgoingHooksDisabled", func(t *testing.T) { 708 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOutgoingWebhooks = false }) 709 _, resp := th.SystemAdminClient.UpdateOutgoingWebhook(createdHook) 710 CheckNotImplementedStatus(t, resp) 711 }) 712 713 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableOutgoingWebhooks = true }) 714 t.Run("RetainCreateAt", func(t *testing.T) { 715 hook2 := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, 716 CallbackURLs: []string{"http://nowhere.com"}, TriggerWords: []string{"rats"}} 717 718 createdHook2, resp := th.SystemAdminClient.CreateOutgoingWebhook(hook2) 719 CheckNoError(t, resp) 720 createdHook2.DisplayName = "Name2" 721 722 updatedHook2, resp := th.SystemAdminClient.UpdateOutgoingWebhook(createdHook2) 723 CheckNoError(t, resp) 724 725 if updatedHook2.CreateAt != createdHook2.CreateAt { 726 t.Fatal("failed - hook create at should not be changed") 727 } 728 }) 729 730 t.Run("ModifyUpdateAt", func(t *testing.T) { 731 createdHook.DisplayName = "Name3" 732 733 updatedHook2, resp := th.SystemAdminClient.UpdateOutgoingWebhook(createdHook) 734 CheckNoError(t, resp) 735 736 if updatedHook2.UpdateAt == createdHook.UpdateAt { 737 t.Fatal("failed - hook updateAt is not updated") 738 } 739 }) 740 741 t.Run("UpdateNonExistentHook", func(t *testing.T) { 742 nonExistentHook := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, 743 CallbackURLs: []string{"http://nowhere.com"}, TriggerWords: []string{"rats"}} 744 745 _, resp := th.SystemAdminClient.UpdateOutgoingWebhook(nonExistentHook) 746 CheckNotFoundStatus(t, resp) 747 748 nonExistentHook.Id = model.NewId() 749 _, resp = th.SystemAdminClient.UpdateOutgoingWebhook(nonExistentHook) 750 CheckInternalErrorStatus(t, resp) 751 }) 752 753 t.Run("UserIsNotAdminOfTeam", func(t *testing.T) { 754 _, resp := Client.UpdateOutgoingWebhook(createdHook) 755 CheckForbiddenStatus(t, resp) 756 }) 757 758 th.AddPermissionToRole(model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS.Id, model.TEAM_USER_ROLE_ID) 759 hook2 := &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, 760 CallbackURLs: []string{"http://nowhere.com"}, TriggerWords: []string{"rats2"}} 761 762 createdHook2, resp := th.SystemAdminClient.CreateOutgoingWebhook(hook2) 763 CheckNoError(t, resp) 764 765 _, resp = Client.UpdateOutgoingWebhook(createdHook2) 766 CheckForbiddenStatus(t, resp) 767 768 th.RemovePermissionFromRole(model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS.Id, model.TEAM_USER_ROLE_ID) 769 th.AddPermissionToRole(model.PERMISSION_MANAGE_OUTGOING_WEBHOOKS.Id, model.TEAM_ADMIN_ROLE_ID) 770 771 Client.Logout() 772 th.UpdateUserToTeamAdmin(th.BasicUser2, th.BasicTeam) 773 th.LoginBasic2() 774 t.Run("RetainHookCreator", func(t *testing.T) { 775 createdHook.DisplayName = "Basic user 2" 776 updatedHook, resp := Client.UpdateOutgoingWebhook(createdHook) 777 CheckNoError(t, resp) 778 if updatedHook.DisplayName != "Basic user 2" { 779 t.Fatal("should apply the change") 780 } 781 if updatedHook.CreatorId != th.SystemAdminUser.Id { 782 t.Fatal("hook creator should not be changed") 783 } 784 }) 785 786 t.Run("UpdateToExistingTriggerWordAndCallback", func(t *testing.T) { 787 t.Run("OnSameChannel", func(t *testing.T) { 788 createdHook.TriggerWords = []string{"rats"} 789 790 _, resp := th.SystemAdminClient.UpdateOutgoingWebhook(createdHook) 791 CheckBadRequestStatus(t, resp) 792 }) 793 794 t.Run("OnDifferentChannel", func(t *testing.T) { 795 createdHook.TriggerWords = []string{"cats"} 796 createdHook.ChannelId = th.BasicChannel2.Id 797 798 _, resp := th.SystemAdminClient.UpdateOutgoingWebhook(createdHook) 799 CheckNoError(t, resp) 800 }) 801 }) 802 803 t.Run("UpdateToNonExistentChannel", func(t *testing.T) { 804 createdHook.ChannelId = "junk" 805 806 _, resp := th.SystemAdminClient.UpdateOutgoingWebhook(createdHook) 807 CheckNotFoundStatus(t, resp) 808 }) 809 810 t.Run("UpdateToPrivateChannel", func(t *testing.T) { 811 privateChannel := th.CreatePrivateChannel() 812 createdHook.ChannelId = privateChannel.Id 813 814 _, resp := th.SystemAdminClient.UpdateOutgoingWebhook(createdHook) 815 CheckForbiddenStatus(t, resp) 816 }) 817 818 t.Run("UpdateToBlankTriggerWordAndChannel", func(t *testing.T) { 819 createdHook.ChannelId = "" 820 createdHook.TriggerWords = nil 821 822 _, resp := th.SystemAdminClient.UpdateOutgoingWebhook(createdHook) 823 CheckInternalErrorStatus(t, resp) 824 }) 825 826 team := th.CreateTeamWithClient(Client) 827 user := th.CreateUserWithClient(Client) 828 th.LinkUserToTeam(user, team) 829 Client.Logout() 830 Client.Login(user.Id, user.Password) 831 t.Run("UpdateToADifferentTeam", func(t *testing.T) { 832 _, resp := Client.UpdateOutgoingWebhook(createdHook) 833 CheckUnauthorizedStatus(t, resp) 834 }) 835 } 836 837 func TestDeleteOutgoingHook(t *testing.T) { 838 th := Setup().InitBasic() 839 defer th.TearDown() 840 Client := th.SystemAdminClient 841 842 th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.EnableIncomingWebhooks = true }) 843 844 var resp *model.Response 845 var rhook *model.OutgoingWebhook 846 var hook *model.OutgoingWebhook 847 var status bool 848 849 t.Run("WhenInvalidHookID", func(t *testing.T) { 850 status, resp = Client.DeleteOutgoingWebhook("abc") 851 CheckBadRequestStatus(t, resp) 852 }) 853 854 t.Run("WhenHookDoesNotExist", func(t *testing.T) { 855 status, resp = Client.DeleteOutgoingWebhook(model.NewId()) 856 CheckInternalErrorStatus(t, resp) 857 }) 858 859 t.Run("WhenHookExists", func(t *testing.T) { 860 hook = &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, 861 CallbackURLs: []string{"http://nowhere.com"}, TriggerWords: []string{"cats"}} 862 rhook, resp = Client.CreateOutgoingWebhook(hook) 863 CheckNoError(t, resp) 864 865 if status, resp = Client.DeleteOutgoingWebhook(rhook.Id); !status { 866 t.Fatal("Delete should have succeeded") 867 } else { 868 CheckOKStatus(t, resp) 869 } 870 871 // Get now should not return this deleted hook 872 _, resp = Client.GetIncomingWebhook(rhook.Id, "") 873 CheckNotFoundStatus(t, resp) 874 }) 875 876 t.Run("WhenUserDoesNotHavePemissions", func(t *testing.T) { 877 hook = &model.OutgoingWebhook{ChannelId: th.BasicChannel.Id, TeamId: th.BasicChannel.TeamId, 878 CallbackURLs: []string{"http://nowhere.com"}, TriggerWords: []string{"dogs"}} 879 rhook, resp = Client.CreateOutgoingWebhook(hook) 880 CheckNoError(t, resp) 881 882 th.LoginBasic() 883 Client = th.Client 884 885 _, resp = Client.DeleteOutgoingWebhook(rhook.Id) 886 CheckForbiddenStatus(t, resp) 887 }) 888 }