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