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  }