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  }