github.com/haalcala/mattermost-server-change-repo@v0.0.0-20210713015153-16753fbeee5f/store/sqlstore/integrity_test.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package sqlstore 5 6 import ( 7 "testing" 8 9 "github.com/stretchr/testify/require" 10 11 "github.com/mattermost/mattermost-server/v5/model" 12 "github.com/mattermost/mattermost-server/v5/store" 13 ) 14 15 func createAudit(ss store.Store, userId, sessionId string) *model.Audit { 16 audit := model.Audit{ 17 UserId: userId, 18 SessionId: sessionId, 19 IpAddress: "ipaddress", 20 Action: "Action", 21 } 22 ss.Audit().Save(&audit) 23 return &audit 24 } 25 26 func createChannel(ss store.Store, teamId, creatorId string) *model.Channel { 27 m := model.Channel{} 28 m.TeamId = teamId 29 m.CreatorId = creatorId 30 m.DisplayName = "Name" 31 m.Name = "zz" + model.NewId() + "b" 32 m.Type = model.CHANNEL_OPEN 33 c, _ := ss.Channel().Save(&m, -1) 34 return c 35 } 36 37 func createChannelWithSchemeId(ss store.Store, schemeId *string) *model.Channel { 38 m := model.Channel{} 39 m.SchemeId = schemeId 40 m.TeamId = model.NewId() 41 m.CreatorId = model.NewId() 42 m.DisplayName = "Name" 43 m.Name = "zz" + model.NewId() + "b" 44 m.Type = model.CHANNEL_OPEN 45 c, _ := ss.Channel().Save(&m, -1) 46 return c 47 } 48 49 func createCommand(ss store.Store, userId, teamId string) *model.Command { 50 m := model.Command{} 51 m.CreatorId = userId 52 m.Method = model.COMMAND_METHOD_POST 53 m.TeamId = teamId 54 m.URL = "http://nowhere.com/" 55 m.Trigger = "trigger" 56 cmd, _ := ss.Command().Save(&m) 57 return cmd 58 } 59 60 func createChannelMember(ss store.Store, channelId, userId string) *model.ChannelMember { 61 m := model.ChannelMember{} 62 m.ChannelId = channelId 63 m.UserId = userId 64 m.NotifyProps = model.GetDefaultChannelNotifyProps() 65 cm, _ := ss.Channel().SaveMember(&m) 66 return cm 67 } 68 69 func createChannelMemberHistory(ss store.Store, channelId, userId string) *model.ChannelMemberHistory { 70 m := model.ChannelMemberHistory{} 71 m.ChannelId = channelId 72 m.UserId = userId 73 ss.ChannelMemberHistory().LogJoinEvent(userId, channelId, model.GetMillis()) 74 return &m 75 } 76 77 func createChannelWithTeamId(ss store.Store, id string) *model.Channel { 78 return createChannel(ss, id, model.NewId()) 79 } 80 81 func createChannelWithCreatorId(ss store.Store, id string) *model.Channel { 82 return createChannel(ss, model.NewId(), id) 83 } 84 85 func createChannelMemberWithChannelId(ss store.Store, id string) *model.ChannelMember { 86 return createChannelMember(ss, id, model.NewId()) 87 } 88 89 func createCommandWebhook(ss store.Store, commandId, userId, channelId string) *model.CommandWebhook { 90 m := model.CommandWebhook{} 91 m.CommandId = commandId 92 m.UserId = userId 93 m.ChannelId = channelId 94 cwh, _ := ss.CommandWebhook().Save(&m) 95 return cwh 96 } 97 98 func createCompliance(ss store.Store, userId string) *model.Compliance { 99 m := model.Compliance{} 100 m.UserId = userId 101 m.Desc = "Audit" 102 m.Status = model.COMPLIANCE_STATUS_FAILED 103 m.StartAt = model.GetMillis() - 1 104 m.EndAt = model.GetMillis() + 1 105 m.Type = model.COMPLIANCE_TYPE_ADHOC 106 c, _ := ss.Compliance().Save(&m) 107 return c 108 } 109 110 func createEmoji(ss store.Store, userId string) *model.Emoji { 111 m := model.Emoji{} 112 m.CreatorId = userId 113 m.Name = "emoji" 114 emoji, _ := ss.Emoji().Save(&m) 115 return emoji 116 } 117 118 func createFileInfo(ss store.Store, postId, userId string) *model.FileInfo { 119 m := model.FileInfo{} 120 m.PostId = postId 121 m.CreatorId = userId 122 m.Path = "some/path/to/file" 123 info, _ := ss.FileInfo().Save(&m) 124 return info 125 } 126 127 func createIncomingWebhook(ss store.Store, userId, channelId, teamId string) *model.IncomingWebhook { 128 m := model.IncomingWebhook{} 129 m.UserId = userId 130 m.ChannelId = channelId 131 m.TeamId = teamId 132 wh, _ := ss.Webhook().SaveIncoming(&m) 133 return wh 134 } 135 136 func createOAuthAccessData(ss store.Store, userId string) *model.AccessData { 137 m := model.AccessData{} 138 m.ClientId = model.NewId() 139 m.UserId = userId 140 m.Token = model.NewId() 141 m.RefreshToken = model.NewId() 142 m.RedirectUri = "http://example.com" 143 ad, _ := ss.OAuth().SaveAccessData(&m) 144 return ad 145 } 146 147 func createOAuthApp(ss store.Store, userId string) *model.OAuthApp { 148 m := model.OAuthApp{} 149 m.CreatorId = userId 150 m.CallbackUrls = []string{"https://nowhere.com"} 151 m.Homepage = "https://nowhere.com" 152 m.Id = "" 153 m.Name = "TestApp" + model.NewId() 154 app, _ := ss.OAuth().SaveApp(&m) 155 return app 156 } 157 158 func createOAuthAuthData(ss store.Store, userId string) *model.AuthData { 159 m := model.AuthData{} 160 m.ClientId = model.NewId() 161 m.UserId = userId 162 m.Code = model.NewId() 163 m.RedirectUri = "http://example.com" 164 ad, _ := ss.OAuth().SaveAuthData(&m) 165 return ad 166 } 167 168 func createOutgoingWebhook(ss store.Store, userId, channelId, teamId string) *model.OutgoingWebhook { 169 m := model.OutgoingWebhook{} 170 m.CreatorId = userId 171 m.ChannelId = channelId 172 m.TeamId = teamId 173 m.Token = model.NewId() 174 m.CallbackURLs = []string{"http://nowhere.com/"} 175 wh, _ := ss.Webhook().SaveOutgoing(&m) 176 return wh 177 } 178 179 func createPost(ss store.Store, channelId, userId, rootId, parentId string) *model.Post { 180 m := model.Post{} 181 m.ChannelId = channelId 182 m.UserId = userId 183 m.RootId = rootId 184 m.ParentId = parentId 185 m.Message = "zz" + model.NewId() + "b" 186 p, _ := ss.Post().Save(&m) 187 return p 188 } 189 190 func createPostWithChannelId(ss store.Store, id string) *model.Post { 191 return createPost(ss, id, model.NewId(), "", "") 192 } 193 194 func createPostWithUserId(ss store.Store, id string) *model.Post { 195 return createPost(ss, model.NewId(), id, "", "") 196 } 197 198 func createPreferences(ss store.Store, userId string) *model.Preferences { 199 preferences := model.Preferences{ 200 { 201 UserId: userId, 202 Name: model.NewId(), 203 Category: model.PREFERENCE_CATEGORY_DIRECT_CHANNEL_SHOW, 204 Value: "somevalue", 205 }, 206 } 207 ss.Preference().Save(&preferences) 208 return &preferences 209 } 210 211 func createReaction(ss store.Store, userId, postId string) *model.Reaction { 212 reaction := &model.Reaction{ 213 UserId: userId, 214 PostId: postId, 215 EmojiName: model.NewId(), 216 } 217 reaction, _ = ss.Reaction().Save(reaction) 218 return reaction 219 } 220 221 func createDefaultRoles(ss store.Store) { 222 ss.Role().Save(&model.Role{ 223 Name: model.TEAM_ADMIN_ROLE_ID, 224 DisplayName: model.TEAM_ADMIN_ROLE_ID, 225 Permissions: []string{ 226 model.PERMISSION_DELETE_OTHERS_POSTS.Id, 227 }, 228 }) 229 230 ss.Role().Save(&model.Role{ 231 Name: model.TEAM_USER_ROLE_ID, 232 DisplayName: model.TEAM_USER_ROLE_ID, 233 Permissions: []string{ 234 model.PERMISSION_VIEW_TEAM.Id, 235 model.PERMISSION_ADD_USER_TO_TEAM.Id, 236 }, 237 }) 238 239 ss.Role().Save(&model.Role{ 240 Name: model.TEAM_GUEST_ROLE_ID, 241 DisplayName: model.TEAM_GUEST_ROLE_ID, 242 Permissions: []string{ 243 model.PERMISSION_VIEW_TEAM.Id, 244 }, 245 }) 246 247 ss.Role().Save(&model.Role{ 248 Name: model.CHANNEL_ADMIN_ROLE_ID, 249 DisplayName: model.CHANNEL_ADMIN_ROLE_ID, 250 Permissions: []string{ 251 model.PERMISSION_MANAGE_PUBLIC_CHANNEL_MEMBERS.Id, 252 model.PERMISSION_MANAGE_PRIVATE_CHANNEL_MEMBERS.Id, 253 }, 254 }) 255 256 ss.Role().Save(&model.Role{ 257 Name: model.CHANNEL_USER_ROLE_ID, 258 DisplayName: model.CHANNEL_USER_ROLE_ID, 259 Permissions: []string{ 260 model.PERMISSION_READ_CHANNEL.Id, 261 model.PERMISSION_CREATE_POST.Id, 262 }, 263 }) 264 265 ss.Role().Save(&model.Role{ 266 Name: model.CHANNEL_GUEST_ROLE_ID, 267 DisplayName: model.CHANNEL_GUEST_ROLE_ID, 268 Permissions: []string{ 269 model.PERMISSION_READ_CHANNEL.Id, 270 model.PERMISSION_CREATE_POST.Id, 271 }, 272 }) 273 } 274 275 func createScheme(ss store.Store) *model.Scheme { 276 m := model.Scheme{} 277 m.DisplayName = model.NewId() 278 m.Name = model.NewId() 279 m.Description = model.NewId() 280 m.Scope = model.SCHEME_SCOPE_CHANNEL 281 s, _ := ss.Scheme().Save(&m) 282 return s 283 } 284 285 func createSession(ss store.Store, userId string) *model.Session { 286 m := model.Session{} 287 m.UserId = userId 288 s, _ := ss.Session().Save(&m) 289 return s 290 } 291 292 func createStatus(ss store.Store, userId string) *model.Status { 293 m := model.Status{} 294 m.UserId = userId 295 m.Status = model.STATUS_ONLINE 296 ss.Status().SaveOrUpdate(&m) 297 return &m 298 } 299 300 func createTeam(ss store.Store) *model.Team { 301 m := model.Team{} 302 m.DisplayName = "DisplayName" 303 m.Type = model.TEAM_OPEN 304 m.Email = "test@example.com" 305 m.Name = "z-z-z" + model.NewRandomTeamName() + "b" 306 t, _ := ss.Team().Save(&m) 307 return t 308 } 309 310 func createTeamMember(ss store.Store, teamId, userId string) *model.TeamMember { 311 m := model.TeamMember{} 312 m.TeamId = teamId 313 m.UserId = userId 314 tm, _ := ss.Team().SaveMember(&m, -1) 315 return tm 316 } 317 318 func createTeamWithSchemeId(ss store.Store, schemeId *string) *model.Team { 319 m := model.Team{} 320 m.SchemeId = schemeId 321 m.DisplayName = "DisplayName" 322 m.Type = model.TEAM_OPEN 323 m.Email = "test@example.com" 324 m.Name = "z-z-z" + model.NewId() + "b" 325 t, _ := ss.Team().Save(&m) 326 return t 327 } 328 329 func createUser(ss store.Store) *model.User { 330 m := model.User{} 331 m.Username = model.NewId() 332 m.Email = m.Username + "@example.com" 333 user, _ := ss.User().Save(&m) 334 return user 335 } 336 337 func createUserAccessToken(ss store.Store, userId string) *model.UserAccessToken { 338 m := model.UserAccessToken{} 339 m.UserId = userId 340 m.Token = model.NewId() 341 uat, _ := ss.UserAccessToken().Save(&m) 342 return uat 343 } 344 345 func TestCheckIntegrity(t *testing.T) { 346 StoreTest(t, func(t *testing.T, ss store.Store) { 347 ss.DropAllTables() 348 t.Run("generate reports with no records", func(t *testing.T) { 349 results := ss.CheckIntegrity() 350 require.NotNil(t, results) 351 for result := range results { 352 require.IsType(t, model.IntegrityCheckResult{}, result) 353 require.NoError(t, result.Err) 354 switch data := result.Data.(type) { 355 case model.RelationalIntegrityCheckData: 356 require.Empty(t, data.Records) 357 } 358 } 359 }) 360 }) 361 } 362 363 func TestCheckParentChildIntegrity(t *testing.T) { 364 StoreTest(t, func(t *testing.T, ss store.Store) { 365 store := ss.(*SqlStore) 366 t.Run("should receive an error", func(t *testing.T) { 367 config := relationalCheckConfig{ 368 parentName: "NotValid", 369 parentIdAttr: "NotValid", 370 childName: "NotValid", 371 childIdAttr: "NotValid", 372 } 373 result := checkParentChildIntegrity(store, config) 374 require.Error(t, result.Err) 375 require.Empty(t, result.Data) 376 }) 377 }) 378 } 379 380 func TestCheckChannelsCommandWebhooksIntegrity(t *testing.T) { 381 StoreTest(t, func(t *testing.T, ss store.Store) { 382 store := ss.(*SqlStore) 383 dbmap := store.GetMaster() 384 385 t.Run("should generate a report with no records", func(t *testing.T) { 386 result := checkChannelsCommandWebhooksIntegrity(store) 387 require.NoError(t, result.Err) 388 data := result.Data.(model.RelationalIntegrityCheckData) 389 require.Empty(t, data.Records) 390 }) 391 392 t.Run("should generate a report with one record", func(t *testing.T) { 393 channelId := model.NewId() 394 cwh := createCommandWebhook(ss, model.NewId(), model.NewId(), channelId) 395 result := checkChannelsCommandWebhooksIntegrity(store) 396 require.NoError(t, result.Err) 397 data := result.Data.(model.RelationalIntegrityCheckData) 398 require.Len(t, data.Records, 1) 399 require.Equal(t, model.OrphanedRecord{ 400 ParentId: &channelId, 401 ChildId: &cwh.Id, 402 }, data.Records[0]) 403 dbmap.Delete(cwh) 404 }) 405 }) 406 } 407 408 func TestCheckChannelsChannelMemberHistoryIntegrity(t *testing.T) { 409 StoreTest(t, func(t *testing.T, ss store.Store) { 410 store := ss.(*SqlStore) 411 dbmap := store.GetMaster() 412 413 t.Run("should generate a report with no records", func(t *testing.T) { 414 result := checkChannelsChannelMemberHistoryIntegrity(store) 415 require.NoError(t, result.Err) 416 data := result.Data.(model.RelationalIntegrityCheckData) 417 require.Empty(t, data.Records) 418 }) 419 420 t.Run("should generate a report with one record", func(t *testing.T) { 421 channel := createChannel(ss, model.NewId(), model.NewId()) 422 user := createUser(ss) 423 cmh := createChannelMemberHistory(ss, channel.Id, user.Id) 424 dbmap.Delete(channel) 425 result := checkChannelsChannelMemberHistoryIntegrity(store) 426 require.NoError(t, result.Err) 427 data := result.Data.(model.RelationalIntegrityCheckData) 428 require.Len(t, data.Records, 1) 429 require.Equal(t, model.OrphanedRecord{ 430 ParentId: &cmh.ChannelId, 431 }, data.Records[0]) 432 dbmap.Delete(user) 433 dbmap.Exec(`DELETE FROM ChannelMemberHistory`) 434 }) 435 }) 436 } 437 438 func TestCheckChannelsChannelMembersIntegrity(t *testing.T) { 439 StoreTest(t, func(t *testing.T, ss store.Store) { 440 store := ss.(*SqlStore) 441 dbmap := store.GetMaster() 442 443 t.Run("should generate a report with no records", func(t *testing.T) { 444 result := checkChannelsChannelMembersIntegrity(store) 445 require.NoError(t, result.Err) 446 data := result.Data.(model.RelationalIntegrityCheckData) 447 require.Empty(t, data.Records) 448 }) 449 450 t.Run("should generate a report with one record", func(t *testing.T) { 451 channel := createChannel(ss, model.NewId(), model.NewId()) 452 member := createChannelMemberWithChannelId(ss, channel.Id) 453 dbmap.Delete(channel) 454 result := checkChannelsChannelMembersIntegrity(store) 455 require.NoError(t, result.Err) 456 data := result.Data.(model.RelationalIntegrityCheckData) 457 require.Len(t, data.Records, 1) 458 require.Equal(t, model.OrphanedRecord{ 459 ParentId: &member.ChannelId, 460 }, data.Records[0]) 461 ss.Channel().PermanentDeleteMembersByChannel(member.ChannelId) 462 }) 463 }) 464 } 465 466 func TestCheckChannelsIncomingWebhooksIntegrity(t *testing.T) { 467 StoreTest(t, func(t *testing.T, ss store.Store) { 468 store := ss.(*SqlStore) 469 dbmap := store.GetMaster() 470 471 t.Run("should generate a report with no records", func(t *testing.T) { 472 result := checkChannelsIncomingWebhooksIntegrity(store) 473 require.NoError(t, result.Err) 474 data := result.Data.(model.RelationalIntegrityCheckData) 475 require.Empty(t, data.Records) 476 }) 477 478 t.Run("should generate a report with one record", func(t *testing.T) { 479 channelId := model.NewId() 480 wh := createIncomingWebhook(ss, model.NewId(), channelId, model.NewId()) 481 result := checkChannelsIncomingWebhooksIntegrity(store) 482 require.NoError(t, result.Err) 483 data := result.Data.(model.RelationalIntegrityCheckData) 484 require.Len(t, data.Records, 1) 485 require.Equal(t, model.OrphanedRecord{ 486 ParentId: &channelId, 487 ChildId: &wh.Id, 488 }, data.Records[0]) 489 dbmap.Delete(wh) 490 }) 491 }) 492 } 493 494 func TestCheckChannelsOutgoingWebhooksIntegrity(t *testing.T) { 495 StoreTest(t, func(t *testing.T, ss store.Store) { 496 store := ss.(*SqlStore) 497 dbmap := store.GetMaster() 498 499 t.Run("should generate a report with no records", func(t *testing.T) { 500 result := checkChannelsOutgoingWebhooksIntegrity(store) 501 require.NoError(t, result.Err) 502 data := result.Data.(model.RelationalIntegrityCheckData) 503 require.Empty(t, data.Records) 504 }) 505 506 t.Run("should generate a report with one record", func(t *testing.T) { 507 channel := createChannel(ss, model.NewId(), model.NewId()) 508 channelId := channel.Id 509 wh := createOutgoingWebhook(ss, model.NewId(), channelId, model.NewId()) 510 dbmap.Delete(channel) 511 result := checkChannelsOutgoingWebhooksIntegrity(store) 512 require.NoError(t, result.Err) 513 data := result.Data.(model.RelationalIntegrityCheckData) 514 require.Len(t, data.Records, 1) 515 require.Equal(t, model.OrphanedRecord{ 516 ParentId: &channelId, 517 ChildId: &wh.Id, 518 }, data.Records[0]) 519 dbmap.Delete(wh) 520 }) 521 }) 522 } 523 524 func TestCheckChannelsPostsIntegrity(t *testing.T) { 525 StoreTest(t, func(t *testing.T, ss store.Store) { 526 store := ss.(*SqlStore) 527 dbmap := store.GetMaster() 528 529 t.Run("should generate a report with no records", func(t *testing.T) { 530 result := checkChannelsPostsIntegrity(store) 531 require.NoError(t, result.Err) 532 data := result.Data.(model.RelationalIntegrityCheckData) 533 require.Empty(t, data.Records) 534 }) 535 536 t.Run("should generate a report with one record", func(t *testing.T) { 537 post := createPostWithChannelId(ss, model.NewId()) 538 result := checkChannelsPostsIntegrity(store) 539 require.NoError(t, result.Err) 540 data := result.Data.(model.RelationalIntegrityCheckData) 541 require.Len(t, data.Records, 1) 542 require.Equal(t, model.OrphanedRecord{ 543 ParentId: &post.ChannelId, 544 ChildId: &post.Id, 545 }, data.Records[0]) 546 dbmap.Delete(post) 547 }) 548 }) 549 } 550 551 func TestCheckCommandsCommandWebhooksIntegrity(t *testing.T) { 552 StoreTest(t, func(t *testing.T, ss store.Store) { 553 store := ss.(*SqlStore) 554 dbmap := store.GetMaster() 555 556 t.Run("should generate a report with no records", func(t *testing.T) { 557 result := checkCommandsCommandWebhooksIntegrity(store) 558 require.NoError(t, result.Err) 559 data := result.Data.(model.RelationalIntegrityCheckData) 560 require.Empty(t, data.Records) 561 }) 562 563 t.Run("should generate a report with one record", func(t *testing.T) { 564 commandId := model.NewId() 565 cwh := createCommandWebhook(ss, commandId, model.NewId(), model.NewId()) 566 result := checkCommandsCommandWebhooksIntegrity(store) 567 require.NoError(t, result.Err) 568 data := result.Data.(model.RelationalIntegrityCheckData) 569 require.Len(t, data.Records, 1) 570 require.Equal(t, model.OrphanedRecord{ 571 ParentId: &commandId, 572 ChildId: &cwh.Id, 573 }, data.Records[0]) 574 dbmap.Delete(cwh) 575 }) 576 }) 577 } 578 579 func TestCheckPostsFileInfoIntegrity(t *testing.T) { 580 StoreTest(t, func(t *testing.T, ss store.Store) { 581 store := ss.(*SqlStore) 582 dbmap := store.GetMaster() 583 584 t.Run("should generate a report with no records", func(t *testing.T) { 585 result := checkPostsFileInfoIntegrity(store) 586 require.NoError(t, result.Err) 587 data := result.Data.(model.RelationalIntegrityCheckData) 588 require.Empty(t, data.Records) 589 }) 590 591 t.Run("should generate a report with one record", func(t *testing.T) { 592 postId := model.NewId() 593 info := createFileInfo(ss, postId, model.NewId()) 594 result := checkPostsFileInfoIntegrity(store) 595 require.NoError(t, result.Err) 596 data := result.Data.(model.RelationalIntegrityCheckData) 597 require.Len(t, data.Records, 1) 598 require.Equal(t, model.OrphanedRecord{ 599 ParentId: &postId, 600 ChildId: &info.Id, 601 }, data.Records[0]) 602 dbmap.Delete(info) 603 }) 604 }) 605 } 606 607 func TestCheckPostsPostsParentIdIntegrity(t *testing.T) { 608 StoreTest(t, func(t *testing.T, ss store.Store) { 609 store := ss.(*SqlStore) 610 dbmap := store.GetMaster() 611 612 t.Run("should generate a report with no records", func(t *testing.T) { 613 result := checkPostsPostsParentIdIntegrity(store) 614 require.NoError(t, result.Err) 615 data := result.Data.(model.RelationalIntegrityCheckData) 616 require.Empty(t, data.Records) 617 }) 618 619 t.Run("should generate a report with no records", func(t *testing.T) { 620 root := createPost(ss, model.NewId(), model.NewId(), "", "") 621 parent := createPost(ss, model.NewId(), model.NewId(), root.Id, root.Id) 622 post := createPost(ss, model.NewId(), model.NewId(), root.Id, parent.Id) 623 result := checkPostsPostsParentIdIntegrity(store) 624 require.NoError(t, result.Err) 625 data := result.Data.(model.RelationalIntegrityCheckData) 626 require.Empty(t, data.Records) 627 dbmap.Delete(parent) 628 dbmap.Delete(root) 629 dbmap.Delete(post) 630 }) 631 632 t.Run("should generate a report with one record", func(t *testing.T) { 633 root := createPost(ss, model.NewId(), model.NewId(), "", "") 634 parent := createPost(ss, model.NewId(), model.NewId(), root.Id, root.Id) 635 parentId := parent.Id 636 post := createPost(ss, model.NewId(), model.NewId(), root.Id, parent.Id) 637 dbmap.Delete(parent) 638 result := checkPostsPostsParentIdIntegrity(store) 639 require.NoError(t, result.Err) 640 data := result.Data.(model.RelationalIntegrityCheckData) 641 require.Len(t, data.Records, 1) 642 require.Equal(t, model.OrphanedRecord{ 643 ParentId: &parentId, 644 ChildId: &post.Id, 645 }, data.Records[0]) 646 dbmap.Delete(root) 647 dbmap.Delete(post) 648 }) 649 }) 650 } 651 652 func TestCheckPostsPostsRootIdIntegrity(t *testing.T) { 653 StoreTest(t, func(t *testing.T, ss store.Store) { 654 store := ss.(*SqlStore) 655 dbmap := store.GetMaster() 656 657 t.Run("should generate a report with no records", func(t *testing.T) { 658 result := checkPostsPostsRootIdIntegrity(store) 659 require.NoError(t, result.Err) 660 data := result.Data.(model.RelationalIntegrityCheckData) 661 require.Empty(t, data.Records) 662 }) 663 664 t.Run("should generate a report with one record", func(t *testing.T) { 665 root := createPost(ss, model.NewId(), model.NewId(), "", "") 666 rootId := root.Id 667 post := createPost(ss, model.NewId(), model.NewId(), root.Id, root.Id) 668 dbmap.Delete(root) 669 result := checkPostsPostsRootIdIntegrity(store) 670 require.NoError(t, result.Err) 671 data := result.Data.(model.RelationalIntegrityCheckData) 672 require.Len(t, data.Records, 1) 673 require.Equal(t, model.OrphanedRecord{ 674 ParentId: &rootId, 675 ChildId: &post.Id, 676 }, data.Records[0]) 677 dbmap.Delete(post) 678 }) 679 }) 680 } 681 682 func TestCheckPostsReactionsIntegrity(t *testing.T) { 683 StoreTest(t, func(t *testing.T, ss store.Store) { 684 store := ss.(*SqlStore) 685 dbmap := store.GetMaster() 686 687 t.Run("should generate a report with no records", func(t *testing.T) { 688 result := checkPostsReactionsIntegrity(store) 689 require.NoError(t, result.Err) 690 data := result.Data.(model.RelationalIntegrityCheckData) 691 require.Empty(t, data.Records) 692 }) 693 694 t.Run("should generate a report with one record", func(t *testing.T) { 695 postId := model.NewId() 696 reaction := createReaction(ss, model.NewId(), postId) 697 result := checkPostsReactionsIntegrity(store) 698 require.NoError(t, result.Err) 699 data := result.Data.(model.RelationalIntegrityCheckData) 700 require.Len(t, data.Records, 1) 701 require.Equal(t, model.OrphanedRecord{ 702 ParentId: &postId, 703 }, data.Records[0]) 704 dbmap.Delete(reaction) 705 }) 706 }) 707 } 708 709 func TestCheckSchemesChannelsIntegrity(t *testing.T) { 710 StoreTest(t, func(t *testing.T, ss store.Store) { 711 store := ss.(*SqlStore) 712 dbmap := store.GetMaster() 713 714 t.Run("should generate a report with no records", func(t *testing.T) { 715 result := checkSchemesChannelsIntegrity(store) 716 require.NoError(t, result.Err) 717 data := result.Data.(model.RelationalIntegrityCheckData) 718 require.Empty(t, data.Records) 719 }) 720 721 t.Run("should generate a report with one record", func(t *testing.T) { 722 createDefaultRoles(ss) 723 scheme := createScheme(ss) 724 schemeId := scheme.Id 725 channel := createChannelWithSchemeId(ss, &schemeId) 726 dbmap.Delete(scheme) 727 result := checkSchemesChannelsIntegrity(store) 728 require.NoError(t, result.Err) 729 data := result.Data.(model.RelationalIntegrityCheckData) 730 require.Len(t, data.Records, 1) 731 require.Equal(t, model.OrphanedRecord{ 732 ParentId: &schemeId, 733 ChildId: &channel.Id, 734 }, data.Records[0]) 735 dbmap.Delete(channel) 736 }) 737 }) 738 } 739 740 func TestCheckSchemesTeamsIntegrity(t *testing.T) { 741 StoreTest(t, func(t *testing.T, ss store.Store) { 742 store := ss.(*SqlStore) 743 dbmap := store.GetMaster() 744 745 t.Run("should generate a report with no records", func(t *testing.T) { 746 result := checkSchemesTeamsIntegrity(store) 747 require.NoError(t, result.Err) 748 data := result.Data.(model.RelationalIntegrityCheckData) 749 require.Empty(t, data.Records) 750 }) 751 752 t.Run("should generate a report with one record", func(t *testing.T) { 753 createDefaultRoles(ss) 754 scheme := createScheme(ss) 755 schemeId := scheme.Id 756 team := createTeamWithSchemeId(ss, &schemeId) 757 dbmap.Delete(scheme) 758 result := checkSchemesTeamsIntegrity(store) 759 require.NoError(t, result.Err) 760 data := result.Data.(model.RelationalIntegrityCheckData) 761 require.Len(t, data.Records, 1) 762 require.Equal(t, model.OrphanedRecord{ 763 ParentId: &schemeId, 764 ChildId: &team.Id, 765 }, data.Records[0]) 766 dbmap.Delete(team) 767 }) 768 }) 769 } 770 771 func TestCheckSessionsAuditsIntegrity(t *testing.T) { 772 StoreTest(t, func(t *testing.T, ss store.Store) { 773 store := ss.(*SqlStore) 774 dbmap := store.GetMaster() 775 776 t.Run("should generate a report with no records", func(t *testing.T) { 777 result := checkSessionsAuditsIntegrity(store) 778 require.NoError(t, result.Err) 779 data := result.Data.(model.RelationalIntegrityCheckData) 780 require.Empty(t, data.Records) 781 }) 782 783 t.Run("should generate a report with one record", func(t *testing.T) { 784 userId := model.NewId() 785 session := createSession(ss, model.NewId()) 786 sessionId := session.Id 787 audit := createAudit(ss, userId, sessionId) 788 dbmap.Delete(session) 789 result := checkSessionsAuditsIntegrity(store) 790 require.NoError(t, result.Err) 791 data := result.Data.(model.RelationalIntegrityCheckData) 792 require.Len(t, data.Records, 1) 793 require.Equal(t, model.OrphanedRecord{ 794 ParentId: &sessionId, 795 ChildId: &audit.Id, 796 }, data.Records[0]) 797 ss.Audit().PermanentDeleteByUser(userId) 798 }) 799 }) 800 } 801 802 func TestCheckTeamsChannelsIntegrity(t *testing.T) { 803 StoreTest(t, func(t *testing.T, ss store.Store) { 804 store := ss.(*SqlStore) 805 dbmap := store.GetMaster() 806 807 t.Run("should generate a report with no records", func(t *testing.T) { 808 result := checkTeamsChannelsIntegrity(store) 809 require.NoError(t, result.Err) 810 data := result.Data.(model.RelationalIntegrityCheckData) 811 require.Empty(t, data.Records) 812 }) 813 814 t.Run("should generate a report with one record", func(t *testing.T) { 815 channel := createChannelWithTeamId(ss, model.NewId()) 816 result := checkTeamsChannelsIntegrity(store) 817 require.NoError(t, result.Err) 818 data := result.Data.(model.RelationalIntegrityCheckData) 819 require.Len(t, data.Records, 1) 820 require.Equal(t, model.OrphanedRecord{ 821 ParentId: &channel.TeamId, 822 ChildId: &channel.Id, 823 }, data.Records[0]) 824 dbmap.Delete(channel) 825 }) 826 827 t.Run("should not include direct channel with empty teamid", func(t *testing.T) { 828 channel := createChannelWithTeamId(ss, model.NewId()) 829 userA := createUser(ss) 830 userB := createUser(ss) 831 direct, err := ss.Channel().CreateDirectChannel(userA, userB) 832 require.NoError(t, err) 833 require.NotNil(t, direct) 834 result := checkTeamsChannelsIntegrity(store) 835 require.NoError(t, result.Err) 836 data := result.Data.(model.RelationalIntegrityCheckData) 837 require.Len(t, data.Records, 1) 838 require.Equal(t, model.OrphanedRecord{ 839 ParentId: &channel.TeamId, 840 ChildId: &channel.Id, 841 }, data.Records[0]) 842 dbmap.Delete(channel) 843 dbmap.Delete(userA) 844 dbmap.Delete(userB) 845 dbmap.Delete(direct) 846 }) 847 848 t.Run("should include direct channel with non empty teamid", func(t *testing.T) { 849 channel := createChannelWithTeamId(ss, model.NewId()) 850 userA := createUser(ss) 851 userB := createUser(ss) 852 direct, err := ss.Channel().CreateDirectChannel(userA, userB) 853 require.NoError(t, err) 854 require.NotNil(t, direct) 855 _, err = dbmap.Exec(`UPDATE Channels SET TeamId = 'test' WHERE Id = '` + direct.Id + `'`) 856 require.NoError(t, err) 857 result := checkTeamsChannelsIntegrity(store) 858 require.NoError(t, result.Err) 859 data := result.Data.(model.RelationalIntegrityCheckData) 860 require.Len(t, data.Records, 2) 861 require.Equal(t, model.OrphanedRecord{ 862 ParentId: &channel.TeamId, 863 ChildId: &channel.Id, 864 }, data.Records[0]) 865 require.Equal(t, model.OrphanedRecord{ 866 ParentId: model.NewString("test"), 867 ChildId: &direct.Id, 868 }, data.Records[1]) 869 dbmap.Delete(channel) 870 dbmap.Delete(userA) 871 dbmap.Delete(userB) 872 dbmap.Delete(direct) 873 dbmap.Exec("DELETE FROM ChannelMembers") 874 }) 875 }) 876 } 877 878 func TestCheckTeamsCommandsIntegrity(t *testing.T) { 879 StoreTest(t, func(t *testing.T, ss store.Store) { 880 store := ss.(*SqlStore) 881 dbmap := store.GetMaster() 882 883 t.Run("should generate a report with no records", func(t *testing.T) { 884 result := checkTeamsCommandsIntegrity(store) 885 require.NoError(t, result.Err) 886 data := result.Data.(model.RelationalIntegrityCheckData) 887 require.Empty(t, data.Records) 888 }) 889 890 t.Run("should generate a report with one record", func(t *testing.T) { 891 teamId := model.NewId() 892 cmd := createCommand(ss, model.NewId(), teamId) 893 result := checkTeamsCommandsIntegrity(store) 894 require.NoError(t, result.Err) 895 data := result.Data.(model.RelationalIntegrityCheckData) 896 require.Len(t, data.Records, 1) 897 require.Equal(t, model.OrphanedRecord{ 898 ParentId: &teamId, 899 ChildId: &cmd.Id, 900 }, data.Records[0]) 901 dbmap.Delete(cmd) 902 }) 903 }) 904 } 905 906 func TestCheckTeamsIncomingWebhooksIntegrity(t *testing.T) { 907 StoreTest(t, func(t *testing.T, ss store.Store) { 908 store := ss.(*SqlStore) 909 dbmap := store.GetMaster() 910 911 t.Run("should generate a report with no records", func(t *testing.T) { 912 result := checkTeamsIncomingWebhooksIntegrity(store) 913 require.NoError(t, result.Err) 914 data := result.Data.(model.RelationalIntegrityCheckData) 915 require.Empty(t, data.Records) 916 }) 917 918 t.Run("should generate a report with one record", func(t *testing.T) { 919 teamId := model.NewId() 920 wh := createIncomingWebhook(ss, model.NewId(), model.NewId(), teamId) 921 result := checkTeamsIncomingWebhooksIntegrity(store) 922 require.NoError(t, result.Err) 923 data := result.Data.(model.RelationalIntegrityCheckData) 924 require.Len(t, data.Records, 1) 925 require.Equal(t, model.OrphanedRecord{ 926 ParentId: &teamId, 927 ChildId: &wh.Id, 928 }, data.Records[0]) 929 dbmap.Delete(wh) 930 }) 931 }) 932 } 933 934 func TestCheckTeamsOutgoingWebhooksIntegrity(t *testing.T) { 935 StoreTest(t, func(t *testing.T, ss store.Store) { 936 store := ss.(*SqlStore) 937 dbmap := store.GetMaster() 938 939 t.Run("should generate a report with no records", func(t *testing.T) { 940 result := checkTeamsOutgoingWebhooksIntegrity(store) 941 require.NoError(t, result.Err) 942 data := result.Data.(model.RelationalIntegrityCheckData) 943 require.Empty(t, data.Records) 944 }) 945 946 t.Run("should generate a report with one record", func(t *testing.T) { 947 teamId := model.NewId() 948 wh := createOutgoingWebhook(ss, model.NewId(), model.NewId(), teamId) 949 result := checkTeamsOutgoingWebhooksIntegrity(store) 950 require.NoError(t, result.Err) 951 data := result.Data.(model.RelationalIntegrityCheckData) 952 require.Len(t, data.Records, 1) 953 require.Equal(t, model.OrphanedRecord{ 954 ParentId: &teamId, 955 ChildId: &wh.Id, 956 }, data.Records[0]) 957 dbmap.Delete(wh) 958 }) 959 }) 960 } 961 962 func TestCheckTeamsTeamMembersIntegrity(t *testing.T) { 963 StoreTest(t, func(t *testing.T, ss store.Store) { 964 store := ss.(*SqlStore) 965 dbmap := store.GetMaster() 966 967 t.Run("should generate a report with no records", func(t *testing.T) { 968 result := checkTeamsTeamMembersIntegrity(store) 969 require.NoError(t, result.Err) 970 data := result.Data.(model.RelationalIntegrityCheckData) 971 require.Empty(t, data.Records) 972 }) 973 974 t.Run("should generate a report with one record", func(t *testing.T) { 975 team := createTeam(ss) 976 member := createTeamMember(ss, team.Id, model.NewId()) 977 dbmap.Delete(team) 978 result := checkTeamsTeamMembersIntegrity(store) 979 require.NoError(t, result.Err) 980 data := result.Data.(model.RelationalIntegrityCheckData) 981 require.Len(t, data.Records, 1) 982 require.Equal(t, model.OrphanedRecord{ 983 ParentId: &team.Id, 984 }, data.Records[0]) 985 ss.Team().RemoveAllMembersByTeam(member.TeamId) 986 }) 987 }) 988 } 989 990 func TestCheckUsersAuditsIntegrity(t *testing.T) { 991 StoreTest(t, func(t *testing.T, ss store.Store) { 992 store := ss.(*SqlStore) 993 dbmap := store.GetMaster() 994 995 t.Run("should generate a report with no records", func(t *testing.T) { 996 result := checkUsersAuditsIntegrity(store) 997 require.NoError(t, result.Err) 998 data := result.Data.(model.RelationalIntegrityCheckData) 999 require.Empty(t, data.Records) 1000 }) 1001 1002 t.Run("should generate a report with one record", func(t *testing.T) { 1003 user := createUser(ss) 1004 userId := user.Id 1005 audit := createAudit(ss, userId, model.NewId()) 1006 dbmap.Delete(user) 1007 result := checkUsersAuditsIntegrity(store) 1008 require.NoError(t, result.Err) 1009 data := result.Data.(model.RelationalIntegrityCheckData) 1010 require.Len(t, data.Records, 1) 1011 require.Equal(t, model.OrphanedRecord{ 1012 ParentId: &userId, 1013 ChildId: &audit.Id, 1014 }, data.Records[0]) 1015 ss.Audit().PermanentDeleteByUser(userId) 1016 }) 1017 }) 1018 } 1019 1020 func TestCheckUsersCommandWebhooksIntegrity(t *testing.T) { 1021 StoreTest(t, func(t *testing.T, ss store.Store) { 1022 store := ss.(*SqlStore) 1023 dbmap := store.GetMaster() 1024 1025 t.Run("should generate a report with no records", func(t *testing.T) { 1026 result := checkUsersCommandWebhooksIntegrity(store) 1027 require.NoError(t, result.Err) 1028 data := result.Data.(model.RelationalIntegrityCheckData) 1029 require.Empty(t, data.Records) 1030 }) 1031 1032 t.Run("should generate a report with one record", func(t *testing.T) { 1033 userId := model.NewId() 1034 cwh := createCommandWebhook(ss, model.NewId(), userId, model.NewId()) 1035 result := checkUsersCommandWebhooksIntegrity(store) 1036 require.NoError(t, result.Err) 1037 data := result.Data.(model.RelationalIntegrityCheckData) 1038 require.Len(t, data.Records, 1) 1039 require.Equal(t, model.OrphanedRecord{ 1040 ParentId: &userId, 1041 ChildId: &cwh.Id, 1042 }, data.Records[0]) 1043 dbmap.Delete(cwh) 1044 }) 1045 }) 1046 } 1047 1048 func TestCheckUsersChannelsIntegrity(t *testing.T) { 1049 StoreTest(t, func(t *testing.T, ss store.Store) { 1050 store := ss.(*SqlStore) 1051 dbmap := store.GetMaster() 1052 1053 t.Run("should generate a report with no records", func(t *testing.T) { 1054 result := checkUsersChannelsIntegrity(store) 1055 require.NoError(t, result.Err) 1056 data := result.Data.(model.RelationalIntegrityCheckData) 1057 require.Empty(t, data.Records) 1058 }) 1059 1060 t.Run("should generate a report with one record", func(t *testing.T) { 1061 channel := createChannelWithCreatorId(ss, model.NewId()) 1062 result := checkUsersChannelsIntegrity(store) 1063 require.NoError(t, result.Err) 1064 data := result.Data.(model.RelationalIntegrityCheckData) 1065 require.Len(t, data.Records, 1) 1066 require.Equal(t, model.OrphanedRecord{ 1067 ParentId: &channel.CreatorId, 1068 ChildId: &channel.Id, 1069 }, data.Records[0]) 1070 dbmap.Delete(channel) 1071 }) 1072 }) 1073 } 1074 1075 func TestCheckUsersChannelMemberHistoryIntegrity(t *testing.T) { 1076 StoreTest(t, func(t *testing.T, ss store.Store) { 1077 store := ss.(*SqlStore) 1078 dbmap := store.GetMaster() 1079 1080 t.Run("should generate a report with no records", func(t *testing.T) { 1081 result := checkUsersChannelMemberHistoryIntegrity(store) 1082 require.NoError(t, result.Err) 1083 data := result.Data.(model.RelationalIntegrityCheckData) 1084 require.Empty(t, data.Records) 1085 }) 1086 1087 t.Run("should generate a report with one record", func(t *testing.T) { 1088 user := createUser(ss) 1089 channel := createChannel(ss, model.NewId(), model.NewId()) 1090 cmh := createChannelMemberHistory(ss, channel.Id, user.Id) 1091 dbmap.Delete(user) 1092 result := checkUsersChannelMemberHistoryIntegrity(store) 1093 require.NoError(t, result.Err) 1094 data := result.Data.(model.RelationalIntegrityCheckData) 1095 require.Len(t, data.Records, 1) 1096 require.Equal(t, model.OrphanedRecord{ 1097 ParentId: &cmh.UserId, 1098 }, data.Records[0]) 1099 dbmap.Delete(channel) 1100 dbmap.Exec(`DELETE FROM ChannelMemberHistory`) 1101 }) 1102 }) 1103 } 1104 1105 func TestCheckUsersChannelMembersIntegrity(t *testing.T) { 1106 StoreTest(t, func(t *testing.T, ss store.Store) { 1107 store := ss.(*SqlStore) 1108 dbmap := store.GetMaster() 1109 1110 t.Run("should generate a report with no records", func(t *testing.T) { 1111 result := checkUsersChannelMembersIntegrity(store) 1112 require.NoError(t, result.Err) 1113 data := result.Data.(model.RelationalIntegrityCheckData) 1114 require.Empty(t, data.Records) 1115 }) 1116 1117 t.Run("should generate a report with one record", func(t *testing.T) { 1118 user := createUser(ss) 1119 channel := createChannelWithCreatorId(ss, user.Id) 1120 member := createChannelMember(ss, channel.Id, user.Id) 1121 dbmap.Delete(user) 1122 result := checkUsersChannelMembersIntegrity(store) 1123 require.NoError(t, result.Err) 1124 data := result.Data.(model.RelationalIntegrityCheckData) 1125 require.Len(t, data.Records, 1) 1126 require.Equal(t, model.OrphanedRecord{ 1127 ParentId: &member.UserId, 1128 }, data.Records[0]) 1129 dbmap.Delete(channel) 1130 ss.Channel().PermanentDeleteMembersByUser(member.UserId) 1131 }) 1132 }) 1133 } 1134 1135 func TestCheckUsersCommandsIntegrity(t *testing.T) { 1136 StoreTest(t, func(t *testing.T, ss store.Store) { 1137 store := ss.(*SqlStore) 1138 dbmap := store.GetMaster() 1139 1140 t.Run("should generate a report with no records", func(t *testing.T) { 1141 result := checkUsersCommandsIntegrity(store) 1142 require.NoError(t, result.Err) 1143 data := result.Data.(model.RelationalIntegrityCheckData) 1144 require.Empty(t, data.Records) 1145 }) 1146 1147 t.Run("should generate a report with one record", func(t *testing.T) { 1148 userId := model.NewId() 1149 cmd := createCommand(ss, userId, model.NewId()) 1150 result := checkUsersCommandsIntegrity(store) 1151 require.NoError(t, result.Err) 1152 data := result.Data.(model.RelationalIntegrityCheckData) 1153 require.Len(t, data.Records, 1) 1154 require.Equal(t, model.OrphanedRecord{ 1155 ParentId: &userId, 1156 ChildId: &cmd.Id, 1157 }, data.Records[0]) 1158 dbmap.Delete(cmd) 1159 }) 1160 }) 1161 } 1162 1163 func TestCheckUsersCompliancesIntegrity(t *testing.T) { 1164 StoreTest(t, func(t *testing.T, ss store.Store) { 1165 store := ss.(*SqlStore) 1166 dbmap := store.GetMaster() 1167 1168 t.Run("should generate a report with no records", func(t *testing.T) { 1169 result := checkUsersCompliancesIntegrity(store) 1170 require.NoError(t, result.Err) 1171 data := result.Data.(model.RelationalIntegrityCheckData) 1172 require.Empty(t, data.Records) 1173 }) 1174 1175 t.Run("should generate a report with one record", func(t *testing.T) { 1176 user := createUser(ss) 1177 userId := user.Id 1178 compliance := createCompliance(ss, userId) 1179 dbmap.Delete(user) 1180 result := checkUsersCompliancesIntegrity(store) 1181 require.NoError(t, result.Err) 1182 data := result.Data.(model.RelationalIntegrityCheckData) 1183 require.Len(t, data.Records, 1) 1184 require.Equal(t, model.OrphanedRecord{ 1185 ParentId: &userId, 1186 ChildId: &compliance.Id, 1187 }, data.Records[0]) 1188 dbmap.Delete(compliance) 1189 }) 1190 }) 1191 } 1192 1193 func TestCheckUsersEmojiIntegrity(t *testing.T) { 1194 StoreTest(t, func(t *testing.T, ss store.Store) { 1195 store := ss.(*SqlStore) 1196 dbmap := store.GetMaster() 1197 1198 t.Run("should generate a report with no records", func(t *testing.T) { 1199 result := checkUsersEmojiIntegrity(store) 1200 require.NoError(t, result.Err) 1201 data := result.Data.(model.RelationalIntegrityCheckData) 1202 require.Empty(t, data.Records) 1203 }) 1204 1205 t.Run("should generate a report with one record", func(t *testing.T) { 1206 user := createUser(ss) 1207 userId := user.Id 1208 emoji := createEmoji(ss, userId) 1209 dbmap.Delete(user) 1210 result := checkUsersEmojiIntegrity(store) 1211 require.NoError(t, result.Err) 1212 data := result.Data.(model.RelationalIntegrityCheckData) 1213 require.Len(t, data.Records, 1) 1214 require.Equal(t, model.OrphanedRecord{ 1215 ParentId: &userId, 1216 ChildId: &emoji.Id, 1217 }, data.Records[0]) 1218 dbmap.Delete(emoji) 1219 }) 1220 }) 1221 } 1222 1223 func TestCheckUsersFileInfoIntegrity(t *testing.T) { 1224 StoreTest(t, func(t *testing.T, ss store.Store) { 1225 store := ss.(*SqlStore) 1226 dbmap := store.GetMaster() 1227 1228 t.Run("should generate a report with no records", func(t *testing.T) { 1229 result := checkUsersFileInfoIntegrity(store) 1230 require.NoError(t, result.Err) 1231 data := result.Data.(model.RelationalIntegrityCheckData) 1232 require.Empty(t, data.Records) 1233 }) 1234 1235 t.Run("should generate a report with one record", func(t *testing.T) { 1236 user := createUser(ss) 1237 userId := user.Id 1238 info := createFileInfo(ss, model.NewId(), userId) 1239 dbmap.Delete(user) 1240 result := checkUsersFileInfoIntegrity(store) 1241 require.NoError(t, result.Err) 1242 data := result.Data.(model.RelationalIntegrityCheckData) 1243 require.Len(t, data.Records, 1) 1244 require.Equal(t, model.OrphanedRecord{ 1245 ParentId: &userId, 1246 ChildId: &info.Id, 1247 }, data.Records[0]) 1248 dbmap.Delete(info) 1249 }) 1250 }) 1251 } 1252 1253 func TestCheckUsersIncomingWebhooksIntegrity(t *testing.T) { 1254 StoreTest(t, func(t *testing.T, ss store.Store) { 1255 store := ss.(*SqlStore) 1256 dbmap := store.GetMaster() 1257 1258 t.Run("should generate a report with no records", func(t *testing.T) { 1259 result := checkUsersIncomingWebhooksIntegrity(store) 1260 require.NoError(t, result.Err) 1261 data := result.Data.(model.RelationalIntegrityCheckData) 1262 require.Empty(t, data.Records) 1263 }) 1264 1265 t.Run("should generate a report with one record", func(t *testing.T) { 1266 userId := model.NewId() 1267 wh := createIncomingWebhook(ss, userId, model.NewId(), model.NewId()) 1268 result := checkUsersIncomingWebhooksIntegrity(store) 1269 require.NoError(t, result.Err) 1270 data := result.Data.(model.RelationalIntegrityCheckData) 1271 require.Len(t, data.Records, 1) 1272 require.Equal(t, model.OrphanedRecord{ 1273 ParentId: &userId, 1274 ChildId: &wh.Id, 1275 }, data.Records[0]) 1276 dbmap.Delete(wh) 1277 }) 1278 }) 1279 } 1280 1281 func TestCheckUsersOAuthAccessDataIntegrity(t *testing.T) { 1282 StoreTest(t, func(t *testing.T, ss store.Store) { 1283 store := ss.(*SqlStore) 1284 dbmap := store.GetMaster() 1285 1286 t.Run("should generate a report with no records", func(t *testing.T) { 1287 result := checkUsersOAuthAccessDataIntegrity(store) 1288 require.NoError(t, result.Err) 1289 data := result.Data.(model.RelationalIntegrityCheckData) 1290 require.Empty(t, data.Records) 1291 }) 1292 1293 t.Run("should generate a report with one record", func(t *testing.T) { 1294 user := createUser(ss) 1295 userId := user.Id 1296 ad := createOAuthAccessData(ss, userId) 1297 dbmap.Delete(user) 1298 result := checkUsersOAuthAccessDataIntegrity(store) 1299 require.NoError(t, result.Err) 1300 data := result.Data.(model.RelationalIntegrityCheckData) 1301 require.Len(t, data.Records, 1) 1302 require.Equal(t, model.OrphanedRecord{ 1303 ParentId: &userId, 1304 ChildId: &ad.Token, 1305 }, data.Records[0]) 1306 ss.OAuth().RemoveAccessData(ad.Token) 1307 }) 1308 }) 1309 } 1310 1311 func TestCheckUsersOAuthAppsIntegrity(t *testing.T) { 1312 StoreTest(t, func(t *testing.T, ss store.Store) { 1313 store := ss.(*SqlStore) 1314 dbmap := store.GetMaster() 1315 1316 t.Run("should generate a report with no records", func(t *testing.T) { 1317 result := checkUsersOAuthAppsIntegrity(store) 1318 require.NoError(t, result.Err) 1319 data := result.Data.(model.RelationalIntegrityCheckData) 1320 require.Empty(t, data.Records) 1321 }) 1322 1323 t.Run("should generate a report with one record", func(t *testing.T) { 1324 user := createUser(ss) 1325 userId := user.Id 1326 app := createOAuthApp(ss, userId) 1327 dbmap.Delete(user) 1328 result := checkUsersOAuthAppsIntegrity(store) 1329 require.NoError(t, result.Err) 1330 data := result.Data.(model.RelationalIntegrityCheckData) 1331 require.Len(t, data.Records, 1) 1332 require.Equal(t, model.OrphanedRecord{ 1333 ParentId: &userId, 1334 ChildId: &app.Id, 1335 }, data.Records[0]) 1336 ss.OAuth().DeleteApp(app.Id) 1337 }) 1338 }) 1339 } 1340 1341 func TestCheckUsersOAuthAuthDataIntegrity(t *testing.T) { 1342 StoreTest(t, func(t *testing.T, ss store.Store) { 1343 store := ss.(*SqlStore) 1344 dbmap := store.GetMaster() 1345 1346 t.Run("should generate a report with no records", func(t *testing.T) { 1347 result := checkUsersOAuthAuthDataIntegrity(store) 1348 require.NoError(t, result.Err) 1349 data := result.Data.(model.RelationalIntegrityCheckData) 1350 require.Empty(t, data.Records) 1351 }) 1352 1353 t.Run("should generate a report with one record", func(t *testing.T) { 1354 user := createUser(ss) 1355 userId := user.Id 1356 ad := createOAuthAuthData(ss, userId) 1357 dbmap.Delete(user) 1358 result := checkUsersOAuthAuthDataIntegrity(store) 1359 require.NoError(t, result.Err) 1360 data := result.Data.(model.RelationalIntegrityCheckData) 1361 require.Len(t, data.Records, 1) 1362 require.Equal(t, model.OrphanedRecord{ 1363 ParentId: &userId, 1364 ChildId: &ad.Code, 1365 }, data.Records[0]) 1366 ss.OAuth().RemoveAuthData(ad.Code) 1367 }) 1368 }) 1369 } 1370 1371 func TestCheckUsersOutgoingWebhooksIntegrity(t *testing.T) { 1372 StoreTest(t, func(t *testing.T, ss store.Store) { 1373 store := ss.(*SqlStore) 1374 dbmap := store.GetMaster() 1375 1376 t.Run("should generate a report with no records", func(t *testing.T) { 1377 result := checkUsersOutgoingWebhooksIntegrity(store) 1378 require.NoError(t, result.Err) 1379 data := result.Data.(model.RelationalIntegrityCheckData) 1380 require.Empty(t, data.Records) 1381 }) 1382 1383 t.Run("should generate a report with one record", func(t *testing.T) { 1384 userId := model.NewId() 1385 wh := createOutgoingWebhook(ss, userId, model.NewId(), model.NewId()) 1386 result := checkUsersOutgoingWebhooksIntegrity(store) 1387 require.NoError(t, result.Err) 1388 data := result.Data.(model.RelationalIntegrityCheckData) 1389 require.Len(t, data.Records, 1) 1390 require.Equal(t, model.OrphanedRecord{ 1391 ParentId: &userId, 1392 ChildId: &wh.Id, 1393 }, data.Records[0]) 1394 dbmap.Delete(wh) 1395 }) 1396 }) 1397 } 1398 1399 func TestCheckUsersPostsIntegrity(t *testing.T) { 1400 StoreTest(t, func(t *testing.T, ss store.Store) { 1401 store := ss.(*SqlStore) 1402 dbmap := store.GetMaster() 1403 1404 t.Run("should generate a report with no records", func(t *testing.T) { 1405 result := checkUsersPostsIntegrity(store) 1406 require.NoError(t, result.Err) 1407 data := result.Data.(model.RelationalIntegrityCheckData) 1408 require.Empty(t, data.Records) 1409 }) 1410 1411 t.Run("should generate a report with one record", func(t *testing.T) { 1412 post := createPostWithUserId(ss, model.NewId()) 1413 result := checkUsersPostsIntegrity(store) 1414 require.NoError(t, result.Err) 1415 data := result.Data.(model.RelationalIntegrityCheckData) 1416 require.Len(t, data.Records, 1) 1417 require.Equal(t, model.OrphanedRecord{ 1418 ParentId: &post.UserId, 1419 ChildId: &post.Id, 1420 }, data.Records[0]) 1421 dbmap.Delete(post) 1422 }) 1423 }) 1424 } 1425 1426 func TestCheckUsersPreferencesIntegrity(t *testing.T) { 1427 StoreTest(t, func(t *testing.T, ss store.Store) { 1428 store := ss.(*SqlStore) 1429 dbmap := store.GetMaster() 1430 1431 t.Run("should generate a report with no records", func(t *testing.T) { 1432 result := checkUsersPreferencesIntegrity(store) 1433 require.NoError(t, result.Err) 1434 data := result.Data.(model.RelationalIntegrityCheckData) 1435 require.Empty(t, data.Records) 1436 }) 1437 1438 t.Run("should generate a report with no records", func(t *testing.T) { 1439 user := createUser(ss) 1440 require.NotNil(t, user) 1441 userId := user.Id 1442 preferences := createPreferences(ss, userId) 1443 require.NotNil(t, preferences) 1444 result := checkUsersPreferencesIntegrity(store) 1445 require.NoError(t, result.Err) 1446 data := result.Data.(model.RelationalIntegrityCheckData) 1447 require.Empty(t, data.Records) 1448 dbmap.Exec(`DELETE FROM Preferences`) 1449 dbmap.Delete(user) 1450 }) 1451 1452 t.Run("should generate a report with one record", func(t *testing.T) { 1453 user := createUser(ss) 1454 require.NotNil(t, user) 1455 userId := user.Id 1456 preferences := createPreferences(ss, userId) 1457 require.NotNil(t, preferences) 1458 dbmap.Delete(user) 1459 result := checkUsersPreferencesIntegrity(store) 1460 require.NoError(t, result.Err) 1461 data := result.Data.(model.RelationalIntegrityCheckData) 1462 require.Len(t, data.Records, 1) 1463 require.Equal(t, model.OrphanedRecord{ 1464 ParentId: &userId, 1465 }, data.Records[0]) 1466 dbmap.Exec(`DELETE FROM Preferences`) 1467 dbmap.Delete(user) 1468 }) 1469 }) 1470 } 1471 1472 func TestCheckUsersReactionsIntegrity(t *testing.T) { 1473 StoreTest(t, func(t *testing.T, ss store.Store) { 1474 store := ss.(*SqlStore) 1475 dbmap := store.GetMaster() 1476 1477 t.Run("should generate a report with no records", func(t *testing.T) { 1478 result := checkUsersReactionsIntegrity(store) 1479 require.NoError(t, result.Err) 1480 data := result.Data.(model.RelationalIntegrityCheckData) 1481 require.Empty(t, data.Records) 1482 }) 1483 1484 t.Run("should generate a report with one record", func(t *testing.T) { 1485 user := createUser(ss) 1486 userId := user.Id 1487 reaction := createReaction(ss, user.Id, model.NewId()) 1488 dbmap.Delete(user) 1489 result := checkUsersReactionsIntegrity(store) 1490 require.NoError(t, result.Err) 1491 data := result.Data.(model.RelationalIntegrityCheckData) 1492 require.Len(t, data.Records, 1) 1493 require.Equal(t, model.OrphanedRecord{ 1494 ParentId: &userId, 1495 }, data.Records[0]) 1496 dbmap.Delete(reaction) 1497 }) 1498 }) 1499 } 1500 1501 func TestCheckUsersSessionsIntegrity(t *testing.T) { 1502 StoreTest(t, func(t *testing.T, ss store.Store) { 1503 store := ss.(*SqlStore) 1504 dbmap := store.GetMaster() 1505 1506 t.Run("should generate a report with no records", func(t *testing.T) { 1507 result := checkUsersSessionsIntegrity(store) 1508 require.NoError(t, result.Err) 1509 data := result.Data.(model.RelationalIntegrityCheckData) 1510 require.Empty(t, data.Records) 1511 }) 1512 1513 t.Run("should generate a report with one record", func(t *testing.T) { 1514 userId := model.NewId() 1515 session := createSession(ss, userId) 1516 result := checkUsersSessionsIntegrity(store) 1517 require.NoError(t, result.Err) 1518 data := result.Data.(model.RelationalIntegrityCheckData) 1519 require.Len(t, data.Records, 1) 1520 require.Equal(t, model.OrphanedRecord{ 1521 ParentId: &userId, 1522 ChildId: &session.Id, 1523 }, data.Records[0]) 1524 dbmap.Delete(session) 1525 }) 1526 }) 1527 } 1528 1529 func TestCheckUsersStatusIntegrity(t *testing.T) { 1530 StoreTest(t, func(t *testing.T, ss store.Store) { 1531 store := ss.(*SqlStore) 1532 dbmap := store.GetMaster() 1533 1534 t.Run("should generate a report with no records", func(t *testing.T) { 1535 result := checkUsersStatusIntegrity(store) 1536 require.NoError(t, result.Err) 1537 data := result.Data.(model.RelationalIntegrityCheckData) 1538 require.Empty(t, data.Records) 1539 }) 1540 1541 t.Run("should generate a report with one record", func(t *testing.T) { 1542 user := createUser(ss) 1543 userId := user.Id 1544 status := createStatus(ss, user.Id) 1545 dbmap.Delete(user) 1546 result := checkUsersStatusIntegrity(store) 1547 require.NoError(t, result.Err) 1548 data := result.Data.(model.RelationalIntegrityCheckData) 1549 require.Len(t, data.Records, 1) 1550 require.Equal(t, model.OrphanedRecord{ 1551 ParentId: &userId, 1552 }, data.Records[0]) 1553 dbmap.Delete(status) 1554 }) 1555 }) 1556 } 1557 1558 func TestCheckUsersTeamMembersIntegrity(t *testing.T) { 1559 StoreTest(t, func(t *testing.T, ss store.Store) { 1560 store := ss.(*SqlStore) 1561 dbmap := store.GetMaster() 1562 1563 t.Run("should generate a report with no records", func(t *testing.T) { 1564 result := checkUsersTeamMembersIntegrity(store) 1565 require.NoError(t, result.Err) 1566 data := result.Data.(model.RelationalIntegrityCheckData) 1567 require.Empty(t, data.Records) 1568 }) 1569 1570 t.Run("should generate a report with one record", func(t *testing.T) { 1571 user := createUser(ss) 1572 team := createTeam(ss) 1573 member := createTeamMember(ss, team.Id, user.Id) 1574 dbmap.Delete(user) 1575 result := checkUsersTeamMembersIntegrity(store) 1576 require.NoError(t, result.Err) 1577 data := result.Data.(model.RelationalIntegrityCheckData) 1578 require.Len(t, data.Records, 1) 1579 require.Equal(t, model.OrphanedRecord{ 1580 ParentId: &member.UserId, 1581 }, data.Records[0]) 1582 ss.Team().RemoveAllMembersByTeam(member.TeamId) 1583 dbmap.Delete(team) 1584 }) 1585 }) 1586 } 1587 1588 func TestCheckUsersUserAccessTokensIntegrity(t *testing.T) { 1589 StoreTest(t, func(t *testing.T, ss store.Store) { 1590 store := ss.(*SqlStore) 1591 dbmap := store.GetMaster() 1592 1593 t.Run("should generate a report with no records", func(t *testing.T) { 1594 result := checkUsersUserAccessTokensIntegrity(store) 1595 require.NoError(t, result.Err) 1596 data := result.Data.(model.RelationalIntegrityCheckData) 1597 require.Empty(t, data.Records) 1598 }) 1599 1600 t.Run("should generate a report with one record", func(t *testing.T) { 1601 user := createUser(ss) 1602 userId := user.Id 1603 uat := createUserAccessToken(ss, user.Id) 1604 dbmap.Delete(user) 1605 result := checkUsersUserAccessTokensIntegrity(store) 1606 require.NoError(t, result.Err) 1607 data := result.Data.(model.RelationalIntegrityCheckData) 1608 require.Len(t, data.Records, 1) 1609 require.Equal(t, model.OrphanedRecord{ 1610 ParentId: &userId, 1611 ChildId: &uat.Id, 1612 }, data.Records[0]) 1613 ss.UserAccessToken().Delete(uat.Id) 1614 }) 1615 }) 1616 }