github.com/haalcala/mattermost-server-change-repo@v0.0.0-20210713015153-16753fbeee5f/store/storetest/group_store.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package storetest
     5  
     6  import (
     7  	"errors"
     8  	"fmt"
     9  	"math"
    10  	"sort"
    11  	"strings"
    12  	"testing"
    13  	"time"
    14  
    15  	"github.com/stretchr/testify/assert"
    16  	"github.com/stretchr/testify/require"
    17  
    18  	"github.com/mattermost/mattermost-server/v5/model"
    19  	"github.com/mattermost/mattermost-server/v5/store"
    20  	"github.com/mattermost/mattermost-server/v5/utils"
    21  )
    22  
    23  func TestGroupStore(t *testing.T, ss store.Store) {
    24  	t.Run("Create", func(t *testing.T) { testGroupStoreCreate(t, ss) })
    25  	t.Run("Get", func(t *testing.T) { testGroupStoreGet(t, ss) })
    26  	t.Run("GetByName", func(t *testing.T) { testGroupStoreGetByName(t, ss) })
    27  	t.Run("GetByIDs", func(t *testing.T) { testGroupStoreGetByIDs(t, ss) })
    28  	t.Run("GetByRemoteID", func(t *testing.T) { testGroupStoreGetByRemoteID(t, ss) })
    29  	t.Run("GetAllBySource", func(t *testing.T) { testGroupStoreGetAllByType(t, ss) })
    30  	t.Run("GetByUser", func(t *testing.T) { testGroupStoreGetByUser(t, ss) })
    31  	t.Run("Update", func(t *testing.T) { testGroupStoreUpdate(t, ss) })
    32  	t.Run("Delete", func(t *testing.T) { testGroupStoreDelete(t, ss) })
    33  
    34  	t.Run("GetMemberUsers", func(t *testing.T) { testGroupGetMemberUsers(t, ss) })
    35  	t.Run("GetMemberUsersPage", func(t *testing.T) { testGroupGetMemberUsersPage(t, ss) })
    36  
    37  	t.Run("GetMemberUsersInTeam", func(t *testing.T) { testGroupGetMemberUsersInTeam(t, ss) })
    38  	t.Run("GetMemberUsersNotInChannel", func(t *testing.T) { testGroupGetMemberUsersNotInChannel(t, ss) })
    39  
    40  	t.Run("UpsertMember", func(t *testing.T) { testUpsertMember(t, ss) })
    41  	t.Run("DeleteMember", func(t *testing.T) { testGroupDeleteMember(t, ss) })
    42  	t.Run("PermanentDeleteMembersByUser", func(t *testing.T) { testGroupPermanentDeleteMembersByUser(t, ss) })
    43  
    44  	t.Run("CreateGroupSyncable", func(t *testing.T) { testCreateGroupSyncable(t, ss) })
    45  	t.Run("GetGroupSyncable", func(t *testing.T) { testGetGroupSyncable(t, ss) })
    46  	t.Run("GetAllGroupSyncablesByGroupId", func(t *testing.T) { testGetAllGroupSyncablesByGroup(t, ss) })
    47  	t.Run("UpdateGroupSyncable", func(t *testing.T) { testUpdateGroupSyncable(t, ss) })
    48  	t.Run("DeleteGroupSyncable", func(t *testing.T) { testDeleteGroupSyncable(t, ss) })
    49  
    50  	t.Run("TeamMembersToAdd", func(t *testing.T) { testTeamMembersToAdd(t, ss) })
    51  	t.Run("TeamMembersToAdd_SingleTeam", func(t *testing.T) { testTeamMembersToAddSingleTeam(t, ss) })
    52  
    53  	t.Run("ChannelMembersToAdd", func(t *testing.T) { testChannelMembersToAdd(t, ss) })
    54  	t.Run("ChannelMembersToAdd_SingleChannel", func(t *testing.T) { testChannelMembersToAddSingleChannel(t, ss) })
    55  
    56  	t.Run("TeamMembersToRemove", func(t *testing.T) { testTeamMembersToRemove(t, ss) })
    57  	t.Run("TeamMembersToRemove_SingleTeam", func(t *testing.T) { testTeamMembersToRemoveSingleTeam(t, ss) })
    58  
    59  	t.Run("ChannelMembersToRemove", func(t *testing.T) { testChannelMembersToRemove(t, ss) })
    60  	t.Run("ChannelMembersToRemove_SingleChannel", func(t *testing.T) { testChannelMembersToRemoveSingleChannel(t, ss) })
    61  
    62  	t.Run("GetGroupsByChannel", func(t *testing.T) { testGetGroupsByChannel(t, ss) })
    63  	t.Run("GetGroupsAssociatedToChannelsByTeam", func(t *testing.T) { testGetGroupsAssociatedToChannelsByTeam(t, ss) })
    64  	t.Run("GetGroupsByTeam", func(t *testing.T) { testGetGroupsByTeam(t, ss) })
    65  
    66  	t.Run("GetGroups", func(t *testing.T) { testGetGroups(t, ss) })
    67  
    68  	t.Run("TeamMembersMinusGroupMembers", func(t *testing.T) { testTeamMembersMinusGroupMembers(t, ss) })
    69  	t.Run("ChannelMembersMinusGroupMembers", func(t *testing.T) { testChannelMembersMinusGroupMembers(t, ss) })
    70  
    71  	t.Run("GetMemberCount", func(t *testing.T) { groupTestGetMemberCount(t, ss) })
    72  
    73  	t.Run("AdminRoleGroupsForSyncableMember_Channel", func(t *testing.T) { groupTestAdminRoleGroupsForSyncableMemberChannel(t, ss) })
    74  	t.Run("AdminRoleGroupsForSyncableMember_Team", func(t *testing.T) { groupTestAdminRoleGroupsForSyncableMemberTeam(t, ss) })
    75  	t.Run("PermittedSyncableAdmins_Team", func(t *testing.T) { groupTestPermittedSyncableAdminsTeam(t, ss) })
    76  	t.Run("PermittedSyncableAdmins_Channel", func(t *testing.T) { groupTestPermittedSyncableAdminsChannel(t, ss) })
    77  	t.Run("UpdateMembersRole_Team", func(t *testing.T) { groupTestpUpdateMembersRoleTeam(t, ss) })
    78  	t.Run("UpdateMembersRole_Channel", func(t *testing.T) { groupTestpUpdateMembersRoleChannel(t, ss) })
    79  
    80  	t.Run("GroupCount", func(t *testing.T) { groupTestGroupCount(t, ss) })
    81  	t.Run("GroupTeamCount", func(t *testing.T) { groupTestGroupTeamCount(t, ss) })
    82  	t.Run("GroupChannelCount", func(t *testing.T) { groupTestGroupChannelCount(t, ss) })
    83  	t.Run("GroupMemberCount", func(t *testing.T) { groupTestGroupMemberCount(t, ss) })
    84  	t.Run("DistinctGroupMemberCount", func(t *testing.T) { groupTestDistinctGroupMemberCount(t, ss) })
    85  	t.Run("GroupCountWithAllowReference", func(t *testing.T) { groupTestGroupCountWithAllowReference(t, ss) })
    86  }
    87  
    88  func testGroupStoreCreate(t *testing.T, ss store.Store) {
    89  	// Save a new group
    90  	g1 := &model.Group{
    91  		Name:        model.NewString(model.NewId()),
    92  		DisplayName: model.NewId(),
    93  		Source:      model.GroupSourceLdap,
    94  		Description: model.NewId(),
    95  		RemoteId:    model.NewId(),
    96  	}
    97  
    98  	// Happy path
    99  	d1, err := ss.Group().Create(g1)
   100  	require.NoError(t, err)
   101  	require.Len(t, d1.Id, 26)
   102  	require.Equal(t, *g1.Name, *d1.Name)
   103  	require.Equal(t, g1.DisplayName, d1.DisplayName)
   104  	require.Equal(t, g1.Description, d1.Description)
   105  	require.Equal(t, g1.RemoteId, d1.RemoteId)
   106  	require.NotZero(t, d1.CreateAt)
   107  	require.NotZero(t, d1.UpdateAt)
   108  	require.Zero(t, d1.DeleteAt)
   109  
   110  	// Requires display name
   111  	g2 := &model.Group{
   112  		Name:        model.NewString(model.NewId()),
   113  		DisplayName: "",
   114  		Source:      model.GroupSourceLdap,
   115  		RemoteId:    model.NewId(),
   116  	}
   117  	data, err := ss.Group().Create(g2)
   118  	require.Nil(t, data)
   119  	require.Error(t, err)
   120  	var appErr *model.AppError
   121  	require.True(t, errors.As(err, &appErr))
   122  	require.Equal(t, appErr.Id, "model.group.display_name.app_error")
   123  
   124  	// Won't accept a duplicate name
   125  	g4 := &model.Group{
   126  		Name:        model.NewString(model.NewId()),
   127  		DisplayName: model.NewId(),
   128  		Source:      model.GroupSourceLdap,
   129  		RemoteId:    model.NewId(),
   130  	}
   131  	_, err = ss.Group().Create(g4)
   132  	require.NoError(t, err)
   133  	g4b := &model.Group{
   134  		Name:        g4.Name,
   135  		DisplayName: model.NewId(),
   136  		Source:      model.GroupSourceLdap,
   137  		RemoteId:    model.NewId(),
   138  	}
   139  	data, err = ss.Group().Create(g4b)
   140  	require.Nil(t, data)
   141  	require.Error(t, err)
   142  	require.Contains(t, err.Error(), fmt.Sprintf("Group with name %s already exists", *g4b.Name))
   143  
   144  	// Fields cannot be greater than max values
   145  	g5 := &model.Group{
   146  		Name:        model.NewString(strings.Repeat("x", model.GroupNameMaxLength)),
   147  		DisplayName: strings.Repeat("x", model.GroupDisplayNameMaxLength),
   148  		Description: strings.Repeat("x", model.GroupDescriptionMaxLength),
   149  		Source:      model.GroupSourceLdap,
   150  		RemoteId:    model.NewId(),
   151  	}
   152  	require.Nil(t, g5.IsValidForCreate())
   153  
   154  	g5.Name = model.NewString(*g5.Name + "x")
   155  	require.Equal(t, g5.IsValidForCreate().Id, "model.group.name.invalid_length.app_error")
   156  	g5.Name = model.NewString(model.NewId())
   157  	require.Nil(t, g5.IsValidForCreate())
   158  
   159  	g5.DisplayName = g5.DisplayName + "x"
   160  	require.Equal(t, g5.IsValidForCreate().Id, "model.group.display_name.app_error")
   161  	g5.DisplayName = model.NewId()
   162  	require.Nil(t, g5.IsValidForCreate())
   163  
   164  	g5.Description = g5.Description + "x"
   165  	require.Equal(t, g5.IsValidForCreate().Id, "model.group.description.app_error")
   166  	g5.Description = model.NewId()
   167  	require.Nil(t, g5.IsValidForCreate())
   168  
   169  	// Must use a valid type
   170  	g6 := &model.Group{
   171  		Name:        model.NewString(model.NewId()),
   172  		DisplayName: model.NewId(),
   173  		Description: model.NewId(),
   174  		Source:      model.GroupSource("fake"),
   175  		RemoteId:    model.NewId(),
   176  	}
   177  	require.Equal(t, g6.IsValidForCreate().Id, "model.group.source.app_error")
   178  
   179  	//must use valid characters
   180  	g7 := &model.Group{
   181  		Name:        model.NewString("%^#@$$"),
   182  		DisplayName: model.NewId(),
   183  		Description: model.NewId(),
   184  		Source:      model.GroupSourceLdap,
   185  		RemoteId:    model.NewId(),
   186  	}
   187  	require.Equal(t, g7.IsValidForCreate().Id, "model.group.name.invalid_chars.app_error")
   188  }
   189  
   190  func testGroupStoreGet(t *testing.T, ss store.Store) {
   191  	// Create a group
   192  	g1 := &model.Group{
   193  		Name:        model.NewString(model.NewId()),
   194  		DisplayName: model.NewId(),
   195  		Description: model.NewId(),
   196  		Source:      model.GroupSourceLdap,
   197  		RemoteId:    model.NewId(),
   198  	}
   199  	d1, err := ss.Group().Create(g1)
   200  	require.NoError(t, err)
   201  	require.Len(t, d1.Id, 26)
   202  
   203  	// Get the group
   204  	d2, err := ss.Group().Get(d1.Id)
   205  	require.NoError(t, err)
   206  	require.Equal(t, d1.Id, d2.Id)
   207  	require.Equal(t, *d1.Name, *d2.Name)
   208  	require.Equal(t, d1.DisplayName, d2.DisplayName)
   209  	require.Equal(t, d1.Description, d2.Description)
   210  	require.Equal(t, d1.RemoteId, d2.RemoteId)
   211  	require.Equal(t, d1.CreateAt, d2.CreateAt)
   212  	require.Equal(t, d1.UpdateAt, d2.UpdateAt)
   213  	require.Equal(t, d1.DeleteAt, d2.DeleteAt)
   214  
   215  	// Get an invalid group
   216  	_, err = ss.Group().Get(model.NewId())
   217  	require.Error(t, err)
   218  	var nfErr *store.ErrNotFound
   219  	require.True(t, errors.As(err, &nfErr))
   220  }
   221  
   222  func testGroupStoreGetByName(t *testing.T, ss store.Store) {
   223  	// Create a group
   224  	g1 := &model.Group{
   225  		Name:        model.NewString(model.NewId()),
   226  		DisplayName: model.NewId(),
   227  		Description: model.NewId(),
   228  		Source:      model.GroupSourceLdap,
   229  		RemoteId:    model.NewId(),
   230  	}
   231  	g1Opts := model.GroupSearchOpts{
   232  		FilterAllowReference: false,
   233  	}
   234  
   235  	d1, err := ss.Group().Create(g1)
   236  	require.NoError(t, err)
   237  	require.Len(t, d1.Id, 26)
   238  
   239  	// Get the group
   240  	d2, err := ss.Group().GetByName(*d1.Name, g1Opts)
   241  	require.NoError(t, err)
   242  	require.Equal(t, d1.Id, d2.Id)
   243  	require.Equal(t, *d1.Name, *d2.Name)
   244  	require.Equal(t, d1.DisplayName, d2.DisplayName)
   245  	require.Equal(t, d1.Description, d2.Description)
   246  	require.Equal(t, d1.RemoteId, d2.RemoteId)
   247  	require.Equal(t, d1.CreateAt, d2.CreateAt)
   248  	require.Equal(t, d1.UpdateAt, d2.UpdateAt)
   249  	require.Equal(t, d1.DeleteAt, d2.DeleteAt)
   250  
   251  	// Get an invalid group
   252  	_, err = ss.Group().GetByName(model.NewId(), g1Opts)
   253  	require.Error(t, err)
   254  	var nfErr *store.ErrNotFound
   255  	require.True(t, errors.As(err, &nfErr))
   256  }
   257  
   258  func testGroupStoreGetByIDs(t *testing.T, ss store.Store) {
   259  	var group1 *model.Group
   260  	var group2 *model.Group
   261  
   262  	for i := 0; i < 2; i++ {
   263  		group := &model.Group{
   264  			Name:        model.NewString(model.NewId()),
   265  			DisplayName: model.NewId(),
   266  			Description: model.NewId(),
   267  			Source:      model.GroupSourceLdap,
   268  			RemoteId:    model.NewId(),
   269  		}
   270  		group, err := ss.Group().Create(group)
   271  		require.NoError(t, err)
   272  		switch i {
   273  		case 0:
   274  			group1 = group
   275  		case 1:
   276  			group2 = group
   277  		}
   278  	}
   279  
   280  	groups, err := ss.Group().GetByIDs([]string{group1.Id, group2.Id})
   281  	require.NoError(t, err)
   282  	require.Len(t, groups, 2)
   283  
   284  	for i := 0; i < 2; i++ {
   285  		require.True(t, (groups[i].Id == group1.Id || groups[i].Id == group2.Id))
   286  	}
   287  
   288  	require.True(t, groups[0].Id != groups[1].Id)
   289  }
   290  
   291  func testGroupStoreGetByRemoteID(t *testing.T, ss store.Store) {
   292  	// Create a group
   293  	g1 := &model.Group{
   294  		Name:        model.NewString(model.NewId()),
   295  		DisplayName: model.NewId(),
   296  		Description: model.NewId(),
   297  		Source:      model.GroupSourceLdap,
   298  		RemoteId:    model.NewId(),
   299  	}
   300  	d1, err := ss.Group().Create(g1)
   301  	require.NoError(t, err)
   302  	require.Len(t, d1.Id, 26)
   303  
   304  	// Get the group
   305  	d2, err := ss.Group().GetByRemoteID(d1.RemoteId, model.GroupSourceLdap)
   306  	require.NoError(t, err)
   307  	require.Equal(t, d1.Id, d2.Id)
   308  	require.Equal(t, *d1.Name, *d2.Name)
   309  	require.Equal(t, d1.DisplayName, d2.DisplayName)
   310  	require.Equal(t, d1.Description, d2.Description)
   311  	require.Equal(t, d1.RemoteId, d2.RemoteId)
   312  	require.Equal(t, d1.CreateAt, d2.CreateAt)
   313  	require.Equal(t, d1.UpdateAt, d2.UpdateAt)
   314  	require.Equal(t, d1.DeleteAt, d2.DeleteAt)
   315  
   316  	// Get an invalid group
   317  	_, err = ss.Group().GetByRemoteID(model.NewId(), model.GroupSource("fake"))
   318  	require.Error(t, err)
   319  	var nfErr *store.ErrNotFound
   320  	require.True(t, errors.As(err, &nfErr))
   321  }
   322  
   323  func testGroupStoreGetAllByType(t *testing.T, ss store.Store) {
   324  	numGroups := 10
   325  
   326  	groups := []*model.Group{}
   327  
   328  	// Create groups
   329  	for i := 0; i < numGroups; i++ {
   330  		g := &model.Group{
   331  			Name:        model.NewString(model.NewId()),
   332  			DisplayName: model.NewId(),
   333  			Description: model.NewId(),
   334  			Source:      model.GroupSourceLdap,
   335  			RemoteId:    model.NewId(),
   336  		}
   337  		groups = append(groups, g)
   338  		_, err := ss.Group().Create(g)
   339  		require.NoError(t, err)
   340  	}
   341  
   342  	// Returns all the groups
   343  	d1, err := ss.Group().GetAllBySource(model.GroupSourceLdap)
   344  	require.NoError(t, err)
   345  	require.Condition(t, func() bool { return len(d1) >= numGroups })
   346  	for _, expectedGroup := range groups {
   347  		present := false
   348  		for _, dbGroup := range d1 {
   349  			if dbGroup.Id == expectedGroup.Id {
   350  				present = true
   351  				break
   352  			}
   353  		}
   354  		require.True(t, present)
   355  	}
   356  }
   357  
   358  func testGroupStoreGetByUser(t *testing.T, ss store.Store) {
   359  	// Save a group
   360  	g1 := &model.Group{
   361  		Name:        model.NewString(model.NewId()),
   362  		DisplayName: model.NewId(),
   363  		Description: model.NewId(),
   364  		Source:      model.GroupSourceLdap,
   365  		RemoteId:    model.NewId(),
   366  	}
   367  	g1, err := ss.Group().Create(g1)
   368  	require.NoError(t, err)
   369  
   370  	g2 := &model.Group{
   371  		Name:        model.NewString(model.NewId()),
   372  		DisplayName: model.NewId(),
   373  		Description: model.NewId(),
   374  		Source:      model.GroupSourceLdap,
   375  		RemoteId:    model.NewId(),
   376  	}
   377  	g2, err = ss.Group().Create(g2)
   378  	require.NoError(t, err)
   379  
   380  	u1 := &model.User{
   381  		Email:    MakeEmail(),
   382  		Username: model.NewId(),
   383  	}
   384  	u1, nErr := ss.User().Save(u1)
   385  	require.NoError(t, nErr)
   386  
   387  	_, err = ss.Group().UpsertMember(g1.Id, u1.Id)
   388  	require.NoError(t, err)
   389  	_, err = ss.Group().UpsertMember(g2.Id, u1.Id)
   390  	require.NoError(t, err)
   391  
   392  	u2 := &model.User{
   393  		Email:    MakeEmail(),
   394  		Username: model.NewId(),
   395  	}
   396  	u2, nErr = ss.User().Save(u2)
   397  	require.NoError(t, nErr)
   398  
   399  	_, err = ss.Group().UpsertMember(g2.Id, u2.Id)
   400  	require.NoError(t, err)
   401  
   402  	groups, err := ss.Group().GetByUser(u1.Id)
   403  	require.NoError(t, err)
   404  	assert.Equal(t, 2, len(groups))
   405  	found1 := false
   406  	found2 := false
   407  	for _, g := range groups {
   408  		if g.Id == g1.Id {
   409  			found1 = true
   410  		}
   411  		if g.Id == g2.Id {
   412  			found2 = true
   413  		}
   414  	}
   415  	assert.True(t, found1)
   416  	assert.True(t, found2)
   417  
   418  	groups, err = ss.Group().GetByUser(u2.Id)
   419  	require.NoError(t, err)
   420  	require.Equal(t, 1, len(groups))
   421  	assert.Equal(t, g2.Id, groups[0].Id)
   422  
   423  	groups, err = ss.Group().GetByUser(model.NewId())
   424  	require.NoError(t, err)
   425  	assert.Equal(t, 0, len(groups))
   426  }
   427  
   428  func testGroupStoreUpdate(t *testing.T, ss store.Store) {
   429  	// Save a new group
   430  	g1 := &model.Group{
   431  		Name:        model.NewString("g1-test"),
   432  		DisplayName: model.NewId(),
   433  		Source:      model.GroupSourceLdap,
   434  		Description: model.NewId(),
   435  		RemoteId:    model.NewId(),
   436  	}
   437  
   438  	// Create a group
   439  	d1, err := ss.Group().Create(g1)
   440  	require.NoError(t, err)
   441  
   442  	// Update happy path
   443  	g1Update := &model.Group{}
   444  	*g1Update = *g1
   445  	g1Update.Name = model.NewString(model.NewId())
   446  	g1Update.DisplayName = model.NewId()
   447  	g1Update.Description = model.NewId()
   448  	g1Update.RemoteId = model.NewId()
   449  
   450  	ud1, err := ss.Group().Update(g1Update)
   451  	require.NoError(t, err)
   452  	// Not changed...
   453  	require.Equal(t, d1.Id, ud1.Id)
   454  	require.Equal(t, d1.CreateAt, ud1.CreateAt)
   455  	require.Equal(t, d1.Source, ud1.Source)
   456  	// Still zero...
   457  	require.Zero(t, ud1.DeleteAt)
   458  	// Updated...
   459  	require.Equal(t, *g1Update.Name, *ud1.Name)
   460  	require.Equal(t, g1Update.DisplayName, ud1.DisplayName)
   461  	require.Equal(t, g1Update.Description, ud1.Description)
   462  	require.Equal(t, g1Update.RemoteId, ud1.RemoteId)
   463  
   464  	// Requires display name
   465  	data, err := ss.Group().Update(&model.Group{
   466  		Id:          d1.Id,
   467  		Name:        model.NewString(model.NewId()),
   468  		DisplayName: "",
   469  		Source:      model.GroupSourceLdap,
   470  		RemoteId:    model.NewId(),
   471  	})
   472  	require.Nil(t, data)
   473  	require.Error(t, err)
   474  	var appErr *model.AppError
   475  	require.True(t, errors.As(err, &appErr))
   476  	require.Equal(t, appErr.Id, "model.group.display_name.app_error")
   477  
   478  	// Create another Group
   479  	g2 := &model.Group{
   480  		Name:        model.NewString(model.NewId()),
   481  		DisplayName: model.NewId(),
   482  		Source:      model.GroupSourceLdap,
   483  		Description: model.NewId(),
   484  		RemoteId:    model.NewId(),
   485  	}
   486  	d2, err := ss.Group().Create(g2)
   487  	require.NoError(t, err)
   488  
   489  	// Can't update the name to be a duplicate of an existing group's name
   490  	_, err = ss.Group().Update(&model.Group{
   491  		Id:          d2.Id,
   492  		Name:        g1Update.Name,
   493  		DisplayName: model.NewId(),
   494  		Source:      model.GroupSourceLdap,
   495  		Description: model.NewId(),
   496  		RemoteId:    model.NewId(),
   497  	})
   498  	require.Error(t, err)
   499  	require.Contains(t, err.Error(), fmt.Sprintf("Group with name %s already exists", *g1Update.Name))
   500  
   501  	// Cannot update CreateAt
   502  	someVal := model.GetMillis()
   503  	d1.CreateAt = someVal
   504  	d3, err := ss.Group().Update(d1)
   505  	require.NoError(t, err)
   506  	require.NotEqual(t, someVal, d3.CreateAt)
   507  
   508  	// Cannot update DeleteAt to non-zero
   509  	d1.DeleteAt = 1
   510  	_, err = ss.Group().Update(d1)
   511  	require.Error(t, err)
   512  	require.Contains(t, err.Error(), "DeleteAt should be 0 when updating")
   513  
   514  	//...except for 0 for DeleteAt
   515  	d1.DeleteAt = 0
   516  	d4, err := ss.Group().Update(d1)
   517  	require.NoError(t, err)
   518  	require.Zero(t, d4.DeleteAt)
   519  }
   520  
   521  func testGroupStoreDelete(t *testing.T, ss store.Store) {
   522  	// Save a group
   523  	g1 := &model.Group{
   524  		Name:        model.NewString(model.NewId()),
   525  		DisplayName: model.NewId(),
   526  		Description: model.NewId(),
   527  		Source:      model.GroupSourceLdap,
   528  		RemoteId:    model.NewId(),
   529  	}
   530  
   531  	d1, err := ss.Group().Create(g1)
   532  	require.NoError(t, err)
   533  	require.Len(t, d1.Id, 26)
   534  
   535  	// Check the group is retrievable
   536  	_, err = ss.Group().Get(d1.Id)
   537  	require.NoError(t, err)
   538  
   539  	// Get the before count
   540  	d7, err := ss.Group().GetAllBySource(model.GroupSourceLdap)
   541  	require.NoError(t, err)
   542  	beforeCount := len(d7)
   543  
   544  	// Delete the group
   545  	_, err = ss.Group().Delete(d1.Id)
   546  	require.NoError(t, err)
   547  
   548  	// Check the group is deleted
   549  	d4, err := ss.Group().Get(d1.Id)
   550  	require.NoError(t, err)
   551  	require.NotZero(t, d4.DeleteAt)
   552  
   553  	// Check the after count
   554  	d5, err := ss.Group().GetAllBySource(model.GroupSourceLdap)
   555  	require.NoError(t, err)
   556  	afterCount := len(d5)
   557  	require.Condition(t, func() bool { return beforeCount == afterCount+1 })
   558  
   559  	// Try and delete a nonexistent group
   560  	_, err = ss.Group().Delete(model.NewId())
   561  	require.Error(t, err)
   562  	var nfErr *store.ErrNotFound
   563  	require.True(t, errors.As(err, &nfErr))
   564  
   565  	// Cannot delete again
   566  	_, err = ss.Group().Delete(d1.Id)
   567  	require.True(t, errors.As(err, &nfErr))
   568  }
   569  
   570  func testGroupGetMemberUsers(t *testing.T, ss store.Store) {
   571  	// Save a group
   572  	g1 := &model.Group{
   573  		Name:        model.NewString(model.NewId()),
   574  		DisplayName: model.NewId(),
   575  		Description: model.NewId(),
   576  		Source:      model.GroupSourceLdap,
   577  		RemoteId:    model.NewId(),
   578  	}
   579  	group, err := ss.Group().Create(g1)
   580  	require.NoError(t, err)
   581  
   582  	u1 := &model.User{
   583  		Email:    MakeEmail(),
   584  		Username: model.NewId(),
   585  	}
   586  	user1, nErr := ss.User().Save(u1)
   587  	require.NoError(t, nErr)
   588  
   589  	_, err = ss.Group().UpsertMember(group.Id, user1.Id)
   590  	require.NoError(t, err)
   591  
   592  	u2 := &model.User{
   593  		Email:    MakeEmail(),
   594  		Username: model.NewId(),
   595  	}
   596  	user2, nErr := ss.User().Save(u2)
   597  	require.NoError(t, nErr)
   598  
   599  	_, err = ss.Group().UpsertMember(group.Id, user2.Id)
   600  	require.NoError(t, err)
   601  
   602  	// Check returns members
   603  	groupMembers, err := ss.Group().GetMemberUsers(group.Id)
   604  	require.NoError(t, err)
   605  	require.Equal(t, 2, len(groupMembers))
   606  
   607  	// Check madeup id
   608  	groupMembers, err = ss.Group().GetMemberUsers(model.NewId())
   609  	require.NoError(t, err)
   610  	require.Equal(t, 0, len(groupMembers))
   611  
   612  	// Delete a member
   613  	_, err = ss.Group().DeleteMember(group.Id, user1.Id)
   614  	require.NoError(t, err)
   615  
   616  	// Should not return deleted members
   617  	groupMembers, err = ss.Group().GetMemberUsers(group.Id)
   618  	require.NoError(t, err)
   619  	require.Equal(t, 1, len(groupMembers))
   620  }
   621  
   622  func testGroupGetMemberUsersPage(t *testing.T, ss store.Store) {
   623  	// Save a group
   624  	g1 := &model.Group{
   625  		Name:        model.NewString(model.NewId()),
   626  		DisplayName: model.NewId(),
   627  		Description: model.NewId(),
   628  		Source:      model.GroupSourceLdap,
   629  		RemoteId:    model.NewId(),
   630  	}
   631  	group, err := ss.Group().Create(g1)
   632  	require.NoError(t, err)
   633  
   634  	u1 := &model.User{
   635  		Email:    MakeEmail(),
   636  		Username: model.NewId(),
   637  	}
   638  	user1, nErr := ss.User().Save(u1)
   639  	require.NoError(t, nErr)
   640  
   641  	_, err = ss.Group().UpsertMember(group.Id, user1.Id)
   642  	require.NoError(t, err)
   643  
   644  	u2 := &model.User{
   645  		Email:    MakeEmail(),
   646  		Username: model.NewId(),
   647  	}
   648  	user2, nErr := ss.User().Save(u2)
   649  	require.NoError(t, nErr)
   650  
   651  	_, err = ss.Group().UpsertMember(group.Id, user2.Id)
   652  	require.NoError(t, err)
   653  
   654  	u3 := &model.User{
   655  		Email:    MakeEmail(),
   656  		Username: model.NewId(),
   657  	}
   658  	user3, nErr := ss.User().Save(u3)
   659  	require.NoError(t, nErr)
   660  
   661  	_, err = ss.Group().UpsertMember(group.Id, user3.Id)
   662  	require.NoError(t, err)
   663  
   664  	// Check returns members
   665  	groupMembers, err := ss.Group().GetMemberUsersPage(group.Id, 0, 100)
   666  	require.NoError(t, err)
   667  	require.Equal(t, 3, len(groupMembers))
   668  
   669  	// Check page 1
   670  	groupMembers, err = ss.Group().GetMemberUsersPage(group.Id, 0, 2)
   671  	require.NoError(t, err)
   672  	require.Equal(t, 2, len(groupMembers))
   673  	require.Equal(t, user3.Id, groupMembers[0].Id)
   674  	require.Equal(t, user2.Id, groupMembers[1].Id)
   675  
   676  	// Check page 2
   677  	groupMembers, err = ss.Group().GetMemberUsersPage(group.Id, 1, 2)
   678  	require.NoError(t, err)
   679  	require.Equal(t, 1, len(groupMembers))
   680  	require.Equal(t, user1.Id, groupMembers[0].Id)
   681  
   682  	// Check madeup id
   683  	groupMembers, err = ss.Group().GetMemberUsersPage(model.NewId(), 0, 100)
   684  	require.NoError(t, err)
   685  	require.Equal(t, 0, len(groupMembers))
   686  
   687  	// Delete a member
   688  	_, err = ss.Group().DeleteMember(group.Id, user1.Id)
   689  	require.NoError(t, err)
   690  
   691  	// Should not return deleted members
   692  	groupMembers, err = ss.Group().GetMemberUsersPage(group.Id, 0, 100)
   693  	require.NoError(t, err)
   694  	require.Equal(t, 2, len(groupMembers))
   695  }
   696  
   697  func testGroupGetMemberUsersInTeam(t *testing.T, ss store.Store) {
   698  	// Save a team
   699  	team := &model.Team{
   700  		DisplayName: "Name",
   701  		Description: "Some description",
   702  		CompanyName: "Some company name",
   703  		Name:        "z-z-" + model.NewId() + "a",
   704  		Email:       "success+" + model.NewId() + "@simulator.amazonses.com",
   705  		Type:        model.TEAM_OPEN,
   706  	}
   707  	team, err := ss.Team().Save(team)
   708  	require.NoError(t, err)
   709  
   710  	// Save a group
   711  	g1 := &model.Group{
   712  		Name:        model.NewString(model.NewId()),
   713  		DisplayName: model.NewId(),
   714  		Description: model.NewId(),
   715  		Source:      model.GroupSourceLdap,
   716  		RemoteId:    model.NewId(),
   717  	}
   718  	group, err := ss.Group().Create(g1)
   719  	require.NoError(t, err)
   720  
   721  	u1 := &model.User{
   722  		Email:    MakeEmail(),
   723  		Username: model.NewId(),
   724  	}
   725  	user1, err := ss.User().Save(u1)
   726  	require.NoError(t, err)
   727  
   728  	_, err = ss.Group().UpsertMember(group.Id, user1.Id)
   729  	require.NoError(t, err)
   730  
   731  	u2 := &model.User{
   732  		Email:    MakeEmail(),
   733  		Username: model.NewId(),
   734  	}
   735  	user2, err := ss.User().Save(u2)
   736  	require.NoError(t, err)
   737  
   738  	_, err = ss.Group().UpsertMember(group.Id, user2.Id)
   739  	require.NoError(t, err)
   740  
   741  	u3 := &model.User{
   742  		Email:    MakeEmail(),
   743  		Username: model.NewId(),
   744  	}
   745  	user3, err := ss.User().Save(u3)
   746  	require.NoError(t, err)
   747  
   748  	_, err = ss.Group().UpsertMember(group.Id, user3.Id)
   749  	require.NoError(t, err)
   750  
   751  	// returns no members when team does not exist
   752  	groupMembers, err := ss.Group().GetMemberUsersInTeam(group.Id, "non-existent-channel-id")
   753  	require.NoError(t, err)
   754  	require.Equal(t, 0, len(groupMembers))
   755  
   756  	// returns no members when group has no members in the team
   757  	groupMembers, err = ss.Group().GetMemberUsersInTeam(group.Id, team.Id)
   758  	require.NoError(t, err)
   759  	require.Equal(t, 0, len(groupMembers))
   760  
   761  	m1 := &model.TeamMember{TeamId: team.Id, UserId: user1.Id}
   762  	_, nErr := ss.Team().SaveMember(m1, -1)
   763  	require.NoError(t, nErr)
   764  
   765  	// returns single member in team
   766  	groupMembers, err = ss.Group().GetMemberUsersInTeam(group.Id, team.Id)
   767  	require.NoError(t, err)
   768  	require.Equal(t, 1, len(groupMembers))
   769  
   770  	m2 := &model.TeamMember{TeamId: team.Id, UserId: user2.Id}
   771  	m3 := &model.TeamMember{TeamId: team.Id, UserId: user3.Id}
   772  	_, nErr = ss.Team().SaveMember(m2, -1)
   773  	require.NoError(t, nErr)
   774  	_, nErr = ss.Team().SaveMember(m3, -1)
   775  	require.NoError(t, nErr)
   776  
   777  	// returns all members when all members are in team
   778  	groupMembers, err = ss.Group().GetMemberUsersInTeam(group.Id, team.Id)
   779  	require.NoError(t, err)
   780  	require.Equal(t, 3, len(groupMembers))
   781  }
   782  
   783  func testGroupGetMemberUsersNotInChannel(t *testing.T, ss store.Store) {
   784  	// Save a team
   785  	team := &model.Team{
   786  		DisplayName: "Name",
   787  		Description: "Some description",
   788  		CompanyName: "Some company name",
   789  		Name:        "z-z-" + model.NewId() + "a",
   790  		Email:       "success+" + model.NewId() + "@simulator.amazonses.com",
   791  		Type:        model.TEAM_OPEN,
   792  	}
   793  	team, err := ss.Team().Save(team)
   794  	require.NoError(t, err)
   795  
   796  	// Save a group
   797  	g1 := &model.Group{
   798  		Name:        model.NewString(model.NewId()),
   799  		DisplayName: model.NewId(),
   800  		Description: model.NewId(),
   801  		Source:      model.GroupSourceLdap,
   802  		RemoteId:    model.NewId(),
   803  	}
   804  	group, err := ss.Group().Create(g1)
   805  	require.NoError(t, err)
   806  
   807  	u1 := &model.User{
   808  		Email:    MakeEmail(),
   809  		Username: model.NewId(),
   810  	}
   811  	user1, err := ss.User().Save(u1)
   812  	require.NoError(t, err)
   813  
   814  	_, err = ss.Group().UpsertMember(group.Id, user1.Id)
   815  	require.NoError(t, err)
   816  
   817  	u2 := &model.User{
   818  		Email:    MakeEmail(),
   819  		Username: model.NewId(),
   820  	}
   821  	user2, err := ss.User().Save(u2)
   822  	require.NoError(t, err)
   823  
   824  	_, err = ss.Group().UpsertMember(group.Id, user2.Id)
   825  	require.NoError(t, err)
   826  
   827  	u3 := &model.User{
   828  		Email:    MakeEmail(),
   829  		Username: model.NewId(),
   830  	}
   831  	user3, err := ss.User().Save(u3)
   832  	require.NoError(t, err)
   833  
   834  	_, err = ss.Group().UpsertMember(group.Id, user3.Id)
   835  	require.NoError(t, err)
   836  
   837  	// Create Channel
   838  	channel := &model.Channel{
   839  		TeamId:      team.Id,
   840  		DisplayName: "Channel",
   841  		Name:        model.NewId(),
   842  		Type:        model.CHANNEL_OPEN, // Query does not look at type so this shouldn't matter.
   843  	}
   844  	channel, nErr := ss.Channel().Save(channel, 9999)
   845  	require.NoError(t, nErr)
   846  
   847  	// returns no members when channel does not exist
   848  	groupMembers, err := ss.Group().GetMemberUsersNotInChannel(group.Id, "non-existent-channel-id")
   849  	require.NoError(t, err)
   850  	require.Equal(t, 0, len(groupMembers))
   851  
   852  	// returns no members when group has no members in the team that the channel belongs to
   853  	groupMembers, err = ss.Group().GetMemberUsersNotInChannel(group.Id, channel.Id)
   854  	require.NoError(t, err)
   855  	require.Equal(t, 0, len(groupMembers))
   856  
   857  	m1 := &model.TeamMember{TeamId: team.Id, UserId: user1.Id}
   858  	_, nErr = ss.Team().SaveMember(m1, -1)
   859  	require.NoError(t, nErr)
   860  
   861  	// returns single member in team and not in channel
   862  	groupMembers, err = ss.Group().GetMemberUsersNotInChannel(group.Id, channel.Id)
   863  	require.NoError(t, err)
   864  	require.Equal(t, 1, len(groupMembers))
   865  
   866  	m2 := &model.TeamMember{TeamId: team.Id, UserId: user2.Id}
   867  	m3 := &model.TeamMember{TeamId: team.Id, UserId: user3.Id}
   868  	_, nErr = ss.Team().SaveMember(m2, -1)
   869  	require.NoError(t, nErr)
   870  	_, nErr = ss.Team().SaveMember(m3, -1)
   871  	require.NoError(t, nErr)
   872  
   873  	// returns all members when all members are in team and not in channel
   874  	groupMembers, err = ss.Group().GetMemberUsersNotInChannel(group.Id, channel.Id)
   875  	require.NoError(t, err)
   876  	require.Equal(t, 3, len(groupMembers))
   877  
   878  	cm1 := &model.ChannelMember{
   879  		ChannelId:   channel.Id,
   880  		UserId:      user1.Id,
   881  		SchemeGuest: false,
   882  		SchemeUser:  true,
   883  		SchemeAdmin: false,
   884  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   885  	}
   886  	_, err = ss.Channel().SaveMember(cm1)
   887  	require.NoError(t, err)
   888  
   889  	// returns both members not yet added to channel
   890  	groupMembers, err = ss.Group().GetMemberUsersNotInChannel(group.Id, channel.Id)
   891  	require.NoError(t, err)
   892  	require.Equal(t, 2, len(groupMembers))
   893  
   894  	cm2 := &model.ChannelMember{
   895  		ChannelId:   channel.Id,
   896  		UserId:      user2.Id,
   897  		SchemeGuest: false,
   898  		SchemeUser:  true,
   899  		SchemeAdmin: false,
   900  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   901  	}
   902  	cm3 := &model.ChannelMember{
   903  		ChannelId:   channel.Id,
   904  		UserId:      user3.Id,
   905  		SchemeGuest: false,
   906  		SchemeUser:  true,
   907  		SchemeAdmin: false,
   908  		NotifyProps: model.GetDefaultChannelNotifyProps(),
   909  	}
   910  
   911  	_, err = ss.Channel().SaveMember(cm2)
   912  	require.NoError(t, err)
   913  	_, err = ss.Channel().SaveMember(cm3)
   914  	require.NoError(t, err)
   915  
   916  	// returns none when all members have been added to team and channel
   917  	groupMembers, err = ss.Group().GetMemberUsersNotInChannel(group.Id, channel.Id)
   918  	require.NoError(t, err)
   919  	require.Equal(t, 0, len(groupMembers))
   920  }
   921  
   922  func testUpsertMember(t *testing.T, ss store.Store) {
   923  	// Create group
   924  	g1 := &model.Group{
   925  		Name:        model.NewString(model.NewId()),
   926  		DisplayName: model.NewId(),
   927  		Source:      model.GroupSourceLdap,
   928  		RemoteId:    model.NewId(),
   929  	}
   930  	group, err := ss.Group().Create(g1)
   931  	require.NoError(t, err)
   932  
   933  	// Create user
   934  	u1 := &model.User{
   935  		Email:    MakeEmail(),
   936  		Username: model.NewId(),
   937  	}
   938  	user, nErr := ss.User().Save(u1)
   939  	require.NoError(t, nErr)
   940  
   941  	// Happy path
   942  	d2, err := ss.Group().UpsertMember(group.Id, user.Id)
   943  	require.NoError(t, err)
   944  	require.Equal(t, d2.GroupId, group.Id)
   945  	require.Equal(t, d2.UserId, user.Id)
   946  	require.NotZero(t, d2.CreateAt)
   947  	require.Zero(t, d2.DeleteAt)
   948  
   949  	// Duplicate composite key (GroupId, UserId)
   950  	// Ensure new CreateAt > previous CreateAt for the same (groupId, userId)
   951  	time.Sleep(1 * time.Millisecond)
   952  	_, err = ss.Group().UpsertMember(group.Id, user.Id)
   953  	require.NoError(t, err)
   954  
   955  	// Invalid GroupId
   956  	_, err = ss.Group().UpsertMember(model.NewId(), user.Id)
   957  	require.Error(t, err)
   958  	require.Contains(t, err.Error(), "failed to get UserGroup with")
   959  
   960  	// Restores a deleted member
   961  	// Ensure new CreateAt > previous CreateAt for the same (groupId, userId)
   962  	time.Sleep(1 * time.Millisecond)
   963  	_, err = ss.Group().UpsertMember(group.Id, user.Id)
   964  	require.NoError(t, err)
   965  
   966  	_, err = ss.Group().DeleteMember(group.Id, user.Id)
   967  	require.NoError(t, err)
   968  
   969  	groupMembers, err := ss.Group().GetMemberUsers(group.Id)
   970  	beforeRestoreCount := len(groupMembers)
   971  
   972  	_, err = ss.Group().UpsertMember(group.Id, user.Id)
   973  	require.NoError(t, err)
   974  
   975  	groupMembers, err = ss.Group().GetMemberUsers(group.Id)
   976  	afterRestoreCount := len(groupMembers)
   977  
   978  	require.Equal(t, beforeRestoreCount+1, afterRestoreCount)
   979  }
   980  
   981  func testGroupDeleteMember(t *testing.T, ss store.Store) {
   982  	// Create group
   983  	g1 := &model.Group{
   984  		Name:        model.NewString(model.NewId()),
   985  		DisplayName: model.NewId(),
   986  		Source:      model.GroupSourceLdap,
   987  		RemoteId:    model.NewId(),
   988  	}
   989  	group, err := ss.Group().Create(g1)
   990  	require.NoError(t, err)
   991  
   992  	// Create user
   993  	u1 := &model.User{
   994  		Email:    MakeEmail(),
   995  		Username: model.NewId(),
   996  	}
   997  	user, nErr := ss.User().Save(u1)
   998  	require.NoError(t, nErr)
   999  
  1000  	// Create member
  1001  	d1, err := ss.Group().UpsertMember(group.Id, user.Id)
  1002  	require.NoError(t, err)
  1003  
  1004  	// Happy path
  1005  	d2, err := ss.Group().DeleteMember(group.Id, user.Id)
  1006  	require.NoError(t, err)
  1007  	require.Equal(t, d2.GroupId, group.Id)
  1008  	require.Equal(t, d2.UserId, user.Id)
  1009  	require.Equal(t, d2.CreateAt, d1.CreateAt)
  1010  	require.NotZero(t, d2.DeleteAt)
  1011  
  1012  	// Delete an already deleted member
  1013  	_, err = ss.Group().DeleteMember(group.Id, user.Id)
  1014  	var nfErr *store.ErrNotFound
  1015  	require.True(t, errors.As(err, &nfErr))
  1016  
  1017  	// Delete with non-existent User
  1018  	_, err = ss.Group().DeleteMember(group.Id, model.NewId())
  1019  	require.True(t, errors.As(err, &nfErr))
  1020  
  1021  	// Delete non-existent Group
  1022  	_, err = ss.Group().DeleteMember(model.NewId(), group.Id)
  1023  	require.True(t, errors.As(err, &nfErr))
  1024  }
  1025  
  1026  func testGroupPermanentDeleteMembersByUser(t *testing.T, ss store.Store) {
  1027  	var g *model.Group
  1028  	var groups []*model.Group
  1029  	numberOfGroups := 5
  1030  
  1031  	for i := 0; i < numberOfGroups; i++ {
  1032  		g = &model.Group{
  1033  			Name:        model.NewString(model.NewId()),
  1034  			DisplayName: model.NewId(),
  1035  			Source:      model.GroupSourceLdap,
  1036  			RemoteId:    model.NewId(),
  1037  		}
  1038  		group, err := ss.Group().Create(g)
  1039  		groups = append(groups, group)
  1040  		require.NoError(t, err)
  1041  	}
  1042  
  1043  	// Create user
  1044  	u1 := &model.User{
  1045  		Email:    MakeEmail(),
  1046  		Username: model.NewId(),
  1047  	}
  1048  	user, err := ss.User().Save(u1)
  1049  	require.NoError(t, err)
  1050  
  1051  	// Create members
  1052  	for _, group := range groups {
  1053  		_, err = ss.Group().UpsertMember(group.Id, user.Id)
  1054  		require.NoError(t, err)
  1055  	}
  1056  
  1057  	// Happy path
  1058  	err = ss.Group().PermanentDeleteMembersByUser(user.Id)
  1059  	require.NoError(t, err)
  1060  }
  1061  
  1062  func testCreateGroupSyncable(t *testing.T, ss store.Store) {
  1063  	// Invalid GroupID
  1064  	_, err := ss.Group().CreateGroupSyncable(model.NewGroupTeam("x", model.NewId(), false))
  1065  	var appErr *model.AppError
  1066  	require.True(t, errors.As(err, &appErr))
  1067  	require.Equal(t, appErr.Id, "model.group_syncable.group_id.app_error")
  1068  
  1069  	// Create Group
  1070  	g1 := &model.Group{
  1071  		Name:        model.NewString(model.NewId()),
  1072  		DisplayName: model.NewId(),
  1073  		Source:      model.GroupSourceLdap,
  1074  		RemoteId:    model.NewId(),
  1075  	}
  1076  	group, err := ss.Group().Create(g1)
  1077  	require.NoError(t, err)
  1078  
  1079  	// Create Team
  1080  	t1 := &model.Team{
  1081  		DisplayName:     "Name",
  1082  		Description:     "Some description",
  1083  		CompanyName:     "Some company name",
  1084  		AllowOpenInvite: false,
  1085  		InviteId:        "inviteid0",
  1086  		Name:            "z-z-" + model.NewId() + "a",
  1087  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  1088  		Type:            model.TEAM_OPEN,
  1089  	}
  1090  	team, nErr := ss.Team().Save(t1)
  1091  	require.NoError(t, nErr)
  1092  
  1093  	// New GroupSyncable, happy path
  1094  	gt1 := model.NewGroupTeam(group.Id, team.Id, false)
  1095  	d1, err := ss.Group().CreateGroupSyncable(gt1)
  1096  	require.NoError(t, err)
  1097  	require.Equal(t, gt1.SyncableId, d1.SyncableId)
  1098  	require.Equal(t, gt1.GroupId, d1.GroupId)
  1099  	require.Equal(t, gt1.AutoAdd, d1.AutoAdd)
  1100  	require.NotZero(t, d1.CreateAt)
  1101  	require.Zero(t, d1.DeleteAt)
  1102  }
  1103  
  1104  func testGetGroupSyncable(t *testing.T, ss store.Store) {
  1105  	// Create a group
  1106  	g1 := &model.Group{
  1107  		Name:        model.NewString(model.NewId()),
  1108  		DisplayName: model.NewId(),
  1109  		Description: model.NewId(),
  1110  		Source:      model.GroupSourceLdap,
  1111  		RemoteId:    model.NewId(),
  1112  	}
  1113  	group, err := ss.Group().Create(g1)
  1114  	require.NoError(t, err)
  1115  
  1116  	// Create Team
  1117  	t1 := &model.Team{
  1118  		DisplayName:     "Name",
  1119  		Description:     "Some description",
  1120  		CompanyName:     "Some company name",
  1121  		AllowOpenInvite: false,
  1122  		InviteId:        "inviteid0",
  1123  		Name:            "z-z-" + model.NewId() + "a",
  1124  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  1125  		Type:            model.TEAM_OPEN,
  1126  	}
  1127  	team, nErr := ss.Team().Save(t1)
  1128  	require.NoError(t, nErr)
  1129  
  1130  	// Create GroupSyncable
  1131  	gt1 := model.NewGroupTeam(group.Id, team.Id, false)
  1132  	groupTeam, err := ss.Group().CreateGroupSyncable(gt1)
  1133  	require.NoError(t, err)
  1134  
  1135  	// Get GroupSyncable
  1136  	dgt, err := ss.Group().GetGroupSyncable(groupTeam.GroupId, groupTeam.SyncableId, model.GroupSyncableTypeTeam)
  1137  	require.NoError(t, err)
  1138  	require.Equal(t, gt1.GroupId, dgt.GroupId)
  1139  	require.Equal(t, gt1.SyncableId, dgt.SyncableId)
  1140  	require.Equal(t, gt1.AutoAdd, dgt.AutoAdd)
  1141  	require.NotZero(t, gt1.CreateAt)
  1142  	require.NotZero(t, gt1.UpdateAt)
  1143  	require.Zero(t, gt1.DeleteAt)
  1144  }
  1145  
  1146  func testGetAllGroupSyncablesByGroup(t *testing.T, ss store.Store) {
  1147  	numGroupSyncables := 10
  1148  
  1149  	// Create group
  1150  	g := &model.Group{
  1151  		Name:        model.NewString(model.NewId()),
  1152  		DisplayName: model.NewId(),
  1153  		Description: model.NewId(),
  1154  		Source:      model.GroupSourceLdap,
  1155  		RemoteId:    model.NewId(),
  1156  	}
  1157  	group, err := ss.Group().Create(g)
  1158  	require.NoError(t, err)
  1159  
  1160  	groupTeams := []*model.GroupSyncable{}
  1161  
  1162  	// Create groupTeams
  1163  	for i := 0; i < numGroupSyncables; i++ {
  1164  		// Create Team
  1165  		t1 := &model.Team{
  1166  			DisplayName:     "Name",
  1167  			Description:     "Some description",
  1168  			CompanyName:     "Some company name",
  1169  			AllowOpenInvite: false,
  1170  			InviteId:        "inviteid0",
  1171  			Name:            "z-z-" + model.NewId() + "a",
  1172  			Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  1173  			Type:            model.TEAM_OPEN,
  1174  		}
  1175  		var team *model.Team
  1176  		team, nErr := ss.Team().Save(t1)
  1177  		require.NoError(t, nErr)
  1178  
  1179  		// create groupteam
  1180  		var groupTeam *model.GroupSyncable
  1181  		gt := model.NewGroupTeam(group.Id, team.Id, false)
  1182  		gt.SchemeAdmin = true
  1183  		groupTeam, err = ss.Group().CreateGroupSyncable(gt)
  1184  		require.NoError(t, err)
  1185  		groupTeams = append(groupTeams, groupTeam)
  1186  	}
  1187  
  1188  	// Returns all the group teams
  1189  	d1, err := ss.Group().GetAllGroupSyncablesByGroupId(group.Id, model.GroupSyncableTypeTeam)
  1190  	require.NoError(t, err)
  1191  	require.Condition(t, func() bool { return len(d1) >= numGroupSyncables })
  1192  	for _, expectedGroupTeam := range groupTeams {
  1193  		present := false
  1194  		for _, dbGroupTeam := range d1 {
  1195  			if dbGroupTeam.GroupId == expectedGroupTeam.GroupId && dbGroupTeam.SyncableId == expectedGroupTeam.SyncableId {
  1196  				require.True(t, dbGroupTeam.SchemeAdmin)
  1197  				present = true
  1198  				break
  1199  			}
  1200  		}
  1201  		require.True(t, present)
  1202  	}
  1203  }
  1204  
  1205  func testUpdateGroupSyncable(t *testing.T, ss store.Store) {
  1206  	// Create Group
  1207  	g1 := &model.Group{
  1208  		Name:        model.NewString(model.NewId()),
  1209  		DisplayName: model.NewId(),
  1210  		Source:      model.GroupSourceLdap,
  1211  		RemoteId:    model.NewId(),
  1212  	}
  1213  	group, err := ss.Group().Create(g1)
  1214  	require.NoError(t, err)
  1215  
  1216  	// Create Team
  1217  	t1 := &model.Team{
  1218  		DisplayName:     "Name",
  1219  		Description:     "Some description",
  1220  		CompanyName:     "Some company name",
  1221  		AllowOpenInvite: false,
  1222  		InviteId:        "inviteid0",
  1223  		Name:            "z-z-" + model.NewId() + "a",
  1224  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  1225  		Type:            model.TEAM_OPEN,
  1226  	}
  1227  	team, nErr := ss.Team().Save(t1)
  1228  	require.NoError(t, nErr)
  1229  
  1230  	// New GroupSyncable, happy path
  1231  	gt1 := model.NewGroupTeam(group.Id, team.Id, false)
  1232  	d1, err := ss.Group().CreateGroupSyncable(gt1)
  1233  	require.NoError(t, err)
  1234  
  1235  	// Update existing group team
  1236  	gt1.AutoAdd = true
  1237  	d2, err := ss.Group().UpdateGroupSyncable(gt1)
  1238  	require.NoError(t, err)
  1239  	require.True(t, d2.AutoAdd)
  1240  
  1241  	// Non-existent Group
  1242  	gt2 := model.NewGroupTeam(model.NewId(), team.Id, false)
  1243  	_, err = ss.Group().UpdateGroupSyncable(gt2)
  1244  	var nfErr *store.ErrNotFound
  1245  	require.True(t, errors.As(err, &nfErr))
  1246  
  1247  	// Non-existent Team
  1248  	gt3 := model.NewGroupTeam(group.Id, model.NewId(), false)
  1249  	_, err = ss.Group().UpdateGroupSyncable(gt3)
  1250  	require.True(t, errors.As(err, &nfErr))
  1251  
  1252  	// Cannot update CreateAt or DeleteAt
  1253  	origCreateAt := d1.CreateAt
  1254  	d1.CreateAt = model.GetMillis()
  1255  	d1.AutoAdd = true
  1256  	d3, err := ss.Group().UpdateGroupSyncable(d1)
  1257  	require.NoError(t, err)
  1258  	require.Equal(t, origCreateAt, d3.CreateAt)
  1259  
  1260  	// Cannot update DeleteAt to arbitrary value
  1261  	d1.DeleteAt = 1
  1262  	_, err = ss.Group().UpdateGroupSyncable(d1)
  1263  	require.Error(t, err)
  1264  	require.Contains(t, err.Error(), "DeleteAt should be 0 when updating")
  1265  
  1266  	// Can update DeleteAt to 0
  1267  	d1.DeleteAt = 0
  1268  	d4, err := ss.Group().UpdateGroupSyncable(d1)
  1269  	require.NoError(t, err)
  1270  	require.Zero(t, d4.DeleteAt)
  1271  }
  1272  
  1273  func testDeleteGroupSyncable(t *testing.T, ss store.Store) {
  1274  	// Create Group
  1275  	g1 := &model.Group{
  1276  		Name:        model.NewString(model.NewId()),
  1277  		DisplayName: model.NewId(),
  1278  		Source:      model.GroupSourceLdap,
  1279  		RemoteId:    model.NewId(),
  1280  	}
  1281  	group, err := ss.Group().Create(g1)
  1282  	require.NoError(t, err)
  1283  
  1284  	// Create Team
  1285  	t1 := &model.Team{
  1286  		DisplayName:     "Name",
  1287  		Description:     "Some description",
  1288  		CompanyName:     "Some company name",
  1289  		AllowOpenInvite: false,
  1290  		InviteId:        "inviteid0",
  1291  		Name:            "z-z-" + model.NewId() + "a",
  1292  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  1293  		Type:            model.TEAM_OPEN,
  1294  	}
  1295  	team, nErr := ss.Team().Save(t1)
  1296  	require.NoError(t, nErr)
  1297  
  1298  	// Create GroupSyncable
  1299  	gt1 := model.NewGroupTeam(group.Id, team.Id, false)
  1300  	groupTeam, err := ss.Group().CreateGroupSyncable(gt1)
  1301  	require.NoError(t, err)
  1302  
  1303  	// Non-existent Group
  1304  	_, err = ss.Group().DeleteGroupSyncable(model.NewId(), groupTeam.SyncableId, model.GroupSyncableTypeTeam)
  1305  	var nfErr *store.ErrNotFound
  1306  	require.True(t, errors.As(err, &nfErr))
  1307  
  1308  	// Non-existent Team
  1309  	_, err = ss.Group().DeleteGroupSyncable(groupTeam.GroupId, model.NewId(), model.GroupSyncableTypeTeam)
  1310  	require.True(t, errors.As(err, &nfErr))
  1311  
  1312  	// Happy path...
  1313  	d1, err := ss.Group().DeleteGroupSyncable(groupTeam.GroupId, groupTeam.SyncableId, model.GroupSyncableTypeTeam)
  1314  	require.NoError(t, err)
  1315  	require.NotZero(t, d1.DeleteAt)
  1316  	require.Equal(t, d1.GroupId, groupTeam.GroupId)
  1317  	require.Equal(t, d1.SyncableId, groupTeam.SyncableId)
  1318  	require.Equal(t, d1.AutoAdd, groupTeam.AutoAdd)
  1319  	require.Equal(t, d1.CreateAt, groupTeam.CreateAt)
  1320  	require.Condition(t, func() bool { return d1.UpdateAt > groupTeam.UpdateAt })
  1321  
  1322  	// Record already deleted
  1323  	_, err = ss.Group().DeleteGroupSyncable(d1.GroupId, d1.SyncableId, d1.Type)
  1324  	require.Error(t, err)
  1325  	var invErr *store.ErrInvalidInput
  1326  	require.True(t, errors.As(err, &invErr))
  1327  }
  1328  
  1329  func testTeamMembersToAdd(t *testing.T, ss store.Store) {
  1330  	// Create Group
  1331  	group, err := ss.Group().Create(&model.Group{
  1332  		Name:        model.NewString(model.NewId()),
  1333  		DisplayName: "TeamMembersToAdd Test Group",
  1334  		RemoteId:    model.NewId(),
  1335  		Source:      model.GroupSourceLdap,
  1336  	})
  1337  	require.NoError(t, err)
  1338  
  1339  	// Create User
  1340  	user := &model.User{
  1341  		Email:    MakeEmail(),
  1342  		Username: model.NewId(),
  1343  	}
  1344  	user, nErr := ss.User().Save(user)
  1345  	require.NoError(t, nErr)
  1346  
  1347  	// Create GroupMember
  1348  	_, err = ss.Group().UpsertMember(group.Id, user.Id)
  1349  	require.NoError(t, err)
  1350  
  1351  	// Create Team
  1352  	team := &model.Team{
  1353  		DisplayName:     "Name",
  1354  		Description:     "Some description",
  1355  		CompanyName:     "Some company name",
  1356  		AllowOpenInvite: false,
  1357  		InviteId:        "inviteid0",
  1358  		Name:            "z-z-" + model.NewId() + "a",
  1359  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  1360  		Type:            model.TEAM_OPEN,
  1361  	}
  1362  	team, nErr = ss.Team().Save(team)
  1363  	require.NoError(t, nErr)
  1364  
  1365  	// Create GroupTeam
  1366  	syncable, err := ss.Group().CreateGroupSyncable(model.NewGroupTeam(group.Id, team.Id, true))
  1367  	require.NoError(t, err)
  1368  
  1369  	// Time before syncable was created
  1370  	teamMembers, err := ss.Group().TeamMembersToAdd(syncable.CreateAt-1, nil)
  1371  	require.NoError(t, err)
  1372  	require.Len(t, teamMembers, 1)
  1373  	require.Equal(t, user.Id, teamMembers[0].UserID)
  1374  	require.Equal(t, team.Id, teamMembers[0].TeamID)
  1375  
  1376  	// Time after syncable was created
  1377  	teamMembers, err = ss.Group().TeamMembersToAdd(syncable.CreateAt+1, nil)
  1378  	require.NoError(t, err)
  1379  	require.Empty(t, teamMembers)
  1380  
  1381  	// Delete and restore GroupMember should return result
  1382  	_, err = ss.Group().DeleteMember(group.Id, user.Id)
  1383  	require.NoError(t, err)
  1384  	_, err = ss.Group().UpsertMember(group.Id, user.Id)
  1385  	require.NoError(t, err)
  1386  	teamMembers, err = ss.Group().TeamMembersToAdd(syncable.CreateAt+1, nil)
  1387  	require.NoError(t, err)
  1388  	require.Len(t, teamMembers, 1)
  1389  
  1390  	pristineSyncable := *syncable
  1391  
  1392  	_, err = ss.Group().UpdateGroupSyncable(syncable)
  1393  	require.NoError(t, err)
  1394  
  1395  	// Time before syncable was updated
  1396  	teamMembers, err = ss.Group().TeamMembersToAdd(syncable.UpdateAt-1, nil)
  1397  	require.NoError(t, err)
  1398  	require.Len(t, teamMembers, 1)
  1399  	require.Equal(t, user.Id, teamMembers[0].UserID)
  1400  	require.Equal(t, team.Id, teamMembers[0].TeamID)
  1401  
  1402  	// Time after syncable was updated
  1403  	teamMembers, err = ss.Group().TeamMembersToAdd(syncable.UpdateAt+1, nil)
  1404  	require.NoError(t, err)
  1405  	require.Empty(t, teamMembers)
  1406  
  1407  	// Only includes if auto-add
  1408  	syncable.AutoAdd = false
  1409  	_, err = ss.Group().UpdateGroupSyncable(syncable)
  1410  	require.NoError(t, err)
  1411  	teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
  1412  	require.NoError(t, err)
  1413  	require.Empty(t, teamMembers)
  1414  
  1415  	// reset state of syncable and verify
  1416  	_, err = ss.Group().UpdateGroupSyncable(&pristineSyncable)
  1417  	require.NoError(t, err)
  1418  	teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
  1419  	require.NoError(t, err)
  1420  	require.Len(t, teamMembers, 1)
  1421  
  1422  	// No result if Group deleted
  1423  	_, err = ss.Group().Delete(group.Id)
  1424  	require.NoError(t, err)
  1425  	teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
  1426  	require.NoError(t, err)
  1427  	require.Empty(t, teamMembers)
  1428  
  1429  	// reset state of group and verify
  1430  	group.DeleteAt = 0
  1431  	_, err = ss.Group().Update(group)
  1432  	require.NoError(t, err)
  1433  	teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
  1434  	require.NoError(t, err)
  1435  	require.Len(t, teamMembers, 1)
  1436  
  1437  	// No result if Team deleted
  1438  	team.DeleteAt = model.GetMillis()
  1439  	team, nErr = ss.Team().Update(team)
  1440  	require.NoError(t, nErr)
  1441  	teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
  1442  	require.NoError(t, err)
  1443  	require.Empty(t, teamMembers)
  1444  
  1445  	// reset state of team and verify
  1446  	team.DeleteAt = 0
  1447  	team, nErr = ss.Team().Update(team)
  1448  	require.NoError(t, nErr)
  1449  	teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
  1450  	require.NoError(t, err)
  1451  	require.Len(t, teamMembers, 1)
  1452  
  1453  	// No result if GroupTeam deleted
  1454  	_, err = ss.Group().DeleteGroupSyncable(group.Id, team.Id, model.GroupSyncableTypeTeam)
  1455  	require.NoError(t, err)
  1456  	teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
  1457  	require.NoError(t, err)
  1458  	require.Empty(t, teamMembers)
  1459  
  1460  	// reset GroupTeam and verify
  1461  	_, err = ss.Group().UpdateGroupSyncable(&pristineSyncable)
  1462  	require.NoError(t, err)
  1463  	teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
  1464  	require.NoError(t, err)
  1465  	require.Len(t, teamMembers, 1)
  1466  
  1467  	// No result if GroupMember deleted
  1468  	_, err = ss.Group().DeleteMember(group.Id, user.Id)
  1469  	require.NoError(t, err)
  1470  	teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
  1471  	require.NoError(t, err)
  1472  	require.Empty(t, teamMembers)
  1473  
  1474  	// restore group member and verify
  1475  	_, err = ss.Group().UpsertMember(group.Id, user.Id)
  1476  	require.NoError(t, err)
  1477  	teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
  1478  	require.NoError(t, err)
  1479  	require.Len(t, teamMembers, 1)
  1480  
  1481  	// adding team membership stops returning result
  1482  	_, nErr = ss.Team().SaveMember(&model.TeamMember{
  1483  		TeamId: team.Id,
  1484  		UserId: user.Id,
  1485  	}, 999)
  1486  	require.NoError(t, nErr)
  1487  	teamMembers, err = ss.Group().TeamMembersToAdd(0, nil)
  1488  	require.NoError(t, err)
  1489  	require.Empty(t, teamMembers)
  1490  }
  1491  
  1492  func testTeamMembersToAddSingleTeam(t *testing.T, ss store.Store) {
  1493  	group1, err := ss.Group().Create(&model.Group{
  1494  		Name:        model.NewString(model.NewId()),
  1495  		DisplayName: "TeamMembersToAdd Test Group",
  1496  		RemoteId:    model.NewId(),
  1497  		Source:      model.GroupSourceLdap,
  1498  	})
  1499  	require.NoError(t, err)
  1500  
  1501  	group2, err := ss.Group().Create(&model.Group{
  1502  		Name:        model.NewString(model.NewId()),
  1503  		DisplayName: "TeamMembersToAdd Test Group",
  1504  		RemoteId:    model.NewId(),
  1505  		Source:      model.GroupSourceLdap,
  1506  	})
  1507  	require.NoError(t, err)
  1508  
  1509  	user1 := &model.User{
  1510  		Email:    MakeEmail(),
  1511  		Username: model.NewId(),
  1512  	}
  1513  	user1, nErr := ss.User().Save(user1)
  1514  	require.NoError(t, nErr)
  1515  
  1516  	user2 := &model.User{
  1517  		Email:    MakeEmail(),
  1518  		Username: model.NewId(),
  1519  	}
  1520  	user2, nErr = ss.User().Save(user2)
  1521  	require.NoError(t, nErr)
  1522  
  1523  	user3 := &model.User{
  1524  		Email:    MakeEmail(),
  1525  		Username: model.NewId(),
  1526  	}
  1527  	user3, nErr = ss.User().Save(user3)
  1528  	require.NoError(t, nErr)
  1529  
  1530  	for _, user := range []*model.User{user1, user2} {
  1531  		_, err = ss.Group().UpsertMember(group1.Id, user.Id)
  1532  		require.NoError(t, err)
  1533  	}
  1534  	_, err = ss.Group().UpsertMember(group2.Id, user3.Id)
  1535  	require.NoError(t, err)
  1536  
  1537  	team1 := &model.Team{
  1538  		DisplayName:     "Name",
  1539  		Description:     "Some description",
  1540  		CompanyName:     "Some company name",
  1541  		AllowOpenInvite: false,
  1542  		InviteId:        "inviteid0",
  1543  		Name:            "z-z-" + model.NewId() + "a",
  1544  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  1545  		Type:            model.TEAM_OPEN,
  1546  	}
  1547  	team1, nErr = ss.Team().Save(team1)
  1548  	require.NoError(t, nErr)
  1549  
  1550  	team2 := &model.Team{
  1551  		DisplayName:     "Name",
  1552  		Description:     "Some description",
  1553  		CompanyName:     "Some company name",
  1554  		AllowOpenInvite: false,
  1555  		InviteId:        "inviteid0",
  1556  		Name:            "z-z-" + model.NewId() + "a",
  1557  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  1558  		Type:            model.TEAM_OPEN,
  1559  	}
  1560  	team2, nErr = ss.Team().Save(team2)
  1561  	require.NoError(t, nErr)
  1562  
  1563  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupTeam(group1.Id, team1.Id, true))
  1564  	require.NoError(t, err)
  1565  
  1566  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupTeam(group2.Id, team2.Id, true))
  1567  	require.NoError(t, err)
  1568  
  1569  	teamMembers, err := ss.Group().TeamMembersToAdd(0, nil)
  1570  	require.NoError(t, err)
  1571  	require.Len(t, teamMembers, 3)
  1572  
  1573  	teamMembers, err = ss.Group().TeamMembersToAdd(0, &team1.Id)
  1574  	require.NoError(t, err)
  1575  	require.Len(t, teamMembers, 2)
  1576  
  1577  	teamMembers, err = ss.Group().TeamMembersToAdd(0, &team2.Id)
  1578  	require.NoError(t, err)
  1579  	require.Len(t, teamMembers, 1)
  1580  }
  1581  
  1582  func testChannelMembersToAdd(t *testing.T, ss store.Store) {
  1583  	// Create Group
  1584  	group, err := ss.Group().Create(&model.Group{
  1585  		Name:        model.NewString(model.NewId()),
  1586  		DisplayName: "ChannelMembersToAdd Test Group",
  1587  		RemoteId:    model.NewId(),
  1588  		Source:      model.GroupSourceLdap,
  1589  	})
  1590  	require.NoError(t, err)
  1591  
  1592  	// Create User
  1593  	user := &model.User{
  1594  		Email:    MakeEmail(),
  1595  		Username: model.NewId(),
  1596  	}
  1597  	user, nErr := ss.User().Save(user)
  1598  	require.NoError(t, nErr)
  1599  
  1600  	// Create GroupMember
  1601  	_, err = ss.Group().UpsertMember(group.Id, user.Id)
  1602  	require.NoError(t, err)
  1603  
  1604  	// Create Channel
  1605  	channel := &model.Channel{
  1606  		TeamId:      model.NewId(),
  1607  		DisplayName: "A Name",
  1608  		Name:        model.NewId(),
  1609  		Type:        model.CHANNEL_OPEN, // Query does not look at type so this shouldn't matter.
  1610  	}
  1611  	channel, nErr = ss.Channel().Save(channel, 9999)
  1612  	require.NoError(t, nErr)
  1613  
  1614  	// Create GroupChannel
  1615  	syncable, err := ss.Group().CreateGroupSyncable(model.NewGroupChannel(group.Id, channel.Id, true))
  1616  	require.NoError(t, err)
  1617  
  1618  	// Time before syncable was created
  1619  	channelMembers, err := ss.Group().ChannelMembersToAdd(syncable.CreateAt-1, nil)
  1620  	require.NoError(t, err)
  1621  	require.Len(t, channelMembers, 1)
  1622  	require.Equal(t, user.Id, channelMembers[0].UserID)
  1623  	require.Equal(t, channel.Id, channelMembers[0].ChannelID)
  1624  
  1625  	// Time after syncable was created
  1626  	channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.CreateAt+1, nil)
  1627  	require.NoError(t, err)
  1628  	require.Empty(t, channelMembers)
  1629  
  1630  	// Delete and restore GroupMember should return result
  1631  	_, err = ss.Group().DeleteMember(group.Id, user.Id)
  1632  	require.NoError(t, err)
  1633  	_, err = ss.Group().UpsertMember(group.Id, user.Id)
  1634  	require.NoError(t, err)
  1635  	channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.CreateAt+1, nil)
  1636  	require.NoError(t, err)
  1637  	require.Len(t, channelMembers, 1)
  1638  
  1639  	pristineSyncable := *syncable
  1640  
  1641  	_, err = ss.Group().UpdateGroupSyncable(syncable)
  1642  	require.NoError(t, err)
  1643  
  1644  	// Time before syncable was updated
  1645  	channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.UpdateAt-1, nil)
  1646  	require.NoError(t, err)
  1647  	require.Len(t, channelMembers, 1)
  1648  	require.Equal(t, user.Id, channelMembers[0].UserID)
  1649  	require.Equal(t, channel.Id, channelMembers[0].ChannelID)
  1650  
  1651  	// Time after syncable was updated
  1652  	channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.UpdateAt+1, nil)
  1653  	require.NoError(t, err)
  1654  	require.Empty(t, channelMembers)
  1655  
  1656  	// Only includes if auto-add
  1657  	syncable.AutoAdd = false
  1658  	_, err = ss.Group().UpdateGroupSyncable(syncable)
  1659  	require.NoError(t, err)
  1660  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
  1661  	require.NoError(t, err)
  1662  	require.Empty(t, channelMembers)
  1663  
  1664  	// reset state of syncable and verify
  1665  	_, err = ss.Group().UpdateGroupSyncable(&pristineSyncable)
  1666  	require.NoError(t, err)
  1667  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
  1668  	require.NoError(t, err)
  1669  	require.Len(t, channelMembers, 1)
  1670  
  1671  	// No result if Group deleted
  1672  	_, err = ss.Group().Delete(group.Id)
  1673  	require.NoError(t, err)
  1674  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
  1675  	require.NoError(t, err)
  1676  	require.Empty(t, channelMembers)
  1677  
  1678  	// reset state of group and verify
  1679  	group.DeleteAt = 0
  1680  	_, err = ss.Group().Update(group)
  1681  	require.NoError(t, err)
  1682  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
  1683  	require.NoError(t, err)
  1684  	require.Len(t, channelMembers, 1)
  1685  
  1686  	// No result if Channel deleted
  1687  	nErr = ss.Channel().Delete(channel.Id, model.GetMillis())
  1688  	require.NoError(t, nErr)
  1689  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
  1690  	require.NoError(t, err)
  1691  	require.Empty(t, channelMembers)
  1692  
  1693  	// reset state of channel and verify
  1694  	channel.DeleteAt = 0
  1695  	_, nErr = ss.Channel().Update(channel)
  1696  	require.NoError(t, nErr)
  1697  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
  1698  	require.NoError(t, err)
  1699  	require.Len(t, channelMembers, 1)
  1700  
  1701  	// No result if GroupChannel deleted
  1702  	_, err = ss.Group().DeleteGroupSyncable(group.Id, channel.Id, model.GroupSyncableTypeChannel)
  1703  	require.NoError(t, err)
  1704  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
  1705  	require.NoError(t, err)
  1706  	require.Empty(t, channelMembers)
  1707  
  1708  	// reset GroupChannel and verify
  1709  	_, err = ss.Group().UpdateGroupSyncable(&pristineSyncable)
  1710  	require.NoError(t, err)
  1711  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
  1712  	require.NoError(t, err)
  1713  	require.Len(t, channelMembers, 1)
  1714  
  1715  	// No result if GroupMember deleted
  1716  	_, err = ss.Group().DeleteMember(group.Id, user.Id)
  1717  	require.NoError(t, err)
  1718  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
  1719  	require.NoError(t, err)
  1720  	require.Empty(t, channelMembers)
  1721  
  1722  	// restore group member and verify
  1723  	_, err = ss.Group().UpsertMember(group.Id, user.Id)
  1724  	require.NoError(t, err)
  1725  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
  1726  	require.NoError(t, err)
  1727  	require.Len(t, channelMembers, 1)
  1728  
  1729  	// Adding Channel (ChannelMemberHistory) should stop returning result
  1730  	nErr = ss.ChannelMemberHistory().LogJoinEvent(user.Id, channel.Id, model.GetMillis())
  1731  	require.NoError(t, nErr)
  1732  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
  1733  	require.NoError(t, err)
  1734  	require.Empty(t, channelMembers)
  1735  
  1736  	// Leaving Channel (ChannelMemberHistory) should still not return result
  1737  	nErr = ss.ChannelMemberHistory().LogLeaveEvent(user.Id, channel.Id, model.GetMillis())
  1738  	require.NoError(t, nErr)
  1739  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
  1740  	require.NoError(t, err)
  1741  	require.Empty(t, channelMembers)
  1742  
  1743  	// Purging ChannelMemberHistory re-returns the result
  1744  	_, nErr = ss.ChannelMemberHistory().PermanentDeleteBatch(model.GetMillis()+1, 100)
  1745  	require.NoError(t, nErr)
  1746  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil)
  1747  	require.NoError(t, err)
  1748  	require.Len(t, channelMembers, 1)
  1749  }
  1750  
  1751  func testChannelMembersToAddSingleChannel(t *testing.T, ss store.Store) {
  1752  	group1, err := ss.Group().Create(&model.Group{
  1753  		Name:        model.NewString(model.NewId()),
  1754  		DisplayName: "TeamMembersToAdd Test Group",
  1755  		RemoteId:    model.NewId(),
  1756  		Source:      model.GroupSourceLdap,
  1757  	})
  1758  	require.NoError(t, err)
  1759  
  1760  	group2, err := ss.Group().Create(&model.Group{
  1761  		Name:        model.NewString(model.NewId()),
  1762  		DisplayName: "TeamMembersToAdd Test Group",
  1763  		RemoteId:    model.NewId(),
  1764  		Source:      model.GroupSourceLdap,
  1765  	})
  1766  	require.NoError(t, err)
  1767  
  1768  	user1 := &model.User{
  1769  		Email:    MakeEmail(),
  1770  		Username: model.NewId(),
  1771  	}
  1772  	user1, nErr := ss.User().Save(user1)
  1773  	require.NoError(t, nErr)
  1774  
  1775  	user2 := &model.User{
  1776  		Email:    MakeEmail(),
  1777  		Username: model.NewId(),
  1778  	}
  1779  	user2, nErr = ss.User().Save(user2)
  1780  	require.NoError(t, nErr)
  1781  
  1782  	user3 := &model.User{
  1783  		Email:    MakeEmail(),
  1784  		Username: model.NewId(),
  1785  	}
  1786  	user3, nErr = ss.User().Save(user3)
  1787  	require.NoError(t, nErr)
  1788  
  1789  	for _, user := range []*model.User{user1, user2} {
  1790  		_, err = ss.Group().UpsertMember(group1.Id, user.Id)
  1791  		require.NoError(t, err)
  1792  	}
  1793  	_, err = ss.Group().UpsertMember(group2.Id, user3.Id)
  1794  	require.NoError(t, err)
  1795  
  1796  	channel1 := &model.Channel{
  1797  		DisplayName: "Name",
  1798  		Name:        "z-z-" + model.NewId() + "a",
  1799  		Type:        model.CHANNEL_OPEN,
  1800  	}
  1801  	channel1, nErr = ss.Channel().Save(channel1, 999)
  1802  	require.NoError(t, nErr)
  1803  
  1804  	channel2 := &model.Channel{
  1805  		DisplayName: "Name",
  1806  		Name:        "z-z-" + model.NewId() + "a",
  1807  		Type:        model.CHANNEL_OPEN,
  1808  	}
  1809  	channel2, nErr = ss.Channel().Save(channel2, 999)
  1810  	require.NoError(t, nErr)
  1811  
  1812  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group1.Id, channel1.Id, true))
  1813  	require.NoError(t, err)
  1814  
  1815  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group2.Id, channel2.Id, true))
  1816  	require.NoError(t, err)
  1817  
  1818  	channelMembers, err := ss.Group().ChannelMembersToAdd(0, nil)
  1819  	require.NoError(t, err)
  1820  	require.GreaterOrEqual(t, len(channelMembers), 3)
  1821  
  1822  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, &channel1.Id)
  1823  	require.NoError(t, err)
  1824  	require.Len(t, channelMembers, 2)
  1825  
  1826  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, &channel2.Id)
  1827  	require.NoError(t, err)
  1828  	require.Len(t, channelMembers, 1)
  1829  }
  1830  
  1831  func testTeamMembersToRemove(t *testing.T, ss store.Store) {
  1832  	data := pendingMemberRemovalsDataSetup(t, ss)
  1833  
  1834  	// one result when both users are in the group (for user C)
  1835  	teamMembers, err := ss.Group().TeamMembersToRemove(nil)
  1836  	require.NoError(t, err)
  1837  	require.Len(t, teamMembers, 1)
  1838  	require.Equal(t, data.UserC.Id, teamMembers[0].UserId)
  1839  
  1840  	_, err = ss.Group().DeleteMember(data.Group.Id, data.UserB.Id)
  1841  	require.NoError(t, err)
  1842  
  1843  	// user b and c should now be returned
  1844  	teamMembers, err = ss.Group().TeamMembersToRemove(nil)
  1845  	require.NoError(t, err)
  1846  	require.Len(t, teamMembers, 2)
  1847  
  1848  	var userIDs []string
  1849  	for _, item := range teamMembers {
  1850  		userIDs = append(userIDs, item.UserId)
  1851  	}
  1852  	require.Contains(t, userIDs, data.UserB.Id)
  1853  	require.Contains(t, userIDs, data.UserC.Id)
  1854  	require.Equal(t, data.ConstrainedTeam.Id, teamMembers[0].TeamId)
  1855  	require.Equal(t, data.ConstrainedTeam.Id, teamMembers[1].TeamId)
  1856  
  1857  	_, err = ss.Group().DeleteMember(data.Group.Id, data.UserA.Id)
  1858  	require.NoError(t, err)
  1859  
  1860  	teamMembers, err = ss.Group().TeamMembersToRemove(nil)
  1861  	require.NoError(t, err)
  1862  	require.Len(t, teamMembers, 3)
  1863  
  1864  	// Make one of them a bot
  1865  	teamMembers, err = ss.Group().TeamMembersToRemove(nil)
  1866  	require.NoError(t, err)
  1867  	teamMember := teamMembers[0]
  1868  	bot := &model.Bot{
  1869  		UserId:      teamMember.UserId,
  1870  		Username:    "un_" + model.NewId(),
  1871  		DisplayName: "dn_" + model.NewId(),
  1872  		OwnerId:     teamMember.UserId,
  1873  	}
  1874  	bot, nErr := ss.Bot().Save(bot)
  1875  	require.NoError(t, nErr)
  1876  
  1877  	// verify that bot is not returned in results
  1878  	teamMembers, err = ss.Group().TeamMembersToRemove(nil)
  1879  	require.NoError(t, err)
  1880  	require.Len(t, teamMembers, 2)
  1881  
  1882  	// delete the bot
  1883  	nErr = ss.Bot().PermanentDelete(bot.UserId)
  1884  	require.NoError(t, nErr)
  1885  
  1886  	// Should be back to 3 users
  1887  	teamMembers, err = ss.Group().TeamMembersToRemove(nil)
  1888  	require.NoError(t, err)
  1889  	require.Len(t, teamMembers, 3)
  1890  
  1891  	// add users back to groups
  1892  	res := ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserA.Id)
  1893  	require.NoError(t, res)
  1894  	res = ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserB.Id)
  1895  	require.NoError(t, res)
  1896  	res = ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserC.Id)
  1897  	require.NoError(t, res)
  1898  	nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserA.Id)
  1899  	require.NoError(t, nErr)
  1900  	nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserB.Id)
  1901  	require.NoError(t, nErr)
  1902  	nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserC.Id)
  1903  	require.NoError(t, nErr)
  1904  }
  1905  
  1906  func testTeamMembersToRemoveSingleTeam(t *testing.T, ss store.Store) {
  1907  	user1 := &model.User{
  1908  		Email:    MakeEmail(),
  1909  		Username: model.NewId(),
  1910  	}
  1911  	user1, err := ss.User().Save(user1)
  1912  	require.NoError(t, err)
  1913  
  1914  	user2 := &model.User{
  1915  		Email:    MakeEmail(),
  1916  		Username: model.NewId(),
  1917  	}
  1918  	user2, err = ss.User().Save(user2)
  1919  	require.NoError(t, err)
  1920  
  1921  	user3 := &model.User{
  1922  		Email:    MakeEmail(),
  1923  		Username: model.NewId(),
  1924  	}
  1925  	user3, err = ss.User().Save(user3)
  1926  	require.NoError(t, err)
  1927  
  1928  	team1 := &model.Team{
  1929  		DisplayName:      "Name",
  1930  		Description:      "Some description",
  1931  		CompanyName:      "Some company name",
  1932  		AllowOpenInvite:  false,
  1933  		InviteId:         "inviteid0",
  1934  		Name:             "z-z-" + model.NewId() + "a",
  1935  		Email:            "success+" + model.NewId() + "@simulator.amazonses.com",
  1936  		Type:             model.TEAM_OPEN,
  1937  		GroupConstrained: model.NewBool(true),
  1938  	}
  1939  	team1, nErr := ss.Team().Save(team1)
  1940  	require.NoError(t, nErr)
  1941  
  1942  	team2 := &model.Team{
  1943  		DisplayName:      "Name",
  1944  		Description:      "Some description",
  1945  		CompanyName:      "Some company name",
  1946  		AllowOpenInvite:  false,
  1947  		InviteId:         "inviteid0",
  1948  		Name:             "z-z-" + model.NewId() + "a",
  1949  		Email:            "success+" + model.NewId() + "@simulator.amazonses.com",
  1950  		Type:             model.TEAM_OPEN,
  1951  		GroupConstrained: model.NewBool(true),
  1952  	}
  1953  	team2, nErr = ss.Team().Save(team2)
  1954  	require.NoError(t, nErr)
  1955  
  1956  	for _, user := range []*model.User{user1, user2} {
  1957  		_, nErr = ss.Team().SaveMember(&model.TeamMember{
  1958  			TeamId: team1.Id,
  1959  			UserId: user.Id,
  1960  		}, 999)
  1961  		require.NoError(t, nErr)
  1962  	}
  1963  
  1964  	_, nErr = ss.Team().SaveMember(&model.TeamMember{
  1965  		TeamId: team2.Id,
  1966  		UserId: user3.Id,
  1967  	}, 999)
  1968  	require.NoError(t, nErr)
  1969  
  1970  	teamMembers, err := ss.Group().TeamMembersToRemove(nil)
  1971  	require.NoError(t, err)
  1972  	require.Len(t, teamMembers, 3)
  1973  
  1974  	teamMembers, err = ss.Group().TeamMembersToRemove(&team1.Id)
  1975  	require.NoError(t, err)
  1976  	require.Len(t, teamMembers, 2)
  1977  
  1978  	teamMembers, err = ss.Group().TeamMembersToRemove(&team2.Id)
  1979  	require.NoError(t, err)
  1980  	require.Len(t, teamMembers, 1)
  1981  }
  1982  
  1983  func testChannelMembersToRemove(t *testing.T, ss store.Store) {
  1984  	data := pendingMemberRemovalsDataSetup(t, ss)
  1985  
  1986  	// one result when both users are in the group (for user C)
  1987  	channelMembers, err := ss.Group().ChannelMembersToRemove(nil)
  1988  	require.NoError(t, err)
  1989  	require.Len(t, channelMembers, 1)
  1990  	require.Equal(t, data.UserC.Id, channelMembers[0].UserId)
  1991  
  1992  	_, err = ss.Group().DeleteMember(data.Group.Id, data.UserB.Id)
  1993  	require.NoError(t, err)
  1994  
  1995  	// user b and c should now be returned
  1996  	channelMembers, err = ss.Group().ChannelMembersToRemove(nil)
  1997  	require.NoError(t, err)
  1998  	require.Len(t, channelMembers, 2)
  1999  
  2000  	var userIDs []string
  2001  	for _, item := range channelMembers {
  2002  		userIDs = append(userIDs, item.UserId)
  2003  	}
  2004  	require.Contains(t, userIDs, data.UserB.Id)
  2005  	require.Contains(t, userIDs, data.UserC.Id)
  2006  	require.Equal(t, data.ConstrainedChannel.Id, channelMembers[0].ChannelId)
  2007  	require.Equal(t, data.ConstrainedChannel.Id, channelMembers[1].ChannelId)
  2008  
  2009  	_, err = ss.Group().DeleteMember(data.Group.Id, data.UserA.Id)
  2010  	require.NoError(t, err)
  2011  
  2012  	channelMembers, err = ss.Group().ChannelMembersToRemove(nil)
  2013  	require.NoError(t, err)
  2014  	require.Len(t, channelMembers, 3)
  2015  
  2016  	// Make one of them a bot
  2017  	channelMembers, err = ss.Group().ChannelMembersToRemove(nil)
  2018  	require.NoError(t, err)
  2019  	channelMember := channelMembers[0]
  2020  	bot := &model.Bot{
  2021  		UserId:      channelMember.UserId,
  2022  		Username:    "un_" + model.NewId(),
  2023  		DisplayName: "dn_" + model.NewId(),
  2024  		OwnerId:     channelMember.UserId,
  2025  	}
  2026  	bot, nErr := ss.Bot().Save(bot)
  2027  	require.NoError(t, nErr)
  2028  
  2029  	// verify that bot is not returned in results
  2030  	channelMembers, err = ss.Group().ChannelMembersToRemove(nil)
  2031  	require.NoError(t, err)
  2032  	require.Len(t, channelMembers, 2)
  2033  
  2034  	// delete the bot
  2035  	nErr = ss.Bot().PermanentDelete(bot.UserId)
  2036  	require.NoError(t, nErr)
  2037  
  2038  	// Should be back to 3 users
  2039  	channelMembers, err = ss.Group().ChannelMembersToRemove(nil)
  2040  	require.NoError(t, err)
  2041  	require.Len(t, channelMembers, 3)
  2042  
  2043  	// add users back to groups
  2044  	res := ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserA.Id)
  2045  	require.NoError(t, res)
  2046  	res = ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserB.Id)
  2047  	require.NoError(t, res)
  2048  	res = ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserC.Id)
  2049  	require.NoError(t, res)
  2050  	nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserA.Id)
  2051  	require.NoError(t, nErr)
  2052  	nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserB.Id)
  2053  	require.NoError(t, nErr)
  2054  	nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserC.Id)
  2055  	require.NoError(t, nErr)
  2056  }
  2057  
  2058  func testChannelMembersToRemoveSingleChannel(t *testing.T, ss store.Store) {
  2059  	user1 := &model.User{
  2060  		Email:    MakeEmail(),
  2061  		Username: model.NewId(),
  2062  	}
  2063  	user1, err := ss.User().Save(user1)
  2064  	require.NoError(t, err)
  2065  
  2066  	user2 := &model.User{
  2067  		Email:    MakeEmail(),
  2068  		Username: model.NewId(),
  2069  	}
  2070  	user2, err = ss.User().Save(user2)
  2071  	require.NoError(t, err)
  2072  
  2073  	user3 := &model.User{
  2074  		Email:    MakeEmail(),
  2075  		Username: model.NewId(),
  2076  	}
  2077  	user3, err = ss.User().Save(user3)
  2078  	require.NoError(t, err)
  2079  
  2080  	channel1 := &model.Channel{
  2081  		DisplayName:      "Name",
  2082  		Name:             "z-z-" + model.NewId() + "a",
  2083  		Type:             model.CHANNEL_OPEN,
  2084  		GroupConstrained: model.NewBool(true),
  2085  	}
  2086  	channel1, nErr := ss.Channel().Save(channel1, 999)
  2087  	require.NoError(t, nErr)
  2088  
  2089  	channel2 := &model.Channel{
  2090  		DisplayName:      "Name",
  2091  		Name:             "z-z-" + model.NewId() + "a",
  2092  		Type:             model.CHANNEL_OPEN,
  2093  		GroupConstrained: model.NewBool(true),
  2094  	}
  2095  	channel2, nErr = ss.Channel().Save(channel2, 999)
  2096  	require.NoError(t, nErr)
  2097  
  2098  	for _, user := range []*model.User{user1, user2} {
  2099  		_, nErr = ss.Channel().SaveMember(&model.ChannelMember{
  2100  			ChannelId:   channel1.Id,
  2101  			UserId:      user.Id,
  2102  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  2103  		})
  2104  		require.NoError(t, nErr)
  2105  	}
  2106  
  2107  	_, nErr = ss.Channel().SaveMember(&model.ChannelMember{
  2108  		ChannelId:   channel2.Id,
  2109  		UserId:      user3.Id,
  2110  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2111  	})
  2112  	require.NoError(t, nErr)
  2113  
  2114  	channelMembers, err := ss.Group().ChannelMembersToRemove(nil)
  2115  	require.NoError(t, err)
  2116  	require.Len(t, channelMembers, 3)
  2117  
  2118  	channelMembers, err = ss.Group().ChannelMembersToRemove(&channel1.Id)
  2119  	require.NoError(t, err)
  2120  	require.Len(t, channelMembers, 2)
  2121  
  2122  	channelMembers, err = ss.Group().ChannelMembersToRemove(&channel2.Id)
  2123  	require.NoError(t, err)
  2124  	require.Len(t, channelMembers, 1)
  2125  }
  2126  
  2127  type removalsData struct {
  2128  	UserA                *model.User
  2129  	UserB                *model.User
  2130  	UserC                *model.User
  2131  	ConstrainedChannel   *model.Channel
  2132  	UnconstrainedChannel *model.Channel
  2133  	ConstrainedTeam      *model.Team
  2134  	UnconstrainedTeam    *model.Team
  2135  	Group                *model.Group
  2136  }
  2137  
  2138  func pendingMemberRemovalsDataSetup(t *testing.T, ss store.Store) *removalsData {
  2139  	// create group
  2140  	group, err := ss.Group().Create(&model.Group{
  2141  		Name:        model.NewString(model.NewId()),
  2142  		DisplayName: "Pending[Channel|Team]MemberRemovals Test Group",
  2143  		RemoteId:    model.NewId(),
  2144  		Source:      model.GroupSourceLdap,
  2145  	})
  2146  	require.NoError(t, err)
  2147  
  2148  	// create users
  2149  	// userA will get removed from the group
  2150  	userA := &model.User{
  2151  		Email:    MakeEmail(),
  2152  		Username: model.NewId(),
  2153  	}
  2154  	userA, nErr := ss.User().Save(userA)
  2155  	require.NoError(t, nErr)
  2156  
  2157  	// userB will not get removed from the group
  2158  	userB := &model.User{
  2159  		Email:    MakeEmail(),
  2160  		Username: model.NewId(),
  2161  	}
  2162  	userB, nErr = ss.User().Save(userB)
  2163  	require.NoError(t, nErr)
  2164  
  2165  	// userC was never in the group
  2166  	userC := &model.User{
  2167  		Email:    MakeEmail(),
  2168  		Username: model.NewId(),
  2169  	}
  2170  	userC, nErr = ss.User().Save(userC)
  2171  	require.NoError(t, nErr)
  2172  
  2173  	// add users to group (but not userC)
  2174  	_, err = ss.Group().UpsertMember(group.Id, userA.Id)
  2175  	require.NoError(t, err)
  2176  
  2177  	_, err = ss.Group().UpsertMember(group.Id, userB.Id)
  2178  	require.NoError(t, err)
  2179  
  2180  	// create channels
  2181  	channelConstrained := &model.Channel{
  2182  		TeamId:           model.NewId(),
  2183  		DisplayName:      "A Name",
  2184  		Name:             model.NewId(),
  2185  		Type:             model.CHANNEL_PRIVATE,
  2186  		GroupConstrained: model.NewBool(true),
  2187  	}
  2188  	channelConstrained, nErr = ss.Channel().Save(channelConstrained, 9999)
  2189  	require.NoError(t, nErr)
  2190  
  2191  	channelUnconstrained := &model.Channel{
  2192  		TeamId:      model.NewId(),
  2193  		DisplayName: "A Name",
  2194  		Name:        model.NewId(),
  2195  		Type:        model.CHANNEL_PRIVATE,
  2196  	}
  2197  	channelUnconstrained, nErr = ss.Channel().Save(channelUnconstrained, 9999)
  2198  	require.NoError(t, nErr)
  2199  
  2200  	// create teams
  2201  	teamConstrained := &model.Team{
  2202  		DisplayName:      "Name",
  2203  		Description:      "Some description",
  2204  		CompanyName:      "Some company name",
  2205  		AllowOpenInvite:  false,
  2206  		InviteId:         "inviteid0",
  2207  		Name:             "z-z-" + model.NewId() + "a",
  2208  		Email:            "success+" + model.NewId() + "@simulator.amazonses.com",
  2209  		Type:             model.TEAM_INVITE,
  2210  		GroupConstrained: model.NewBool(true),
  2211  	}
  2212  	teamConstrained, nErr = ss.Team().Save(teamConstrained)
  2213  	require.NoError(t, nErr)
  2214  
  2215  	teamUnconstrained := &model.Team{
  2216  		DisplayName:     "Name",
  2217  		Description:     "Some description",
  2218  		CompanyName:     "Some company name",
  2219  		AllowOpenInvite: false,
  2220  		InviteId:        "inviteid1",
  2221  		Name:            "z-z-" + model.NewId() + "a",
  2222  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  2223  		Type:            model.TEAM_INVITE,
  2224  	}
  2225  	teamUnconstrained, nErr = ss.Team().Save(teamUnconstrained)
  2226  	require.NoError(t, nErr)
  2227  
  2228  	// create groupteams
  2229  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupTeam(group.Id, teamConstrained.Id, true))
  2230  	require.NoError(t, err)
  2231  
  2232  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupTeam(group.Id, teamUnconstrained.Id, true))
  2233  	require.NoError(t, err)
  2234  
  2235  	// create groupchannels
  2236  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group.Id, channelConstrained.Id, true))
  2237  	require.NoError(t, err)
  2238  
  2239  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group.Id, channelUnconstrained.Id, true))
  2240  	require.NoError(t, err)
  2241  
  2242  	// add users to teams
  2243  	userIDTeamIDs := [][]string{
  2244  		{userA.Id, teamConstrained.Id},
  2245  		{userB.Id, teamConstrained.Id},
  2246  		{userC.Id, teamConstrained.Id},
  2247  		{userA.Id, teamUnconstrained.Id},
  2248  		{userB.Id, teamUnconstrained.Id},
  2249  		{userC.Id, teamUnconstrained.Id},
  2250  	}
  2251  
  2252  	for _, item := range userIDTeamIDs {
  2253  		_, nErr = ss.Team().SaveMember(&model.TeamMember{
  2254  			UserId: item[0],
  2255  			TeamId: item[1],
  2256  		}, 99)
  2257  		require.NoError(t, nErr)
  2258  	}
  2259  
  2260  	// add users to channels
  2261  	userIDChannelIDs := [][]string{
  2262  		{userA.Id, channelConstrained.Id},
  2263  		{userB.Id, channelConstrained.Id},
  2264  		{userC.Id, channelConstrained.Id},
  2265  		{userA.Id, channelUnconstrained.Id},
  2266  		{userB.Id, channelUnconstrained.Id},
  2267  		{userC.Id, channelUnconstrained.Id},
  2268  	}
  2269  
  2270  	for _, item := range userIDChannelIDs {
  2271  		_, err := ss.Channel().SaveMember(&model.ChannelMember{
  2272  			UserId:      item[0],
  2273  			ChannelId:   item[1],
  2274  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  2275  		})
  2276  		require.NoError(t, err)
  2277  	}
  2278  
  2279  	return &removalsData{
  2280  		UserA:                userA,
  2281  		UserB:                userB,
  2282  		UserC:                userC,
  2283  		ConstrainedChannel:   channelConstrained,
  2284  		UnconstrainedChannel: channelUnconstrained,
  2285  		ConstrainedTeam:      teamConstrained,
  2286  		UnconstrainedTeam:    teamUnconstrained,
  2287  		Group:                group,
  2288  	}
  2289  }
  2290  
  2291  func testGetGroupsByChannel(t *testing.T, ss store.Store) {
  2292  	// Create Channel1
  2293  	channel1 := &model.Channel{
  2294  		TeamId:      model.NewId(),
  2295  		DisplayName: "Channel1",
  2296  		Name:        model.NewId(),
  2297  		Type:        model.CHANNEL_OPEN,
  2298  	}
  2299  	channel1, err := ss.Channel().Save(channel1, 9999)
  2300  	require.NoError(t, err)
  2301  
  2302  	// Create Groups 1, 2 and a deleted group
  2303  	group1, err := ss.Group().Create(&model.Group{
  2304  		Name:           model.NewString(model.NewId()),
  2305  		DisplayName:    "group-1",
  2306  		RemoteId:       model.NewId(),
  2307  		Source:         model.GroupSourceLdap,
  2308  		AllowReference: true,
  2309  	})
  2310  	require.NoError(t, err)
  2311  
  2312  	group2, err := ss.Group().Create(&model.Group{
  2313  		Name:           model.NewString(model.NewId()),
  2314  		DisplayName:    "group-2",
  2315  		RemoteId:       model.NewId(),
  2316  		Source:         model.GroupSourceLdap,
  2317  		AllowReference: false,
  2318  	})
  2319  	require.NoError(t, err)
  2320  
  2321  	deletedGroup, err := ss.Group().Create(&model.Group{
  2322  		Name:           model.NewString(model.NewId()),
  2323  		DisplayName:    "group-deleted",
  2324  		RemoteId:       model.NewId(),
  2325  		Source:         model.GroupSourceLdap,
  2326  		AllowReference: true,
  2327  		DeleteAt:       1,
  2328  	})
  2329  	require.NoError(t, err)
  2330  
  2331  	// And associate them with Channel1
  2332  	for _, g := range []*model.Group{group1, group2, deletedGroup} {
  2333  		_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  2334  			AutoAdd:    true,
  2335  			SyncableId: channel1.Id,
  2336  			Type:       model.GroupSyncableTypeChannel,
  2337  			GroupId:    g.Id,
  2338  		})
  2339  		require.NoError(t, err)
  2340  	}
  2341  
  2342  	// Create Channel2
  2343  	channel2 := &model.Channel{
  2344  		TeamId:      model.NewId(),
  2345  		DisplayName: "Channel2",
  2346  		Name:        model.NewId(),
  2347  		Type:        model.CHANNEL_OPEN,
  2348  	}
  2349  	channel2, nErr := ss.Channel().Save(channel2, 9999)
  2350  	require.NoError(t, nErr)
  2351  
  2352  	// Create Group3
  2353  	group3, err := ss.Group().Create(&model.Group{
  2354  		Name:           model.NewString(model.NewId()),
  2355  		DisplayName:    "group-3",
  2356  		RemoteId:       model.NewId(),
  2357  		Source:         model.GroupSourceLdap,
  2358  		AllowReference: true,
  2359  	})
  2360  	require.NoError(t, err)
  2361  
  2362  	// And associate it to Channel2
  2363  	_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  2364  		AutoAdd:    true,
  2365  		SyncableId: channel2.Id,
  2366  		Type:       model.GroupSyncableTypeChannel,
  2367  		GroupId:    group3.Id,
  2368  	})
  2369  	require.NoError(t, err)
  2370  
  2371  	// add members
  2372  	u1 := &model.User{
  2373  		Email:    MakeEmail(),
  2374  		Username: model.NewId(),
  2375  	}
  2376  	user1, err := ss.User().Save(u1)
  2377  	require.NoError(t, err)
  2378  
  2379  	u2 := &model.User{
  2380  		Email:    MakeEmail(),
  2381  		Username: model.NewId(),
  2382  	}
  2383  	user2, err := ss.User().Save(u2)
  2384  	require.NoError(t, err)
  2385  
  2386  	_, err = ss.Group().UpsertMember(group1.Id, user1.Id)
  2387  	require.NoError(t, err)
  2388  
  2389  	_, err = ss.Group().UpsertMember(group1.Id, user2.Id)
  2390  	require.NoError(t, err)
  2391  
  2392  	user2.DeleteAt = 1
  2393  	_, err = ss.User().Update(user2, true)
  2394  	require.NoError(t, err)
  2395  
  2396  	group1WithMemberCount := *group1
  2397  	group1WithMemberCount.MemberCount = model.NewInt(1)
  2398  
  2399  	group2WithMemberCount := *group2
  2400  	group2WithMemberCount.MemberCount = model.NewInt(0)
  2401  
  2402  	group1WSA := &model.GroupWithSchemeAdmin{Group: *group1, SchemeAdmin: model.NewBool(false)}
  2403  	group2WSA := &model.GroupWithSchemeAdmin{Group: *group2, SchemeAdmin: model.NewBool(false)}
  2404  	group3WSA := &model.GroupWithSchemeAdmin{Group: *group3, SchemeAdmin: model.NewBool(false)}
  2405  
  2406  	testCases := []struct {
  2407  		Name       string
  2408  		ChannelId  string
  2409  		Page       int
  2410  		PerPage    int
  2411  		Result     []*model.GroupWithSchemeAdmin
  2412  		Opts       model.GroupSearchOpts
  2413  		TotalCount *int64
  2414  	}{
  2415  		{
  2416  			Name:       "Get the two Groups for Channel1",
  2417  			ChannelId:  channel1.Id,
  2418  			Opts:       model.GroupSearchOpts{},
  2419  			Page:       0,
  2420  			PerPage:    60,
  2421  			Result:     []*model.GroupWithSchemeAdmin{group1WSA, group2WSA},
  2422  			TotalCount: model.NewInt64(2),
  2423  		},
  2424  		{
  2425  			Name:      "Get first Group for Channel1 with page 0 with 1 element",
  2426  			ChannelId: channel1.Id,
  2427  			Opts:      model.GroupSearchOpts{},
  2428  			Page:      0,
  2429  			PerPage:   1,
  2430  			Result:    []*model.GroupWithSchemeAdmin{group1WSA},
  2431  		},
  2432  		{
  2433  			Name:      "Get second Group for Channel1 with page 1 with 1 element",
  2434  			ChannelId: channel1.Id,
  2435  			Opts:      model.GroupSearchOpts{},
  2436  			Page:      1,
  2437  			PerPage:   1,
  2438  			Result:    []*model.GroupWithSchemeAdmin{group2WSA},
  2439  		},
  2440  		{
  2441  			Name:      "Get third Group for Channel2",
  2442  			ChannelId: channel2.Id,
  2443  			Opts:      model.GroupSearchOpts{},
  2444  			Page:      0,
  2445  			PerPage:   60,
  2446  			Result:    []*model.GroupWithSchemeAdmin{group3WSA},
  2447  		},
  2448  		{
  2449  			Name:       "Get empty Groups for a fake id",
  2450  			ChannelId:  model.NewId(),
  2451  			Opts:       model.GroupSearchOpts{},
  2452  			Page:       0,
  2453  			PerPage:    60,
  2454  			Result:     []*model.GroupWithSchemeAdmin{},
  2455  			TotalCount: model.NewInt64(0),
  2456  		},
  2457  		{
  2458  			Name:       "Get group matching name",
  2459  			ChannelId:  channel1.Id,
  2460  			Opts:       model.GroupSearchOpts{Q: string([]rune(*group1.Name)[2:10])}, // very low change of a name collision
  2461  			Page:       0,
  2462  			PerPage:    100,
  2463  			Result:     []*model.GroupWithSchemeAdmin{group1WSA},
  2464  			TotalCount: model.NewInt64(1),
  2465  		},
  2466  		{
  2467  			Name:       "Get group matching display name",
  2468  			ChannelId:  channel1.Id,
  2469  			Opts:       model.GroupSearchOpts{Q: "rouP-1"},
  2470  			Page:       0,
  2471  			PerPage:    100,
  2472  			Result:     []*model.GroupWithSchemeAdmin{group1WSA},
  2473  			TotalCount: model.NewInt64(1),
  2474  		},
  2475  		{
  2476  			Name:       "Get group matching multiple display names",
  2477  			ChannelId:  channel1.Id,
  2478  			Opts:       model.GroupSearchOpts{Q: "roUp-"},
  2479  			Page:       0,
  2480  			PerPage:    100,
  2481  			Result:     []*model.GroupWithSchemeAdmin{group1WSA, group2WSA},
  2482  			TotalCount: model.NewInt64(2),
  2483  		},
  2484  		{
  2485  			Name:      "Include member counts",
  2486  			ChannelId: channel1.Id,
  2487  			Opts:      model.GroupSearchOpts{IncludeMemberCount: true},
  2488  			Page:      0,
  2489  			PerPage:   2,
  2490  			Result: []*model.GroupWithSchemeAdmin{
  2491  				{Group: group1WithMemberCount, SchemeAdmin: model.NewBool(false)},
  2492  				{Group: group2WithMemberCount, SchemeAdmin: model.NewBool(false)},
  2493  			},
  2494  		},
  2495  		{
  2496  			Name:      "Include allow reference",
  2497  			ChannelId: channel1.Id,
  2498  			Opts:      model.GroupSearchOpts{FilterAllowReference: true},
  2499  			Page:      0,
  2500  			PerPage:   100,
  2501  			Result:    []*model.GroupWithSchemeAdmin{group1WSA},
  2502  		},
  2503  	}
  2504  
  2505  	for _, tc := range testCases {
  2506  		t.Run(tc.Name, func(t *testing.T) {
  2507  			if tc.Opts.PageOpts == nil {
  2508  				tc.Opts.PageOpts = &model.PageOpts{}
  2509  			}
  2510  			tc.Opts.PageOpts.Page = tc.Page
  2511  			tc.Opts.PageOpts.PerPage = tc.PerPage
  2512  			groups, err := ss.Group().GetGroupsByChannel(tc.ChannelId, tc.Opts)
  2513  			require.NoError(t, err)
  2514  			require.ElementsMatch(t, tc.Result, groups)
  2515  			if tc.TotalCount != nil {
  2516  				var count int64
  2517  				count, err = ss.Group().CountGroupsByChannel(tc.ChannelId, tc.Opts)
  2518  				require.NoError(t, err)
  2519  				require.Equal(t, *tc.TotalCount, count)
  2520  			}
  2521  		})
  2522  	}
  2523  }
  2524  
  2525  func testGetGroupsAssociatedToChannelsByTeam(t *testing.T, ss store.Store) {
  2526  	// Create Team1
  2527  	team1 := &model.Team{
  2528  		DisplayName:     "Team1",
  2529  		Description:     model.NewId(),
  2530  		CompanyName:     model.NewId(),
  2531  		AllowOpenInvite: false,
  2532  		InviteId:        model.NewId(),
  2533  		Name:            "zz" + model.NewId(),
  2534  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  2535  		Type:            model.TEAM_OPEN,
  2536  	}
  2537  	team1, errt := ss.Team().Save(team1)
  2538  	require.NoError(t, errt)
  2539  
  2540  	// Create Channel1
  2541  	channel1 := &model.Channel{
  2542  		TeamId:      team1.Id,
  2543  		DisplayName: "Channel1",
  2544  		Name:        model.NewId(),
  2545  		Type:        model.CHANNEL_OPEN,
  2546  	}
  2547  	channel1, err := ss.Channel().Save(channel1, 9999)
  2548  	require.NoError(t, err)
  2549  
  2550  	// Create Groups 1, 2 and a deleted group
  2551  	group1, err := ss.Group().Create(&model.Group{
  2552  		Name:           model.NewString(model.NewId()),
  2553  		DisplayName:    "group-1",
  2554  		RemoteId:       model.NewId(),
  2555  		Source:         model.GroupSourceLdap,
  2556  		AllowReference: false,
  2557  	})
  2558  	require.NoError(t, err)
  2559  
  2560  	group2, err := ss.Group().Create(&model.Group{
  2561  		Name:           model.NewString(model.NewId()),
  2562  		DisplayName:    "group-2",
  2563  		RemoteId:       model.NewId(),
  2564  		Source:         model.GroupSourceLdap,
  2565  		AllowReference: true,
  2566  	})
  2567  	require.NoError(t, err)
  2568  
  2569  	deletedGroup, err := ss.Group().Create(&model.Group{
  2570  		Name:           model.NewString(model.NewId()),
  2571  		DisplayName:    "group-deleted",
  2572  		RemoteId:       model.NewId(),
  2573  		Source:         model.GroupSourceLdap,
  2574  		AllowReference: true,
  2575  		DeleteAt:       1,
  2576  	})
  2577  	require.NoError(t, err)
  2578  
  2579  	// And associate them with Channel1
  2580  	for _, g := range []*model.Group{group1, group2, deletedGroup} {
  2581  		_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  2582  			AutoAdd:    true,
  2583  			SyncableId: channel1.Id,
  2584  			Type:       model.GroupSyncableTypeChannel,
  2585  			GroupId:    g.Id,
  2586  		})
  2587  		require.NoError(t, err)
  2588  	}
  2589  
  2590  	// Create Channel2
  2591  	channel2 := &model.Channel{
  2592  		TeamId:      team1.Id,
  2593  		DisplayName: "Channel2",
  2594  		Name:        model.NewId(),
  2595  		Type:        model.CHANNEL_OPEN,
  2596  	}
  2597  	channel2, err = ss.Channel().Save(channel2, 9999)
  2598  	require.NoError(t, err)
  2599  
  2600  	// Create Group3
  2601  	group3, err := ss.Group().Create(&model.Group{
  2602  		Name:           model.NewString(model.NewId()),
  2603  		DisplayName:    "group-3",
  2604  		RemoteId:       model.NewId(),
  2605  		Source:         model.GroupSourceLdap,
  2606  		AllowReference: true,
  2607  	})
  2608  	require.NoError(t, err)
  2609  
  2610  	// And associate it to Channel2
  2611  	_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  2612  		AutoAdd:    true,
  2613  		SyncableId: channel2.Id,
  2614  		Type:       model.GroupSyncableTypeChannel,
  2615  		GroupId:    group3.Id,
  2616  	})
  2617  	require.NoError(t, err)
  2618  
  2619  	// add members
  2620  	u1 := &model.User{
  2621  		Email:    MakeEmail(),
  2622  		Username: model.NewId(),
  2623  	}
  2624  	user1, err := ss.User().Save(u1)
  2625  	require.NoError(t, err)
  2626  
  2627  	u2 := &model.User{
  2628  		Email:    MakeEmail(),
  2629  		Username: model.NewId(),
  2630  	}
  2631  	user2, err := ss.User().Save(u2)
  2632  	require.NoError(t, err)
  2633  
  2634  	_, err = ss.Group().UpsertMember(group1.Id, user1.Id)
  2635  	require.NoError(t, err)
  2636  
  2637  	_, err = ss.Group().UpsertMember(group1.Id, user2.Id)
  2638  	require.NoError(t, err)
  2639  
  2640  	user2.DeleteAt = 1
  2641  	_, err = ss.User().Update(user2, true)
  2642  	require.NoError(t, err)
  2643  
  2644  	group1WithMemberCount := *group1
  2645  	group1WithMemberCount.MemberCount = model.NewInt(1)
  2646  
  2647  	group2WithMemberCount := *group2
  2648  	group2WithMemberCount.MemberCount = model.NewInt(0)
  2649  
  2650  	group3WithMemberCount := *group3
  2651  	group3WithMemberCount.MemberCount = model.NewInt(0)
  2652  
  2653  	group1WSA := &model.GroupWithSchemeAdmin{Group: *group1, SchemeAdmin: model.NewBool(false)}
  2654  	group2WSA := &model.GroupWithSchemeAdmin{Group: *group2, SchemeAdmin: model.NewBool(false)}
  2655  	group3WSA := &model.GroupWithSchemeAdmin{Group: *group3, SchemeAdmin: model.NewBool(false)}
  2656  
  2657  	testCases := []struct {
  2658  		Name    string
  2659  		TeamId  string
  2660  		Page    int
  2661  		PerPage int
  2662  		Result  map[string][]*model.GroupWithSchemeAdmin
  2663  		Opts    model.GroupSearchOpts
  2664  	}{
  2665  		{
  2666  			Name:    "Get the groups for Channel1 and Channel2",
  2667  			TeamId:  team1.Id,
  2668  			Opts:    model.GroupSearchOpts{},
  2669  			Page:    0,
  2670  			PerPage: 60,
  2671  			Result:  map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA, group2WSA}, channel2.Id: {group3WSA}},
  2672  		},
  2673  		{
  2674  			Name:    "Get first Group for Channel1 with page 0 with 1 element",
  2675  			TeamId:  team1.Id,
  2676  			Opts:    model.GroupSearchOpts{},
  2677  			Page:    0,
  2678  			PerPage: 1,
  2679  			Result:  map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA}},
  2680  		},
  2681  		{
  2682  			Name:    "Get second Group for Channel1 with page 1 with 1 element",
  2683  			TeamId:  team1.Id,
  2684  			Opts:    model.GroupSearchOpts{},
  2685  			Page:    1,
  2686  			PerPage: 1,
  2687  			Result:  map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group2WSA}},
  2688  		},
  2689  		{
  2690  			Name:    "Get empty Groups for a fake id",
  2691  			TeamId:  model.NewId(),
  2692  			Opts:    model.GroupSearchOpts{},
  2693  			Page:    0,
  2694  			PerPage: 60,
  2695  			Result:  map[string][]*model.GroupWithSchemeAdmin{},
  2696  		},
  2697  		{
  2698  			Name:    "Get group matching name",
  2699  			TeamId:  team1.Id,
  2700  			Opts:    model.GroupSearchOpts{Q: string([]rune(*group1.Name)[2:10])}, // very low chance of a name collision
  2701  			Page:    0,
  2702  			PerPage: 100,
  2703  			Result:  map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA}},
  2704  		},
  2705  		{
  2706  			Name:    "Get group matching display name",
  2707  			TeamId:  team1.Id,
  2708  			Opts:    model.GroupSearchOpts{Q: "rouP-1"},
  2709  			Page:    0,
  2710  			PerPage: 100,
  2711  			Result:  map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA}},
  2712  		},
  2713  		{
  2714  			Name:    "Get group matching multiple display names",
  2715  			TeamId:  team1.Id,
  2716  			Opts:    model.GroupSearchOpts{Q: "roUp-"},
  2717  			Page:    0,
  2718  			PerPage: 100,
  2719  			Result:  map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA, group2WSA}, channel2.Id: {group3WSA}},
  2720  		},
  2721  		{
  2722  			Name:    "Include member counts",
  2723  			TeamId:  team1.Id,
  2724  			Opts:    model.GroupSearchOpts{IncludeMemberCount: true},
  2725  			Page:    0,
  2726  			PerPage: 10,
  2727  			Result: map[string][]*model.GroupWithSchemeAdmin{
  2728  				channel1.Id: {
  2729  					{Group: group1WithMemberCount, SchemeAdmin: model.NewBool(false)},
  2730  					{Group: group2WithMemberCount, SchemeAdmin: model.NewBool(false)},
  2731  				},
  2732  				channel2.Id: {
  2733  					{Group: group3WithMemberCount, SchemeAdmin: model.NewBool(false)},
  2734  				},
  2735  			},
  2736  		},
  2737  		{
  2738  			Name:    "Include allow reference",
  2739  			TeamId:  team1.Id,
  2740  			Opts:    model.GroupSearchOpts{FilterAllowReference: true},
  2741  			Page:    0,
  2742  			PerPage: 2,
  2743  			Result: map[string][]*model.GroupWithSchemeAdmin{
  2744  				channel1.Id: {
  2745  					group2WSA,
  2746  				},
  2747  				channel2.Id: {
  2748  					group3WSA,
  2749  				},
  2750  			},
  2751  		},
  2752  	}
  2753  
  2754  	for _, tc := range testCases {
  2755  		t.Run(tc.Name, func(t *testing.T) {
  2756  			if tc.Opts.PageOpts == nil {
  2757  				tc.Opts.PageOpts = &model.PageOpts{}
  2758  			}
  2759  			tc.Opts.PageOpts.Page = tc.Page
  2760  			tc.Opts.PageOpts.PerPage = tc.PerPage
  2761  			groups, err := ss.Group().GetGroupsAssociatedToChannelsByTeam(tc.TeamId, tc.Opts)
  2762  			require.NoError(t, err)
  2763  			assert.Equal(t, tc.Result, groups)
  2764  		})
  2765  	}
  2766  }
  2767  
  2768  func testGetGroupsByTeam(t *testing.T, ss store.Store) {
  2769  	// Create Team1
  2770  	team1 := &model.Team{
  2771  		DisplayName:     "Team1",
  2772  		Description:     model.NewId(),
  2773  		CompanyName:     model.NewId(),
  2774  		AllowOpenInvite: false,
  2775  		InviteId:        model.NewId(),
  2776  		Name:            "zz" + model.NewId(),
  2777  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  2778  		Type:            model.TEAM_OPEN,
  2779  	}
  2780  	team1, err := ss.Team().Save(team1)
  2781  	require.NoError(t, err)
  2782  
  2783  	// Create Groups 1, 2 and a deleted group
  2784  	group1, err := ss.Group().Create(&model.Group{
  2785  		Name:           model.NewString(model.NewId()),
  2786  		DisplayName:    "group-1",
  2787  		RemoteId:       model.NewId(),
  2788  		Source:         model.GroupSourceLdap,
  2789  		AllowReference: false,
  2790  	})
  2791  	require.NoError(t, err)
  2792  
  2793  	group2, err := ss.Group().Create(&model.Group{
  2794  		Name:           model.NewString(model.NewId()),
  2795  		DisplayName:    "group-2",
  2796  		RemoteId:       model.NewId(),
  2797  		Source:         model.GroupSourceLdap,
  2798  		AllowReference: true,
  2799  	})
  2800  	require.NoError(t, err)
  2801  
  2802  	deletedGroup, err := ss.Group().Create(&model.Group{
  2803  		Name:           model.NewString(model.NewId()),
  2804  		DisplayName:    "group-deleted",
  2805  		RemoteId:       model.NewId(),
  2806  		Source:         model.GroupSourceLdap,
  2807  		AllowReference: true,
  2808  		DeleteAt:       1,
  2809  	})
  2810  	require.NoError(t, err)
  2811  
  2812  	// And associate them with Team1
  2813  	for _, g := range []*model.Group{group1, group2, deletedGroup} {
  2814  		_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  2815  			AutoAdd:    true,
  2816  			SyncableId: team1.Id,
  2817  			Type:       model.GroupSyncableTypeTeam,
  2818  			GroupId:    g.Id,
  2819  		})
  2820  		require.NoError(t, err)
  2821  	}
  2822  
  2823  	// Create Team2
  2824  	team2 := &model.Team{
  2825  		DisplayName:     "Team2",
  2826  		Description:     model.NewId(),
  2827  		CompanyName:     model.NewId(),
  2828  		AllowOpenInvite: false,
  2829  		InviteId:        model.NewId(),
  2830  		Name:            "zz" + model.NewId(),
  2831  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  2832  		Type:            model.TEAM_INVITE,
  2833  	}
  2834  	team2, err = ss.Team().Save(team2)
  2835  	require.NoError(t, err)
  2836  
  2837  	// Create Group3
  2838  	group3, err := ss.Group().Create(&model.Group{
  2839  		Name:           model.NewString(model.NewId()),
  2840  		DisplayName:    "group-3",
  2841  		RemoteId:       model.NewId(),
  2842  		Source:         model.GroupSourceLdap,
  2843  		AllowReference: true,
  2844  	})
  2845  	require.NoError(t, err)
  2846  
  2847  	// And associate it to Team2
  2848  	_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  2849  		AutoAdd:    true,
  2850  		SyncableId: team2.Id,
  2851  		Type:       model.GroupSyncableTypeTeam,
  2852  		GroupId:    group3.Id,
  2853  	})
  2854  	require.NoError(t, err)
  2855  
  2856  	// add members
  2857  	u1 := &model.User{
  2858  		Email:    MakeEmail(),
  2859  		Username: model.NewId(),
  2860  	}
  2861  	user1, err := ss.User().Save(u1)
  2862  	require.NoError(t, err)
  2863  
  2864  	u2 := &model.User{
  2865  		Email:    MakeEmail(),
  2866  		Username: model.NewId(),
  2867  	}
  2868  	user2, err := ss.User().Save(u2)
  2869  	require.NoError(t, err)
  2870  
  2871  	_, err = ss.Group().UpsertMember(group1.Id, user1.Id)
  2872  	require.NoError(t, err)
  2873  
  2874  	_, err = ss.Group().UpsertMember(group1.Id, user2.Id)
  2875  	require.NoError(t, err)
  2876  
  2877  	user2.DeleteAt = 1
  2878  	_, err = ss.User().Update(user2, true)
  2879  	require.NoError(t, err)
  2880  
  2881  	_, err = ss.Group().UpsertMember(deletedGroup.Id, user1.Id)
  2882  	require.NoError(t, err)
  2883  
  2884  	group1WithMemberCount := *group1
  2885  	group1WithMemberCount.MemberCount = model.NewInt(1)
  2886  
  2887  	group2WithMemberCount := *group2
  2888  	group2WithMemberCount.MemberCount = model.NewInt(0)
  2889  
  2890  	group1WSA := &model.GroupWithSchemeAdmin{Group: *group1, SchemeAdmin: model.NewBool(false)}
  2891  	group2WSA := &model.GroupWithSchemeAdmin{Group: *group2, SchemeAdmin: model.NewBool(false)}
  2892  	group3WSA := &model.GroupWithSchemeAdmin{Group: *group3, SchemeAdmin: model.NewBool(false)}
  2893  
  2894  	testCases := []struct {
  2895  		Name       string
  2896  		TeamId     string
  2897  		Page       int
  2898  		PerPage    int
  2899  		Opts       model.GroupSearchOpts
  2900  		Result     []*model.GroupWithSchemeAdmin
  2901  		TotalCount *int64
  2902  	}{
  2903  		{
  2904  			Name:       "Get the two Groups for Team1",
  2905  			TeamId:     team1.Id,
  2906  			Opts:       model.GroupSearchOpts{},
  2907  			Page:       0,
  2908  			PerPage:    60,
  2909  			Result:     []*model.GroupWithSchemeAdmin{group1WSA, group2WSA},
  2910  			TotalCount: model.NewInt64(2),
  2911  		},
  2912  		{
  2913  			Name:    "Get first Group for Team1 with page 0 with 1 element",
  2914  			TeamId:  team1.Id,
  2915  			Opts:    model.GroupSearchOpts{},
  2916  			Page:    0,
  2917  			PerPage: 1,
  2918  			Result:  []*model.GroupWithSchemeAdmin{group1WSA},
  2919  		},
  2920  		{
  2921  			Name:    "Get second Group for Team1 with page 1 with 1 element",
  2922  			TeamId:  team1.Id,
  2923  			Opts:    model.GroupSearchOpts{},
  2924  			Page:    1,
  2925  			PerPage: 1,
  2926  			Result:  []*model.GroupWithSchemeAdmin{group2WSA},
  2927  		},
  2928  		{
  2929  			Name:       "Get third Group for Team2",
  2930  			TeamId:     team2.Id,
  2931  			Opts:       model.GroupSearchOpts{},
  2932  			Page:       0,
  2933  			PerPage:    60,
  2934  			Result:     []*model.GroupWithSchemeAdmin{group3WSA},
  2935  			TotalCount: model.NewInt64(1),
  2936  		},
  2937  		{
  2938  			Name:       "Get empty Groups for a fake id",
  2939  			TeamId:     model.NewId(),
  2940  			Opts:       model.GroupSearchOpts{},
  2941  			Page:       0,
  2942  			PerPage:    60,
  2943  			Result:     []*model.GroupWithSchemeAdmin{},
  2944  			TotalCount: model.NewInt64(0),
  2945  		},
  2946  		{
  2947  			Name:       "Get group matching name",
  2948  			TeamId:     team1.Id,
  2949  			Opts:       model.GroupSearchOpts{Q: string([]rune(*group1.Name)[2:10])}, // very low change of a name collision
  2950  			Page:       0,
  2951  			PerPage:    100,
  2952  			Result:     []*model.GroupWithSchemeAdmin{group1WSA},
  2953  			TotalCount: model.NewInt64(1),
  2954  		},
  2955  		{
  2956  			Name:       "Get group matching display name",
  2957  			TeamId:     team1.Id,
  2958  			Opts:       model.GroupSearchOpts{Q: "rouP-1"},
  2959  			Page:       0,
  2960  			PerPage:    100,
  2961  			Result:     []*model.GroupWithSchemeAdmin{group1WSA},
  2962  			TotalCount: model.NewInt64(1),
  2963  		},
  2964  		{
  2965  			Name:       "Get group matching multiple display names",
  2966  			TeamId:     team1.Id,
  2967  			Opts:       model.GroupSearchOpts{Q: "roUp-"},
  2968  			Page:       0,
  2969  			PerPage:    100,
  2970  			Result:     []*model.GroupWithSchemeAdmin{group1WSA, group2WSA},
  2971  			TotalCount: model.NewInt64(2),
  2972  		},
  2973  		{
  2974  			Name:    "Include member counts",
  2975  			TeamId:  team1.Id,
  2976  			Opts:    model.GroupSearchOpts{IncludeMemberCount: true},
  2977  			Page:    0,
  2978  			PerPage: 2,
  2979  			Result: []*model.GroupWithSchemeAdmin{
  2980  				{Group: group1WithMemberCount, SchemeAdmin: model.NewBool(false)},
  2981  				{Group: group2WithMemberCount, SchemeAdmin: model.NewBool(false)},
  2982  			},
  2983  		},
  2984  		{
  2985  			Name:    "Include allow reference",
  2986  			TeamId:  team1.Id,
  2987  			Opts:    model.GroupSearchOpts{FilterAllowReference: true},
  2988  			Page:    0,
  2989  			PerPage: 100,
  2990  			Result:  []*model.GroupWithSchemeAdmin{group2WSA},
  2991  		},
  2992  	}
  2993  
  2994  	for _, tc := range testCases {
  2995  		t.Run(tc.Name, func(t *testing.T) {
  2996  			if tc.Opts.PageOpts == nil {
  2997  				tc.Opts.PageOpts = &model.PageOpts{}
  2998  			}
  2999  			tc.Opts.PageOpts.Page = tc.Page
  3000  			tc.Opts.PageOpts.PerPage = tc.PerPage
  3001  			groups, err := ss.Group().GetGroupsByTeam(tc.TeamId, tc.Opts)
  3002  			require.NoError(t, err)
  3003  			require.ElementsMatch(t, tc.Result, groups)
  3004  			if tc.TotalCount != nil {
  3005  				var count int64
  3006  				count, err = ss.Group().CountGroupsByTeam(tc.TeamId, tc.Opts)
  3007  				require.NoError(t, err)
  3008  				require.Equal(t, *tc.TotalCount, count)
  3009  			}
  3010  		})
  3011  	}
  3012  }
  3013  
  3014  func testGetGroups(t *testing.T, ss store.Store) {
  3015  	// Create Team1
  3016  	team1 := &model.Team{
  3017  		DisplayName:      "Team1",
  3018  		Description:      model.NewId(),
  3019  		CompanyName:      model.NewId(),
  3020  		AllowOpenInvite:  false,
  3021  		InviteId:         model.NewId(),
  3022  		Name:             "zz" + model.NewId(),
  3023  		Email:            "success+" + model.NewId() + "@simulator.amazonses.com",
  3024  		Type:             model.TEAM_OPEN,
  3025  		GroupConstrained: model.NewBool(true),
  3026  	}
  3027  	team1, err := ss.Team().Save(team1)
  3028  	require.NoError(t, err)
  3029  
  3030  	startCreateTime := team1.UpdateAt - 1
  3031  
  3032  	// Create Channel1
  3033  	channel1 := &model.Channel{
  3034  		TeamId:      model.NewId(),
  3035  		DisplayName: "Channel1",
  3036  		Name:        model.NewId(),
  3037  		Type:        model.CHANNEL_PRIVATE,
  3038  	}
  3039  	channel1, nErr := ss.Channel().Save(channel1, 9999)
  3040  	require.NoError(t, nErr)
  3041  
  3042  	// Create Groups 1 and 2
  3043  	group1, err := ss.Group().Create(&model.Group{
  3044  		Name:           model.NewString(model.NewId()),
  3045  		DisplayName:    "group-1",
  3046  		RemoteId:       model.NewId(),
  3047  		Source:         model.GroupSourceLdap,
  3048  		AllowReference: true,
  3049  	})
  3050  	require.NoError(t, err)
  3051  
  3052  	group2, err := ss.Group().Create(&model.Group{
  3053  		Name:           model.NewString(model.NewId() + "-group-2"),
  3054  		DisplayName:    "group-2",
  3055  		RemoteId:       model.NewId(),
  3056  		Source:         model.GroupSourceLdap,
  3057  		AllowReference: false,
  3058  	})
  3059  	require.NoError(t, err)
  3060  
  3061  	deletedGroup, err := ss.Group().Create(&model.Group{
  3062  		Name:           model.NewString(model.NewId() + "-group-deleted"),
  3063  		DisplayName:    "group-deleted",
  3064  		RemoteId:       model.NewId(),
  3065  		Source:         model.GroupSourceLdap,
  3066  		AllowReference: false,
  3067  		DeleteAt:       1,
  3068  	})
  3069  	require.NoError(t, err)
  3070  
  3071  	// And associate them with Team1
  3072  	for _, g := range []*model.Group{group1, group2, deletedGroup} {
  3073  		_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  3074  			AutoAdd:    true,
  3075  			SyncableId: team1.Id,
  3076  			Type:       model.GroupSyncableTypeTeam,
  3077  			GroupId:    g.Id,
  3078  		})
  3079  		require.NoError(t, err)
  3080  	}
  3081  
  3082  	// Create Team2
  3083  	team2 := &model.Team{
  3084  		DisplayName:     "Team2",
  3085  		Description:     model.NewId(),
  3086  		CompanyName:     model.NewId(),
  3087  		AllowOpenInvite: false,
  3088  		InviteId:        model.NewId(),
  3089  		Name:            "zz" + model.NewId(),
  3090  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  3091  		Type:            model.TEAM_INVITE,
  3092  	}
  3093  	team2, err = ss.Team().Save(team2)
  3094  	require.NoError(t, err)
  3095  
  3096  	// Create Channel2
  3097  	channel2 := &model.Channel{
  3098  		TeamId:      model.NewId(),
  3099  		DisplayName: "Channel2",
  3100  		Name:        model.NewId(),
  3101  		Type:        model.CHANNEL_PRIVATE,
  3102  	}
  3103  	channel2, nErr = ss.Channel().Save(channel2, 9999)
  3104  	require.NoError(t, nErr)
  3105  
  3106  	// Create Channel3
  3107  	channel3 := &model.Channel{
  3108  		TeamId:      team1.Id,
  3109  		DisplayName: "Channel3",
  3110  		Name:        model.NewId(),
  3111  		Type:        model.CHANNEL_PRIVATE,
  3112  	}
  3113  	channel3, nErr = ss.Channel().Save(channel3, 9999)
  3114  	require.NoError(t, nErr)
  3115  
  3116  	// Create Group3
  3117  	group3, err := ss.Group().Create(&model.Group{
  3118  		Name:           model.NewString(model.NewId() + "-group-3"),
  3119  		DisplayName:    "group-3",
  3120  		RemoteId:       model.NewId(),
  3121  		Source:         model.GroupSourceLdap,
  3122  		AllowReference: true,
  3123  	})
  3124  	require.NoError(t, err)
  3125  
  3126  	// And associate it to Team2
  3127  	_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  3128  		AutoAdd:    true,
  3129  		SyncableId: team2.Id,
  3130  		Type:       model.GroupSyncableTypeTeam,
  3131  		GroupId:    group3.Id,
  3132  	})
  3133  	require.NoError(t, err)
  3134  
  3135  	// And associate Group1 to Channel2
  3136  	_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  3137  		AutoAdd:    true,
  3138  		SyncableId: channel2.Id,
  3139  		Type:       model.GroupSyncableTypeChannel,
  3140  		GroupId:    group1.Id,
  3141  	})
  3142  	require.NoError(t, err)
  3143  
  3144  	// And associate Group2 and Group3 to Channel1
  3145  	for _, g := range []*model.Group{group2, group3} {
  3146  		_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  3147  			AutoAdd:    true,
  3148  			SyncableId: channel1.Id,
  3149  			Type:       model.GroupSyncableTypeChannel,
  3150  			GroupId:    g.Id,
  3151  		})
  3152  		require.NoError(t, err)
  3153  	}
  3154  
  3155  	// add members
  3156  	u1 := &model.User{
  3157  		Email:    MakeEmail(),
  3158  		Username: model.NewId(),
  3159  	}
  3160  	user1, err := ss.User().Save(u1)
  3161  	require.NoError(t, err)
  3162  
  3163  	u2 := &model.User{
  3164  		Email:    MakeEmail(),
  3165  		Username: model.NewId(),
  3166  	}
  3167  	user2, err := ss.User().Save(u2)
  3168  	require.NoError(t, err)
  3169  
  3170  	_, err = ss.Group().UpsertMember(group1.Id, user1.Id)
  3171  	require.NoError(t, err)
  3172  
  3173  	_, err = ss.Group().UpsertMember(group1.Id, user2.Id)
  3174  	require.NoError(t, err)
  3175  
  3176  	_, err = ss.Group().UpsertMember(deletedGroup.Id, user1.Id)
  3177  	require.NoError(t, err)
  3178  
  3179  	user2.DeleteAt = 1
  3180  	u2Update, _ := ss.User().Update(user2, true)
  3181  
  3182  	group2NameSubstring := "group-2"
  3183  
  3184  	endCreateTime := u2Update.New.UpdateAt + 1
  3185  
  3186  	// Create Team3
  3187  	team3 := &model.Team{
  3188  		DisplayName:     "Team3",
  3189  		Description:     model.NewId(),
  3190  		CompanyName:     model.NewId(),
  3191  		AllowOpenInvite: false,
  3192  		InviteId:        model.NewId(),
  3193  		Name:            "zz" + model.NewId(),
  3194  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  3195  		Type:            model.TEAM_INVITE,
  3196  	}
  3197  	team3, err = ss.Team().Save(team3)
  3198  	require.NoError(t, err)
  3199  
  3200  	channel4 := &model.Channel{
  3201  		TeamId:      team3.Id,
  3202  		DisplayName: "Channel4",
  3203  		Name:        model.NewId(),
  3204  		Type:        model.CHANNEL_PRIVATE,
  3205  	}
  3206  	channel4, nErr = ss.Channel().Save(channel4, 9999)
  3207  	require.NoError(t, nErr)
  3208  
  3209  	testCases := []struct {
  3210  		Name    string
  3211  		Page    int
  3212  		PerPage int
  3213  		Opts    model.GroupSearchOpts
  3214  		Resultf func([]*model.Group) bool
  3215  	}{
  3216  		{
  3217  			Name:    "Get all the Groups",
  3218  			Opts:    model.GroupSearchOpts{},
  3219  			Page:    0,
  3220  			PerPage: 3,
  3221  			Resultf: func(groups []*model.Group) bool { return len(groups) == 3 },
  3222  		},
  3223  		{
  3224  			Name:    "Get first Group with page 0 with 1 element",
  3225  			Opts:    model.GroupSearchOpts{},
  3226  			Page:    0,
  3227  			PerPage: 1,
  3228  			Resultf: func(groups []*model.Group) bool { return len(groups) == 1 },
  3229  		},
  3230  		{
  3231  			Name:    "Get single result from page 1",
  3232  			Opts:    model.GroupSearchOpts{},
  3233  			Page:    1,
  3234  			PerPage: 1,
  3235  			Resultf: func(groups []*model.Group) bool { return len(groups) == 1 },
  3236  		},
  3237  		{
  3238  			Name:    "Get multiple results from page 1",
  3239  			Opts:    model.GroupSearchOpts{},
  3240  			Page:    1,
  3241  			PerPage: 2,
  3242  			Resultf: func(groups []*model.Group) bool { return len(groups) == 2 },
  3243  		},
  3244  		{
  3245  			Name:    "Get group matching name",
  3246  			Opts:    model.GroupSearchOpts{Q: group2NameSubstring},
  3247  			Page:    0,
  3248  			PerPage: 100,
  3249  			Resultf: func(groups []*model.Group) bool {
  3250  				for _, g := range groups {
  3251  					if !strings.Contains(*g.Name, group2NameSubstring) && !strings.Contains(g.DisplayName, group2NameSubstring) {
  3252  						return false
  3253  					}
  3254  				}
  3255  				return true
  3256  			},
  3257  		},
  3258  		{
  3259  			Name:    "Get group matching display name",
  3260  			Opts:    model.GroupSearchOpts{Q: "rouP-3"},
  3261  			Page:    0,
  3262  			PerPage: 100,
  3263  			Resultf: func(groups []*model.Group) bool {
  3264  				for _, g := range groups {
  3265  					if !strings.Contains(strings.ToLower(g.DisplayName), "roup-3") {
  3266  						return false
  3267  					}
  3268  				}
  3269  				return true
  3270  			},
  3271  		},
  3272  		{
  3273  			Name:    "Get group matching multiple display names",
  3274  			Opts:    model.GroupSearchOpts{Q: "groUp"},
  3275  			Page:    0,
  3276  			PerPage: 100,
  3277  			Resultf: func(groups []*model.Group) bool {
  3278  				for _, g := range groups {
  3279  					if !strings.Contains(strings.ToLower(g.DisplayName), "group") {
  3280  						return false
  3281  					}
  3282  				}
  3283  				return true
  3284  			},
  3285  		},
  3286  		{
  3287  			Name:    "Include member counts",
  3288  			Opts:    model.GroupSearchOpts{IncludeMemberCount: true},
  3289  			Page:    0,
  3290  			PerPage: 100,
  3291  			Resultf: func(groups []*model.Group) bool {
  3292  				for _, g := range groups {
  3293  					if g.MemberCount == nil {
  3294  						return false
  3295  					}
  3296  					if g.Id == group1.Id && *g.MemberCount != 1 {
  3297  						return false
  3298  					}
  3299  					if g.DeleteAt != 0 {
  3300  						return false
  3301  					}
  3302  				}
  3303  				return true
  3304  			},
  3305  		},
  3306  		{
  3307  			Name:    "Not associated to team",
  3308  			Opts:    model.GroupSearchOpts{NotAssociatedToTeam: team2.Id},
  3309  			Page:    0,
  3310  			PerPage: 100,
  3311  			Resultf: func(groups []*model.Group) bool {
  3312  				if len(groups) == 0 {
  3313  					return false
  3314  				}
  3315  				for _, g := range groups {
  3316  					if g.Id == group3.Id {
  3317  						return false
  3318  					}
  3319  					if g.DeleteAt != 0 {
  3320  						return false
  3321  					}
  3322  				}
  3323  				return true
  3324  			},
  3325  		},
  3326  		{
  3327  			Name:    "Not associated to other team",
  3328  			Opts:    model.GroupSearchOpts{NotAssociatedToTeam: team1.Id},
  3329  			Page:    0,
  3330  			PerPage: 100,
  3331  			Resultf: func(groups []*model.Group) bool {
  3332  				if len(groups) == 0 {
  3333  					return false
  3334  				}
  3335  				for _, g := range groups {
  3336  					if g.Id == group1.Id || g.Id == group2.Id {
  3337  						return false
  3338  					}
  3339  					if g.DeleteAt != 0 {
  3340  						return false
  3341  					}
  3342  				}
  3343  				return true
  3344  			},
  3345  		},
  3346  		{
  3347  			Name:    "Include allow reference",
  3348  			Opts:    model.GroupSearchOpts{FilterAllowReference: true},
  3349  			Page:    0,
  3350  			PerPage: 100,
  3351  			Resultf: func(groups []*model.Group) bool {
  3352  				if len(groups) == 0 {
  3353  					return false
  3354  				}
  3355  				for _, g := range groups {
  3356  					if !g.AllowReference {
  3357  						return false
  3358  					}
  3359  					if g.DeleteAt != 0 {
  3360  						return false
  3361  					}
  3362  				}
  3363  				return true
  3364  			},
  3365  		},
  3366  		{
  3367  			Name:    "Use Since return all",
  3368  			Opts:    model.GroupSearchOpts{FilterAllowReference: true, Since: startCreateTime},
  3369  			Page:    0,
  3370  			PerPage: 100,
  3371  			Resultf: func(groups []*model.Group) bool {
  3372  				if len(groups) == 0 {
  3373  					return false
  3374  				}
  3375  				for _, g := range groups {
  3376  					if g.DeleteAt != 0 {
  3377  						return false
  3378  					}
  3379  				}
  3380  				return true
  3381  			},
  3382  		},
  3383  		{
  3384  			Name:    "Use Since return none",
  3385  			Opts:    model.GroupSearchOpts{FilterAllowReference: true, Since: endCreateTime},
  3386  			Page:    0,
  3387  			PerPage: 100,
  3388  			Resultf: func(groups []*model.Group) bool {
  3389  				return len(groups) == 0
  3390  			},
  3391  		},
  3392  		{
  3393  			Name:    "Filter groups from group-constrained teams",
  3394  			Opts:    model.GroupSearchOpts{NotAssociatedToChannel: channel3.Id, FilterParentTeamPermitted: true},
  3395  			Page:    0,
  3396  			PerPage: 100,
  3397  			Resultf: func(groups []*model.Group) bool {
  3398  				return len(groups) == 2 && groups[0].Id == group1.Id && groups[1].Id == group2.Id
  3399  			},
  3400  		},
  3401  		{
  3402  			Name:    "Filter groups from group-constrained page 0",
  3403  			Opts:    model.GroupSearchOpts{NotAssociatedToChannel: channel3.Id, FilterParentTeamPermitted: true},
  3404  			Page:    0,
  3405  			PerPage: 1,
  3406  			Resultf: func(groups []*model.Group) bool {
  3407  				return groups[0].Id == group1.Id
  3408  			},
  3409  		},
  3410  		{
  3411  			Name:    "Filter groups from group-constrained page 1",
  3412  			Opts:    model.GroupSearchOpts{NotAssociatedToChannel: channel3.Id, FilterParentTeamPermitted: true},
  3413  			Page:    1,
  3414  			PerPage: 1,
  3415  			Resultf: func(groups []*model.Group) bool {
  3416  				return groups[0].Id == group2.Id
  3417  			},
  3418  		},
  3419  		{
  3420  			Name:    "Non-group constrained team with no associated groups still returns groups for the child channel",
  3421  			Opts:    model.GroupSearchOpts{NotAssociatedToChannel: channel4.Id, FilterParentTeamPermitted: true},
  3422  			Page:    0,
  3423  			PerPage: 100,
  3424  			Resultf: func(groups []*model.Group) bool {
  3425  				return len(groups) > 0
  3426  			},
  3427  		},
  3428  	}
  3429  
  3430  	for _, tc := range testCases {
  3431  		t.Run(tc.Name, func(t *testing.T) {
  3432  			groups, err := ss.Group().GetGroups(tc.Page, tc.PerPage, tc.Opts)
  3433  			require.NoError(t, err)
  3434  			require.True(t, tc.Resultf(groups))
  3435  		})
  3436  	}
  3437  }
  3438  
  3439  func testTeamMembersMinusGroupMembers(t *testing.T, ss store.Store) {
  3440  	const numberOfGroups = 3
  3441  	const numberOfUsers = 4
  3442  
  3443  	groups := []*model.Group{}
  3444  	users := []*model.User{}
  3445  
  3446  	team := &model.Team{
  3447  		DisplayName:      model.NewId(),
  3448  		Description:      model.NewId(),
  3449  		CompanyName:      model.NewId(),
  3450  		AllowOpenInvite:  false,
  3451  		InviteId:         model.NewId(),
  3452  		Name:             "zz" + model.NewId(),
  3453  		Email:            model.NewId() + "@simulator.amazonses.com",
  3454  		Type:             model.TEAM_OPEN,
  3455  		GroupConstrained: model.NewBool(true),
  3456  	}
  3457  	team, err := ss.Team().Save(team)
  3458  	require.NoError(t, err)
  3459  
  3460  	for i := 0; i < numberOfUsers; i++ {
  3461  		user := &model.User{
  3462  			Email:    MakeEmail(),
  3463  			Username: fmt.Sprintf("%d_%s", i, model.NewId()),
  3464  		}
  3465  		user, err = ss.User().Save(user)
  3466  		require.NoError(t, err)
  3467  		users = append(users, user)
  3468  
  3469  		trueOrFalse := int(math.Mod(float64(i), 2)) == 0
  3470  		_, nErr := ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: user.Id, SchemeUser: trueOrFalse, SchemeAdmin: !trueOrFalse}, 999)
  3471  		require.NoError(t, nErr)
  3472  	}
  3473  
  3474  	// Extra user outside of the group member users.
  3475  	user := &model.User{
  3476  		Email:    MakeEmail(),
  3477  		Username: "99_" + model.NewId(),
  3478  	}
  3479  	user, err = ss.User().Save(user)
  3480  	require.NoError(t, err)
  3481  	users = append(users, user)
  3482  	_, nErr := ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: user.Id, SchemeUser: true, SchemeAdmin: false}, 999)
  3483  	require.NoError(t, nErr)
  3484  
  3485  	for i := 0; i < numberOfGroups; i++ {
  3486  		group := &model.Group{
  3487  			Name:        model.NewString(fmt.Sprintf("n_%d_%s", i, model.NewId())),
  3488  			DisplayName: model.NewId(),
  3489  			Source:      model.GroupSourceLdap,
  3490  			Description: model.NewId(),
  3491  			RemoteId:    model.NewId(),
  3492  		}
  3493  		group, err := ss.Group().Create(group)
  3494  		require.NoError(t, err)
  3495  		groups = append(groups, group)
  3496  	}
  3497  
  3498  	sort.Slice(users, func(i, j int) bool {
  3499  		return users[i].Username < users[j].Username
  3500  	})
  3501  
  3502  	// Add even users to even group, and the inverse
  3503  	for i := 0; i < numberOfUsers; i++ {
  3504  		groupIndex := int(math.Mod(float64(i), 2))
  3505  		_, err := ss.Group().UpsertMember(groups[groupIndex].Id, users[i].Id)
  3506  		require.NoError(t, err)
  3507  
  3508  		// Add everyone to group 2
  3509  		_, err = ss.Group().UpsertMember(groups[numberOfGroups-1].Id, users[i].Id)
  3510  		require.NoError(t, err)
  3511  	}
  3512  
  3513  	testCases := map[string]struct {
  3514  		expectedUserIDs    []string
  3515  		expectedTotalCount int64
  3516  		groupIDs           []string
  3517  		page               int
  3518  		perPage            int
  3519  		setup              func()
  3520  		teardown           func()
  3521  	}{
  3522  		"No group IDs, all members": {
  3523  			expectedUserIDs:    []string{users[0].Id, users[1].Id, users[2].Id, users[3].Id, user.Id},
  3524  			expectedTotalCount: numberOfUsers + 1,
  3525  			groupIDs:           []string{},
  3526  			page:               0,
  3527  			perPage:            100,
  3528  		},
  3529  		"All members, page 1": {
  3530  			expectedUserIDs:    []string{users[0].Id, users[1].Id, users[2].Id},
  3531  			expectedTotalCount: numberOfUsers + 1,
  3532  			groupIDs:           []string{},
  3533  			page:               0,
  3534  			perPage:            3,
  3535  		},
  3536  		"All members, page 2": {
  3537  			expectedUserIDs:    []string{users[3].Id, users[4].Id},
  3538  			expectedTotalCount: numberOfUsers + 1,
  3539  			groupIDs:           []string{},
  3540  			page:               1,
  3541  			perPage:            3,
  3542  		},
  3543  		"Group 1, even users would be removed": {
  3544  			expectedUserIDs:    []string{users[0].Id, users[2].Id, users[4].Id},
  3545  			expectedTotalCount: 3,
  3546  			groupIDs:           []string{groups[1].Id},
  3547  			page:               0,
  3548  			perPage:            100,
  3549  		},
  3550  		"Group 0, odd users would be removed": {
  3551  			expectedUserIDs:    []string{users[1].Id, users[3].Id, users[4].Id},
  3552  			expectedTotalCount: 3,
  3553  			groupIDs:           []string{groups[0].Id},
  3554  			page:               0,
  3555  			perPage:            100,
  3556  		},
  3557  		"All groups, no users would be removed": {
  3558  			expectedUserIDs:    []string{users[4].Id},
  3559  			expectedTotalCount: 1,
  3560  			groupIDs:           []string{groups[0].Id, groups[1].Id},
  3561  			page:               0,
  3562  			perPage:            100,
  3563  		},
  3564  	}
  3565  
  3566  	mapUserIDs := func(users []*model.UserWithGroups) []string {
  3567  		ids := []string{}
  3568  		for _, user := range users {
  3569  			ids = append(ids, user.Id)
  3570  		}
  3571  		return ids
  3572  	}
  3573  
  3574  	for tcName, tc := range testCases {
  3575  		t.Run(tcName, func(t *testing.T) {
  3576  			if tc.setup != nil {
  3577  				tc.setup()
  3578  			}
  3579  
  3580  			if tc.teardown != nil {
  3581  				defer tc.teardown()
  3582  			}
  3583  
  3584  			actual, err := ss.Group().TeamMembersMinusGroupMembers(team.Id, tc.groupIDs, tc.page, tc.perPage)
  3585  			require.NoError(t, err)
  3586  			require.ElementsMatch(t, tc.expectedUserIDs, mapUserIDs(actual))
  3587  
  3588  			actualCount, err := ss.Group().CountTeamMembersMinusGroupMembers(team.Id, tc.groupIDs)
  3589  			require.NoError(t, err)
  3590  			require.Equal(t, tc.expectedTotalCount, actualCount)
  3591  		})
  3592  	}
  3593  }
  3594  
  3595  func testChannelMembersMinusGroupMembers(t *testing.T, ss store.Store) {
  3596  	const numberOfGroups = 3
  3597  	const numberOfUsers = 4
  3598  
  3599  	groups := []*model.Group{}
  3600  	users := []*model.User{}
  3601  
  3602  	channel := &model.Channel{
  3603  		TeamId:           model.NewId(),
  3604  		DisplayName:      "A Name",
  3605  		Name:             model.NewId(),
  3606  		Type:             model.CHANNEL_PRIVATE,
  3607  		GroupConstrained: model.NewBool(true),
  3608  	}
  3609  	channel, err := ss.Channel().Save(channel, 9999)
  3610  	require.NoError(t, err)
  3611  
  3612  	for i := 0; i < numberOfUsers; i++ {
  3613  		user := &model.User{
  3614  			Email:    MakeEmail(),
  3615  			Username: fmt.Sprintf("%d_%s", i, model.NewId()),
  3616  		}
  3617  		user, err = ss.User().Save(user)
  3618  		require.NoError(t, err)
  3619  		users = append(users, user)
  3620  
  3621  		trueOrFalse := int(math.Mod(float64(i), 2)) == 0
  3622  		_, err = ss.Channel().SaveMember(&model.ChannelMember{
  3623  			ChannelId:   channel.Id,
  3624  			UserId:      user.Id,
  3625  			SchemeUser:  trueOrFalse,
  3626  			SchemeAdmin: !trueOrFalse,
  3627  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  3628  		})
  3629  		require.NoError(t, err)
  3630  	}
  3631  
  3632  	// Extra user outside of the group member users.
  3633  	user, err := ss.User().Save(&model.User{
  3634  		Email:    MakeEmail(),
  3635  		Username: "99_" + model.NewId(),
  3636  	})
  3637  	require.NoError(t, err)
  3638  	users = append(users, user)
  3639  	_, err = ss.Channel().SaveMember(&model.ChannelMember{
  3640  		ChannelId:   channel.Id,
  3641  		UserId:      user.Id,
  3642  		SchemeUser:  true,
  3643  		SchemeAdmin: false,
  3644  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  3645  	})
  3646  	require.NoError(t, err)
  3647  
  3648  	for i := 0; i < numberOfGroups; i++ {
  3649  		group := &model.Group{
  3650  			Name:        model.NewString(fmt.Sprintf("n_%d_%s", i, model.NewId())),
  3651  			DisplayName: model.NewId(),
  3652  			Source:      model.GroupSourceLdap,
  3653  			Description: model.NewId(),
  3654  			RemoteId:    model.NewId(),
  3655  		}
  3656  		group, err := ss.Group().Create(group)
  3657  		require.NoError(t, err)
  3658  		groups = append(groups, group)
  3659  	}
  3660  
  3661  	sort.Slice(users, func(i, j int) bool {
  3662  		return users[i].Username < users[j].Username
  3663  	})
  3664  
  3665  	// Add even users to even group, and the inverse
  3666  	for i := 0; i < numberOfUsers; i++ {
  3667  		groupIndex := int(math.Mod(float64(i), 2))
  3668  		_, err := ss.Group().UpsertMember(groups[groupIndex].Id, users[i].Id)
  3669  		require.NoError(t, err)
  3670  
  3671  		// Add everyone to group 2
  3672  		_, err = ss.Group().UpsertMember(groups[numberOfGroups-1].Id, users[i].Id)
  3673  		require.NoError(t, err)
  3674  	}
  3675  
  3676  	testCases := map[string]struct {
  3677  		expectedUserIDs    []string
  3678  		expectedTotalCount int64
  3679  		groupIDs           []string
  3680  		page               int
  3681  		perPage            int
  3682  		setup              func()
  3683  		teardown           func()
  3684  	}{
  3685  		"No group IDs, all members": {
  3686  			expectedUserIDs:    []string{users[0].Id, users[1].Id, users[2].Id, users[3].Id, users[4].Id},
  3687  			expectedTotalCount: numberOfUsers + 1,
  3688  			groupIDs:           []string{},
  3689  			page:               0,
  3690  			perPage:            100,
  3691  		},
  3692  		"All members, page 1": {
  3693  			expectedUserIDs:    []string{users[0].Id, users[1].Id, users[2].Id},
  3694  			expectedTotalCount: numberOfUsers + 1,
  3695  			groupIDs:           []string{},
  3696  			page:               0,
  3697  			perPage:            3,
  3698  		},
  3699  		"All members, page 2": {
  3700  			expectedUserIDs:    []string{users[3].Id, users[4].Id},
  3701  			expectedTotalCount: numberOfUsers + 1,
  3702  			groupIDs:           []string{},
  3703  			page:               1,
  3704  			perPage:            3,
  3705  		},
  3706  		"Group 1, even users would be removed": {
  3707  			expectedUserIDs:    []string{users[0].Id, users[2].Id, users[4].Id},
  3708  			expectedTotalCount: 3,
  3709  			groupIDs:           []string{groups[1].Id},
  3710  			page:               0,
  3711  			perPage:            100,
  3712  		},
  3713  		"Group 0, odd users would be removed": {
  3714  			expectedUserIDs:    []string{users[1].Id, users[3].Id, users[4].Id},
  3715  			expectedTotalCount: 3,
  3716  			groupIDs:           []string{groups[0].Id},
  3717  			page:               0,
  3718  			perPage:            100,
  3719  		},
  3720  		"All groups, no users would be removed": {
  3721  			expectedUserIDs:    []string{users[4].Id},
  3722  			expectedTotalCount: 1,
  3723  			groupIDs:           []string{groups[0].Id, groups[1].Id},
  3724  			page:               0,
  3725  			perPage:            100,
  3726  		},
  3727  	}
  3728  
  3729  	mapUserIDs := func(users []*model.UserWithGroups) []string {
  3730  		ids := []string{}
  3731  		for _, user := range users {
  3732  			ids = append(ids, user.Id)
  3733  		}
  3734  		return ids
  3735  	}
  3736  
  3737  	for tcName, tc := range testCases {
  3738  		t.Run(tcName, func(t *testing.T) {
  3739  			if tc.setup != nil {
  3740  				tc.setup()
  3741  			}
  3742  
  3743  			if tc.teardown != nil {
  3744  				defer tc.teardown()
  3745  			}
  3746  
  3747  			actual, err := ss.Group().ChannelMembersMinusGroupMembers(channel.Id, tc.groupIDs, tc.page, tc.perPage)
  3748  			require.NoError(t, err)
  3749  			require.ElementsMatch(t, tc.expectedUserIDs, mapUserIDs(actual))
  3750  
  3751  			actualCount, err := ss.Group().CountChannelMembersMinusGroupMembers(channel.Id, tc.groupIDs)
  3752  			require.NoError(t, err)
  3753  			require.Equal(t, tc.expectedTotalCount, actualCount)
  3754  		})
  3755  	}
  3756  }
  3757  
  3758  func groupTestGetMemberCount(t *testing.T, ss store.Store) {
  3759  	group := &model.Group{
  3760  		Name:        model.NewString(model.NewId()),
  3761  		DisplayName: model.NewId(),
  3762  		Source:      model.GroupSourceLdap,
  3763  		Description: model.NewId(),
  3764  		RemoteId:    model.NewId(),
  3765  	}
  3766  	group, err := ss.Group().Create(group)
  3767  	require.NoError(t, err)
  3768  
  3769  	var user *model.User
  3770  	var nErr error
  3771  	for i := 0; i < 2; i++ {
  3772  		user = &model.User{
  3773  			Email:    MakeEmail(),
  3774  			Username: fmt.Sprintf("%d_%s", i, model.NewId()),
  3775  		}
  3776  		user, nErr = ss.User().Save(user)
  3777  		require.NoError(t, nErr)
  3778  
  3779  		_, err = ss.Group().UpsertMember(group.Id, user.Id)
  3780  		require.NoError(t, err)
  3781  	}
  3782  
  3783  	count, err := ss.Group().GetMemberCount(group.Id)
  3784  	require.NoError(t, err)
  3785  	require.Equal(t, int64(2), count)
  3786  
  3787  	user.DeleteAt = 1
  3788  	_, nErr = ss.User().Update(user, true)
  3789  	require.NoError(t, nErr)
  3790  
  3791  	count, err = ss.Group().GetMemberCount(group.Id)
  3792  	require.NoError(t, err)
  3793  	require.Equal(t, int64(1), count)
  3794  }
  3795  
  3796  func groupTestAdminRoleGroupsForSyncableMemberChannel(t *testing.T, ss store.Store) {
  3797  	user := &model.User{
  3798  		Email:    MakeEmail(),
  3799  		Username: model.NewId(),
  3800  	}
  3801  	user, err := ss.User().Save(user)
  3802  	require.NoError(t, err)
  3803  
  3804  	group1 := &model.Group{
  3805  		Name:        model.NewString(model.NewId()),
  3806  		DisplayName: model.NewId(),
  3807  		Source:      model.GroupSourceLdap,
  3808  		Description: model.NewId(),
  3809  		RemoteId:    model.NewId(),
  3810  	}
  3811  	group1, err = ss.Group().Create(group1)
  3812  	require.NoError(t, err)
  3813  
  3814  	_, err = ss.Group().UpsertMember(group1.Id, user.Id)
  3815  	require.NoError(t, err)
  3816  
  3817  	group2 := &model.Group{
  3818  		Name:        model.NewString(model.NewId()),
  3819  		DisplayName: model.NewId(),
  3820  		Source:      model.GroupSourceLdap,
  3821  		Description: model.NewId(),
  3822  		RemoteId:    model.NewId(),
  3823  	}
  3824  	group2, err = ss.Group().Create(group2)
  3825  	require.NoError(t, err)
  3826  
  3827  	_, err = ss.Group().UpsertMember(group2.Id, user.Id)
  3828  	require.NoError(t, err)
  3829  
  3830  	channel := &model.Channel{
  3831  		TeamId:      model.NewId(),
  3832  		DisplayName: "A Name",
  3833  		Name:        model.NewId(),
  3834  		Type:        model.CHANNEL_OPEN,
  3835  	}
  3836  	channel, nErr := ss.Channel().Save(channel, 9999)
  3837  	require.NoError(t, nErr)
  3838  
  3839  	_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  3840  		AutoAdd:     true,
  3841  		SyncableId:  channel.Id,
  3842  		Type:        model.GroupSyncableTypeChannel,
  3843  		GroupId:     group1.Id,
  3844  		SchemeAdmin: true,
  3845  	})
  3846  	require.NoError(t, err)
  3847  
  3848  	groupSyncable2, err := ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  3849  		AutoAdd:    true,
  3850  		SyncableId: channel.Id,
  3851  		Type:       model.GroupSyncableTypeChannel,
  3852  		GroupId:    group2.Id,
  3853  	})
  3854  	require.NoError(t, err)
  3855  
  3856  	// User is a member of both groups but only one is SchmeAdmin: true
  3857  	actualGroupIDs, err := ss.Group().AdminRoleGroupsForSyncableMember(user.Id, channel.Id, model.GroupSyncableTypeChannel)
  3858  	require.NoError(t, err)
  3859  	require.ElementsMatch(t, []string{group1.Id}, actualGroupIDs)
  3860  
  3861  	// Update the second group syncable to be SchemeAdmin: true and both groups should be returned
  3862  	groupSyncable2.SchemeAdmin = true
  3863  	_, err = ss.Group().UpdateGroupSyncable(groupSyncable2)
  3864  	require.NoError(t, err)
  3865  	actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, channel.Id, model.GroupSyncableTypeChannel)
  3866  	require.NoError(t, err)
  3867  	require.ElementsMatch(t, []string{group1.Id, group2.Id}, actualGroupIDs)
  3868  
  3869  	// Deleting membership from group should stop the group from being returned
  3870  	_, err = ss.Group().DeleteMember(group1.Id, user.Id)
  3871  	require.NoError(t, err)
  3872  	actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, channel.Id, model.GroupSyncableTypeChannel)
  3873  	require.NoError(t, err)
  3874  	require.ElementsMatch(t, []string{group2.Id}, actualGroupIDs)
  3875  
  3876  	// Deleting group syncable should stop it being returned
  3877  	_, err = ss.Group().DeleteGroupSyncable(group2.Id, channel.Id, model.GroupSyncableTypeChannel)
  3878  	require.NoError(t, err)
  3879  	actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, channel.Id, model.GroupSyncableTypeChannel)
  3880  	require.NoError(t, err)
  3881  	require.ElementsMatch(t, []string{}, actualGroupIDs)
  3882  }
  3883  
  3884  func groupTestAdminRoleGroupsForSyncableMemberTeam(t *testing.T, ss store.Store) {
  3885  	user := &model.User{
  3886  		Email:    MakeEmail(),
  3887  		Username: model.NewId(),
  3888  	}
  3889  	user, err := ss.User().Save(user)
  3890  	require.NoError(t, err)
  3891  
  3892  	group1 := &model.Group{
  3893  		Name:        model.NewString(model.NewId()),
  3894  		DisplayName: model.NewId(),
  3895  		Source:      model.GroupSourceLdap,
  3896  		Description: model.NewId(),
  3897  		RemoteId:    model.NewId(),
  3898  	}
  3899  	group1, err = ss.Group().Create(group1)
  3900  	require.NoError(t, err)
  3901  
  3902  	_, err = ss.Group().UpsertMember(group1.Id, user.Id)
  3903  	require.NoError(t, err)
  3904  
  3905  	group2 := &model.Group{
  3906  		Name:        model.NewString(model.NewId()),
  3907  		DisplayName: model.NewId(),
  3908  		Source:      model.GroupSourceLdap,
  3909  		Description: model.NewId(),
  3910  		RemoteId:    model.NewId(),
  3911  	}
  3912  	group2, err = ss.Group().Create(group2)
  3913  	require.NoError(t, err)
  3914  
  3915  	_, err = ss.Group().UpsertMember(group2.Id, user.Id)
  3916  	require.NoError(t, err)
  3917  
  3918  	team := &model.Team{
  3919  		DisplayName: "A Name",
  3920  		Name:        "zz" + model.NewId(),
  3921  		Type:        model.CHANNEL_OPEN,
  3922  	}
  3923  	team, nErr := ss.Team().Save(team)
  3924  	require.NoError(t, nErr)
  3925  
  3926  	_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  3927  		AutoAdd:     true,
  3928  		SyncableId:  team.Id,
  3929  		Type:        model.GroupSyncableTypeTeam,
  3930  		GroupId:     group1.Id,
  3931  		SchemeAdmin: true,
  3932  	})
  3933  	require.NoError(t, err)
  3934  
  3935  	groupSyncable2, err := ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  3936  		AutoAdd:    true,
  3937  		SyncableId: team.Id,
  3938  		Type:       model.GroupSyncableTypeTeam,
  3939  		GroupId:    group2.Id,
  3940  	})
  3941  	require.NoError(t, err)
  3942  
  3943  	// User is a member of both groups but only one is SchmeAdmin: true
  3944  	actualGroupIDs, err := ss.Group().AdminRoleGroupsForSyncableMember(user.Id, team.Id, model.GroupSyncableTypeTeam)
  3945  	require.NoError(t, err)
  3946  	require.ElementsMatch(t, []string{group1.Id}, actualGroupIDs)
  3947  
  3948  	// Update the second group syncable to be SchemeAdmin: true and both groups should be returned
  3949  	groupSyncable2.SchemeAdmin = true
  3950  	_, err = ss.Group().UpdateGroupSyncable(groupSyncable2)
  3951  	require.NoError(t, err)
  3952  	actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, team.Id, model.GroupSyncableTypeTeam)
  3953  	require.NoError(t, err)
  3954  	require.ElementsMatch(t, []string{group1.Id, group2.Id}, actualGroupIDs)
  3955  
  3956  	// Deleting membership from group should stop the group from being returned
  3957  	_, err = ss.Group().DeleteMember(group1.Id, user.Id)
  3958  	require.NoError(t, err)
  3959  	actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, team.Id, model.GroupSyncableTypeTeam)
  3960  	require.NoError(t, err)
  3961  	require.ElementsMatch(t, []string{group2.Id}, actualGroupIDs)
  3962  
  3963  	// Deleting group syncable should stop it being returned
  3964  	_, err = ss.Group().DeleteGroupSyncable(group2.Id, team.Id, model.GroupSyncableTypeTeam)
  3965  	require.NoError(t, err)
  3966  	actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, team.Id, model.GroupSyncableTypeTeam)
  3967  	require.NoError(t, err)
  3968  	require.ElementsMatch(t, []string{}, actualGroupIDs)
  3969  }
  3970  
  3971  func groupTestPermittedSyncableAdminsTeam(t *testing.T, ss store.Store) {
  3972  	user1 := &model.User{
  3973  		Email:    MakeEmail(),
  3974  		Username: model.NewId(),
  3975  	}
  3976  	user1, err := ss.User().Save(user1)
  3977  	require.NoError(t, err)
  3978  
  3979  	user2 := &model.User{
  3980  		Email:    MakeEmail(),
  3981  		Username: model.NewId(),
  3982  	}
  3983  	user2, err = ss.User().Save(user2)
  3984  	require.NoError(t, err)
  3985  
  3986  	user3 := &model.User{
  3987  		Email:    MakeEmail(),
  3988  		Username: model.NewId(),
  3989  	}
  3990  	user3, err = ss.User().Save(user3)
  3991  	require.NoError(t, err)
  3992  
  3993  	group1 := &model.Group{
  3994  		Name:        model.NewString(model.NewId()),
  3995  		DisplayName: model.NewId(),
  3996  		Source:      model.GroupSourceLdap,
  3997  		Description: model.NewId(),
  3998  		RemoteId:    model.NewId(),
  3999  	}
  4000  	group1, err = ss.Group().Create(group1)
  4001  	require.NoError(t, err)
  4002  
  4003  	_, err = ss.Group().UpsertMember(group1.Id, user1.Id)
  4004  	require.NoError(t, err)
  4005  	_, err = ss.Group().UpsertMember(group1.Id, user2.Id)
  4006  	require.NoError(t, err)
  4007  
  4008  	group2 := &model.Group{
  4009  		Name:        model.NewString(model.NewId()),
  4010  		DisplayName: model.NewId(),
  4011  		Source:      model.GroupSourceLdap,
  4012  		Description: model.NewId(),
  4013  		RemoteId:    model.NewId(),
  4014  	}
  4015  	group2, err = ss.Group().Create(group2)
  4016  	require.NoError(t, err)
  4017  
  4018  	_, err = ss.Group().UpsertMember(group2.Id, user3.Id)
  4019  	require.NoError(t, err)
  4020  
  4021  	team := &model.Team{
  4022  		DisplayName: "A Name",
  4023  		Name:        "zz" + model.NewId(),
  4024  		Type:        model.CHANNEL_OPEN,
  4025  	}
  4026  	team, nErr := ss.Team().Save(team)
  4027  	require.NoError(t, nErr)
  4028  
  4029  	_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  4030  		AutoAdd:     true,
  4031  		SyncableId:  team.Id,
  4032  		Type:        model.GroupSyncableTypeTeam,
  4033  		GroupId:     group1.Id,
  4034  		SchemeAdmin: true,
  4035  	})
  4036  	require.NoError(t, err)
  4037  
  4038  	groupSyncable2, err := ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  4039  		AutoAdd:     true,
  4040  		SyncableId:  team.Id,
  4041  		Type:        model.GroupSyncableTypeTeam,
  4042  		GroupId:     group2.Id,
  4043  		SchemeAdmin: false,
  4044  	})
  4045  	require.NoError(t, err)
  4046  
  4047  	// group 1's users are returned because groupsyncable 2 has SchemeAdmin false.
  4048  	actualUserIDs, err := ss.Group().PermittedSyncableAdmins(team.Id, model.GroupSyncableTypeTeam)
  4049  	require.NoError(t, err)
  4050  	require.ElementsMatch(t, []string{user1.Id, user2.Id}, actualUserIDs)
  4051  
  4052  	// update groupsyncable 2 to be SchemeAdmin true
  4053  	groupSyncable2.SchemeAdmin = true
  4054  	_, err = ss.Group().UpdateGroupSyncable(groupSyncable2)
  4055  	require.NoError(t, err)
  4056  
  4057  	// group 2's users are now included in return value
  4058  	actualUserIDs, err = ss.Group().PermittedSyncableAdmins(team.Id, model.GroupSyncableTypeTeam)
  4059  	require.NoError(t, err)
  4060  	require.ElementsMatch(t, []string{user1.Id, user2.Id, user3.Id}, actualUserIDs)
  4061  
  4062  	// deleted group member should not be included
  4063  	ss.Group().DeleteMember(group1.Id, user2.Id)
  4064  	require.NoError(t, err)
  4065  	actualUserIDs, err = ss.Group().PermittedSyncableAdmins(team.Id, model.GroupSyncableTypeTeam)
  4066  	require.NoError(t, err)
  4067  	require.ElementsMatch(t, []string{user1.Id, user3.Id}, actualUserIDs)
  4068  
  4069  	// deleted group syncable no longer includes group members
  4070  	_, err = ss.Group().DeleteGroupSyncable(group1.Id, team.Id, model.GroupSyncableTypeTeam)
  4071  	require.NoError(t, err)
  4072  	actualUserIDs, err = ss.Group().PermittedSyncableAdmins(team.Id, model.GroupSyncableTypeTeam)
  4073  	require.NoError(t, err)
  4074  	require.ElementsMatch(t, []string{user3.Id}, actualUserIDs)
  4075  }
  4076  
  4077  func groupTestPermittedSyncableAdminsChannel(t *testing.T, ss store.Store) {
  4078  	user1 := &model.User{
  4079  		Email:    MakeEmail(),
  4080  		Username: model.NewId(),
  4081  	}
  4082  	user1, err := ss.User().Save(user1)
  4083  	require.NoError(t, err)
  4084  
  4085  	user2 := &model.User{
  4086  		Email:    MakeEmail(),
  4087  		Username: model.NewId(),
  4088  	}
  4089  	user2, err = ss.User().Save(user2)
  4090  	require.NoError(t, err)
  4091  
  4092  	user3 := &model.User{
  4093  		Email:    MakeEmail(),
  4094  		Username: model.NewId(),
  4095  	}
  4096  	user3, err = ss.User().Save(user3)
  4097  	require.NoError(t, err)
  4098  
  4099  	group1 := &model.Group{
  4100  		Name:        model.NewString(model.NewId()),
  4101  		DisplayName: model.NewId(),
  4102  		Source:      model.GroupSourceLdap,
  4103  		Description: model.NewId(),
  4104  		RemoteId:    model.NewId(),
  4105  	}
  4106  	group1, err = ss.Group().Create(group1)
  4107  	require.NoError(t, err)
  4108  
  4109  	_, err = ss.Group().UpsertMember(group1.Id, user1.Id)
  4110  	require.NoError(t, err)
  4111  	_, err = ss.Group().UpsertMember(group1.Id, user2.Id)
  4112  	require.NoError(t, err)
  4113  
  4114  	group2 := &model.Group{
  4115  		Name:        model.NewString(model.NewId()),
  4116  		DisplayName: model.NewId(),
  4117  		Source:      model.GroupSourceLdap,
  4118  		Description: model.NewId(),
  4119  		RemoteId:    model.NewId(),
  4120  	}
  4121  	group2, err = ss.Group().Create(group2)
  4122  	require.NoError(t, err)
  4123  
  4124  	_, err = ss.Group().UpsertMember(group2.Id, user3.Id)
  4125  	require.NoError(t, err)
  4126  
  4127  	channel := &model.Channel{
  4128  		TeamId:      model.NewId(),
  4129  		DisplayName: "A Name",
  4130  		Name:        model.NewId(),
  4131  		Type:        model.CHANNEL_OPEN,
  4132  	}
  4133  	channel, nErr := ss.Channel().Save(channel, 9999)
  4134  	require.NoError(t, nErr)
  4135  
  4136  	_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  4137  		AutoAdd:     true,
  4138  		SyncableId:  channel.Id,
  4139  		Type:        model.GroupSyncableTypeChannel,
  4140  		GroupId:     group1.Id,
  4141  		SchemeAdmin: true,
  4142  	})
  4143  	require.NoError(t, err)
  4144  
  4145  	groupSyncable2, err := ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  4146  		AutoAdd:     true,
  4147  		SyncableId:  channel.Id,
  4148  		Type:        model.GroupSyncableTypeChannel,
  4149  		GroupId:     group2.Id,
  4150  		SchemeAdmin: false,
  4151  	})
  4152  	require.NoError(t, err)
  4153  
  4154  	// group 1's users are returned because groupsyncable 2 has SchemeAdmin false.
  4155  	actualUserIDs, err := ss.Group().PermittedSyncableAdmins(channel.Id, model.GroupSyncableTypeChannel)
  4156  	require.NoError(t, err)
  4157  	require.ElementsMatch(t, []string{user1.Id, user2.Id}, actualUserIDs)
  4158  
  4159  	// update groupsyncable 2 to be SchemeAdmin true
  4160  	groupSyncable2.SchemeAdmin = true
  4161  	_, err = ss.Group().UpdateGroupSyncable(groupSyncable2)
  4162  	require.NoError(t, err)
  4163  
  4164  	// group 2's users are now included in return value
  4165  	actualUserIDs, err = ss.Group().PermittedSyncableAdmins(channel.Id, model.GroupSyncableTypeChannel)
  4166  	require.NoError(t, err)
  4167  	require.ElementsMatch(t, []string{user1.Id, user2.Id, user3.Id}, actualUserIDs)
  4168  
  4169  	// deleted group member should not be included
  4170  	ss.Group().DeleteMember(group1.Id, user2.Id)
  4171  	require.NoError(t, err)
  4172  	actualUserIDs, err = ss.Group().PermittedSyncableAdmins(channel.Id, model.GroupSyncableTypeChannel)
  4173  	require.NoError(t, err)
  4174  	require.ElementsMatch(t, []string{user1.Id, user3.Id}, actualUserIDs)
  4175  
  4176  	// deleted group syncable no longer includes group members
  4177  	_, err = ss.Group().DeleteGroupSyncable(group1.Id, channel.Id, model.GroupSyncableTypeChannel)
  4178  	require.NoError(t, err)
  4179  	actualUserIDs, err = ss.Group().PermittedSyncableAdmins(channel.Id, model.GroupSyncableTypeChannel)
  4180  	require.NoError(t, err)
  4181  	require.ElementsMatch(t, []string{user3.Id}, actualUserIDs)
  4182  }
  4183  
  4184  func groupTestpUpdateMembersRoleTeam(t *testing.T, ss store.Store) {
  4185  	team := &model.Team{
  4186  		DisplayName:     "Name",
  4187  		Description:     "Some description",
  4188  		CompanyName:     "Some company name",
  4189  		AllowOpenInvite: false,
  4190  		InviteId:        "inviteid0",
  4191  		Name:            "z-z-" + model.NewId() + "a",
  4192  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  4193  		Type:            model.TEAM_OPEN,
  4194  	}
  4195  	team, err := ss.Team().Save(team)
  4196  	require.NoError(t, err)
  4197  
  4198  	user1 := &model.User{
  4199  		Email:    MakeEmail(),
  4200  		Username: model.NewId(),
  4201  	}
  4202  	user1, err = ss.User().Save(user1)
  4203  	require.NoError(t, err)
  4204  
  4205  	user2 := &model.User{
  4206  		Email:    MakeEmail(),
  4207  		Username: model.NewId(),
  4208  	}
  4209  	user2, err = ss.User().Save(user2)
  4210  	require.NoError(t, err)
  4211  
  4212  	user3 := &model.User{
  4213  		Email:    MakeEmail(),
  4214  		Username: model.NewId(),
  4215  	}
  4216  	user3, err = ss.User().Save(user3)
  4217  	require.NoError(t, err)
  4218  
  4219  	user4 := &model.User{
  4220  		Email:    MakeEmail(),
  4221  		Username: model.NewId(),
  4222  	}
  4223  	user4, err = ss.User().Save(user4)
  4224  	require.NoError(t, err)
  4225  
  4226  	for _, user := range []*model.User{user1, user2, user3} {
  4227  		_, nErr := ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: user.Id}, 9999)
  4228  		require.NoError(t, nErr)
  4229  	}
  4230  
  4231  	_, nErr := ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: user4.Id, SchemeGuest: true}, 9999)
  4232  	require.NoError(t, nErr)
  4233  
  4234  	tests := []struct {
  4235  		testName               string
  4236  		inUserIDs              []string
  4237  		targetSchemeAdminValue bool
  4238  	}{
  4239  		{
  4240  			"Given users are admins",
  4241  			[]string{user1.Id, user2.Id},
  4242  			true,
  4243  		},
  4244  		{
  4245  			"Given users are members",
  4246  			[]string{user2.Id},
  4247  			false,
  4248  		},
  4249  		{
  4250  			"Non-given users are admins",
  4251  			[]string{user2.Id},
  4252  			false,
  4253  		},
  4254  		{
  4255  			"Non-given users are members",
  4256  			[]string{user2.Id},
  4257  			false,
  4258  		},
  4259  	}
  4260  
  4261  	for _, tt := range tests {
  4262  		t.Run(tt.testName, func(t *testing.T) {
  4263  			err = ss.Team().UpdateMembersRole(team.Id, tt.inUserIDs)
  4264  			require.NoError(t, err)
  4265  
  4266  			members, err := ss.Team().GetMembers(team.Id, 0, 100, nil)
  4267  			require.NoError(t, err)
  4268  			require.GreaterOrEqual(t, len(members), 4) // sanity check for team membership
  4269  
  4270  			for _, member := range members {
  4271  				if utils.StringInSlice(member.UserId, tt.inUserIDs) {
  4272  					require.True(t, member.SchemeAdmin)
  4273  				} else {
  4274  					require.False(t, member.SchemeAdmin)
  4275  				}
  4276  
  4277  				// Ensure guest account never changes.
  4278  				if member.UserId == user4.Id {
  4279  					require.False(t, member.SchemeUser)
  4280  					require.False(t, member.SchemeAdmin)
  4281  					require.True(t, member.SchemeGuest)
  4282  				}
  4283  			}
  4284  		})
  4285  	}
  4286  }
  4287  
  4288  func groupTestpUpdateMembersRoleChannel(t *testing.T, ss store.Store) {
  4289  	channel := &model.Channel{
  4290  		TeamId:      model.NewId(),
  4291  		DisplayName: "A Name",
  4292  		Name:        model.NewId(),
  4293  		Type:        model.CHANNEL_OPEN, // Query does not look at type so this shouldn't matter.
  4294  	}
  4295  	channel, err := ss.Channel().Save(channel, 9999)
  4296  	require.NoError(t, err)
  4297  
  4298  	user1 := &model.User{
  4299  		Email:    MakeEmail(),
  4300  		Username: model.NewId(),
  4301  	}
  4302  	user1, err = ss.User().Save(user1)
  4303  	require.NoError(t, err)
  4304  
  4305  	user2 := &model.User{
  4306  		Email:    MakeEmail(),
  4307  		Username: model.NewId(),
  4308  	}
  4309  	user2, err = ss.User().Save(user2)
  4310  	require.NoError(t, err)
  4311  
  4312  	user3 := &model.User{
  4313  		Email:    MakeEmail(),
  4314  		Username: model.NewId(),
  4315  	}
  4316  	user3, err = ss.User().Save(user3)
  4317  	require.NoError(t, err)
  4318  
  4319  	user4 := &model.User{
  4320  		Email:    MakeEmail(),
  4321  		Username: model.NewId(),
  4322  	}
  4323  	user4, err = ss.User().Save(user4)
  4324  	require.NoError(t, err)
  4325  
  4326  	for _, user := range []*model.User{user1, user2, user3} {
  4327  		_, err = ss.Channel().SaveMember(&model.ChannelMember{
  4328  			ChannelId:   channel.Id,
  4329  			UserId:      user.Id,
  4330  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  4331  		})
  4332  		require.NoError(t, err)
  4333  	}
  4334  
  4335  	_, err = ss.Channel().SaveMember(&model.ChannelMember{
  4336  		ChannelId:   channel.Id,
  4337  		UserId:      user4.Id,
  4338  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4339  		SchemeGuest: true,
  4340  	})
  4341  	require.NoError(t, err)
  4342  
  4343  	tests := []struct {
  4344  		testName               string
  4345  		inUserIDs              []string
  4346  		targetSchemeAdminValue bool
  4347  	}{
  4348  		{
  4349  			"Given users are admins",
  4350  			[]string{user1.Id, user2.Id},
  4351  			true,
  4352  		},
  4353  		{
  4354  			"Given users are members",
  4355  			[]string{user2.Id},
  4356  			false,
  4357  		},
  4358  		{
  4359  			"Non-given users are admins",
  4360  			[]string{user2.Id},
  4361  			false,
  4362  		},
  4363  		{
  4364  			"Non-given users are members",
  4365  			[]string{user2.Id},
  4366  			false,
  4367  		},
  4368  	}
  4369  
  4370  	for _, tt := range tests {
  4371  		t.Run(tt.testName, func(t *testing.T) {
  4372  			err = ss.Channel().UpdateMembersRole(channel.Id, tt.inUserIDs)
  4373  			require.NoError(t, err)
  4374  
  4375  			members, err := ss.Channel().GetMembers(channel.Id, 0, 100)
  4376  			require.NoError(t, err)
  4377  
  4378  			require.GreaterOrEqual(t, len(*members), 4) // sanity check for channel membership
  4379  
  4380  			for _, member := range *members {
  4381  				if utils.StringInSlice(member.UserId, tt.inUserIDs) {
  4382  					require.True(t, member.SchemeAdmin)
  4383  				} else {
  4384  					require.False(t, member.SchemeAdmin)
  4385  				}
  4386  
  4387  				// Ensure guest account never changes.
  4388  				if member.UserId == user4.Id {
  4389  					require.False(t, member.SchemeUser)
  4390  					require.False(t, member.SchemeAdmin)
  4391  					require.True(t, member.SchemeGuest)
  4392  				}
  4393  			}
  4394  		})
  4395  	}
  4396  }
  4397  
  4398  func groupTestGroupCount(t *testing.T, ss store.Store) {
  4399  	group1, err := ss.Group().Create(&model.Group{
  4400  		Name:        model.NewString(model.NewId()),
  4401  		DisplayName: model.NewId(),
  4402  		Source:      model.GroupSourceLdap,
  4403  		RemoteId:    model.NewId(),
  4404  	})
  4405  	require.NoError(t, err)
  4406  	defer ss.Group().Delete(group1.Id)
  4407  
  4408  	count, err := ss.Group().GroupCount()
  4409  	require.NoError(t, err)
  4410  	require.GreaterOrEqual(t, count, int64(1))
  4411  
  4412  	group2, err := ss.Group().Create(&model.Group{
  4413  		Name:        model.NewString(model.NewId()),
  4414  		DisplayName: model.NewId(),
  4415  		Source:      model.GroupSourceLdap,
  4416  		RemoteId:    model.NewId(),
  4417  	})
  4418  	require.NoError(t, err)
  4419  	defer ss.Group().Delete(group2.Id)
  4420  
  4421  	countAfter, err := ss.Group().GroupCount()
  4422  	require.NoError(t, err)
  4423  	require.GreaterOrEqual(t, countAfter, count+1)
  4424  }
  4425  
  4426  func groupTestGroupTeamCount(t *testing.T, ss store.Store) {
  4427  	team, err := ss.Team().Save(&model.Team{
  4428  		DisplayName:     model.NewId(),
  4429  		Description:     model.NewId(),
  4430  		AllowOpenInvite: false,
  4431  		InviteId:        model.NewId(),
  4432  		Name:            "zz" + model.NewId(),
  4433  		Email:           model.NewId() + "@simulator.amazonses.com",
  4434  		Type:            model.TEAM_OPEN,
  4435  	})
  4436  	require.NoError(t, err)
  4437  	defer ss.Team().PermanentDelete(team.Id)
  4438  
  4439  	group1, err := ss.Group().Create(&model.Group{
  4440  		Name:        model.NewString(model.NewId()),
  4441  		DisplayName: model.NewId(),
  4442  		Source:      model.GroupSourceLdap,
  4443  		RemoteId:    model.NewId(),
  4444  	})
  4445  	require.NoError(t, err)
  4446  	defer ss.Group().Delete(group1.Id)
  4447  
  4448  	group2, err := ss.Group().Create(&model.Group{
  4449  		Name:        model.NewString(model.NewId()),
  4450  		DisplayName: model.NewId(),
  4451  		Source:      model.GroupSourceLdap,
  4452  		RemoteId:    model.NewId(),
  4453  	})
  4454  	require.NoError(t, err)
  4455  	defer ss.Group().Delete(group2.Id)
  4456  
  4457  	groupSyncable1, err := ss.Group().CreateGroupSyncable(model.NewGroupTeam(group1.Id, team.Id, false))
  4458  	require.NoError(t, err)
  4459  	defer ss.Group().DeleteGroupSyncable(groupSyncable1.GroupId, groupSyncable1.SyncableId, groupSyncable1.Type)
  4460  
  4461  	count, err := ss.Group().GroupTeamCount()
  4462  	require.NoError(t, err)
  4463  	require.GreaterOrEqual(t, count, int64(1))
  4464  
  4465  	groupSyncable2, err := ss.Group().CreateGroupSyncable(model.NewGroupTeam(group2.Id, team.Id, false))
  4466  	require.NoError(t, err)
  4467  	defer ss.Group().DeleteGroupSyncable(groupSyncable2.GroupId, groupSyncable2.SyncableId, groupSyncable2.Type)
  4468  
  4469  	countAfter, err := ss.Group().GroupTeamCount()
  4470  	require.NoError(t, err)
  4471  	require.GreaterOrEqual(t, countAfter, count+1)
  4472  }
  4473  
  4474  func groupTestGroupChannelCount(t *testing.T, ss store.Store) {
  4475  	channel, err := ss.Channel().Save(&model.Channel{
  4476  		TeamId:      model.NewId(),
  4477  		DisplayName: model.NewId(),
  4478  		Name:        model.NewId(),
  4479  		Type:        model.CHANNEL_OPEN,
  4480  	}, 9999)
  4481  	require.NoError(t, err)
  4482  	defer ss.Channel().Delete(channel.Id, 0)
  4483  
  4484  	group1, err := ss.Group().Create(&model.Group{
  4485  		Name:        model.NewString(model.NewId()),
  4486  		DisplayName: model.NewId(),
  4487  		Source:      model.GroupSourceLdap,
  4488  		RemoteId:    model.NewId(),
  4489  	})
  4490  	require.NoError(t, err)
  4491  	defer ss.Group().Delete(group1.Id)
  4492  
  4493  	group2, err := ss.Group().Create(&model.Group{
  4494  		Name:        model.NewString(model.NewId()),
  4495  		DisplayName: model.NewId(),
  4496  		Source:      model.GroupSourceLdap,
  4497  		RemoteId:    model.NewId(),
  4498  	})
  4499  	require.NoError(t, err)
  4500  	defer ss.Group().Delete(group2.Id)
  4501  
  4502  	groupSyncable1, err := ss.Group().CreateGroupSyncable(model.NewGroupChannel(group1.Id, channel.Id, false))
  4503  	require.NoError(t, err)
  4504  	defer ss.Group().DeleteGroupSyncable(groupSyncable1.GroupId, groupSyncable1.SyncableId, groupSyncable1.Type)
  4505  
  4506  	count, err := ss.Group().GroupChannelCount()
  4507  	require.NoError(t, err)
  4508  	require.GreaterOrEqual(t, count, int64(1))
  4509  
  4510  	groupSyncable2, err := ss.Group().CreateGroupSyncable(model.NewGroupChannel(group2.Id, channel.Id, false))
  4511  	require.NoError(t, err)
  4512  	defer ss.Group().DeleteGroupSyncable(groupSyncable2.GroupId, groupSyncable2.SyncableId, groupSyncable2.Type)
  4513  
  4514  	countAfter, err := ss.Group().GroupChannelCount()
  4515  	require.NoError(t, err)
  4516  	require.GreaterOrEqual(t, countAfter, count+1)
  4517  }
  4518  
  4519  func groupTestGroupMemberCount(t *testing.T, ss store.Store) {
  4520  	group, err := ss.Group().Create(&model.Group{
  4521  		Name:        model.NewString(model.NewId()),
  4522  		DisplayName: model.NewId(),
  4523  		Source:      model.GroupSourceLdap,
  4524  		RemoteId:    model.NewId(),
  4525  	})
  4526  	require.NoError(t, err)
  4527  	defer ss.Group().Delete(group.Id)
  4528  
  4529  	member1, err := ss.Group().UpsertMember(group.Id, model.NewId())
  4530  	require.NoError(t, err)
  4531  	defer ss.Group().DeleteMember(group.Id, member1.UserId)
  4532  
  4533  	count, err := ss.Group().GroupMemberCount()
  4534  	require.NoError(t, err)
  4535  	require.GreaterOrEqual(t, count, int64(1))
  4536  
  4537  	member2, err := ss.Group().UpsertMember(group.Id, model.NewId())
  4538  	require.NoError(t, err)
  4539  	defer ss.Group().DeleteMember(group.Id, member2.UserId)
  4540  
  4541  	countAfter, err := ss.Group().GroupMemberCount()
  4542  	require.NoError(t, err)
  4543  	require.GreaterOrEqual(t, countAfter, count+1)
  4544  }
  4545  
  4546  func groupTestDistinctGroupMemberCount(t *testing.T, ss store.Store) {
  4547  	group1, err := ss.Group().Create(&model.Group{
  4548  		Name:        model.NewString(model.NewId()),
  4549  		DisplayName: model.NewId(),
  4550  		Source:      model.GroupSourceLdap,
  4551  		RemoteId:    model.NewId(),
  4552  	})
  4553  	require.NoError(t, err)
  4554  	defer ss.Group().Delete(group1.Id)
  4555  
  4556  	group2, err := ss.Group().Create(&model.Group{
  4557  		Name:        model.NewString(model.NewId()),
  4558  		DisplayName: model.NewId(),
  4559  		Source:      model.GroupSourceLdap,
  4560  		RemoteId:    model.NewId(),
  4561  	})
  4562  	require.NoError(t, err)
  4563  	defer ss.Group().Delete(group2.Id)
  4564  
  4565  	member1, err := ss.Group().UpsertMember(group1.Id, model.NewId())
  4566  	require.NoError(t, err)
  4567  	defer ss.Group().DeleteMember(group1.Id, member1.UserId)
  4568  
  4569  	count, err := ss.Group().GroupMemberCount()
  4570  	require.NoError(t, err)
  4571  	require.GreaterOrEqual(t, count, int64(1))
  4572  
  4573  	member2, err := ss.Group().UpsertMember(group1.Id, model.NewId())
  4574  	require.NoError(t, err)
  4575  	defer ss.Group().DeleteMember(group1.Id, member2.UserId)
  4576  
  4577  	countAfter1, err := ss.Group().GroupMemberCount()
  4578  	require.NoError(t, err)
  4579  	require.GreaterOrEqual(t, countAfter1, count+1)
  4580  
  4581  	member3, err := ss.Group().UpsertMember(group1.Id, member1.UserId)
  4582  	require.NoError(t, err)
  4583  	defer ss.Group().DeleteMember(group1.Id, member3.UserId)
  4584  
  4585  	countAfter2, err := ss.Group().GroupMemberCount()
  4586  	require.NoError(t, err)
  4587  	require.GreaterOrEqual(t, countAfter2, countAfter1)
  4588  }
  4589  
  4590  func groupTestGroupCountWithAllowReference(t *testing.T, ss store.Store) {
  4591  	initialCount, err := ss.Group().GroupCountWithAllowReference()
  4592  	require.NoError(t, err)
  4593  
  4594  	group1, err := ss.Group().Create(&model.Group{
  4595  		Name:        model.NewString(model.NewId()),
  4596  		DisplayName: model.NewId(),
  4597  		Source:      model.GroupSourceLdap,
  4598  		RemoteId:    model.NewId(),
  4599  	})
  4600  	require.NoError(t, err)
  4601  	defer ss.Group().Delete(group1.Id)
  4602  
  4603  	count, err := ss.Group().GroupCountWithAllowReference()
  4604  	require.NoError(t, err)
  4605  	require.Equal(t, count, initialCount)
  4606  
  4607  	group2, err := ss.Group().Create(&model.Group{
  4608  		Name:           model.NewString(model.NewId()),
  4609  		DisplayName:    model.NewId(),
  4610  		Source:         model.GroupSourceLdap,
  4611  		RemoteId:       model.NewId(),
  4612  		AllowReference: true,
  4613  	})
  4614  	require.NoError(t, err)
  4615  	defer ss.Group().Delete(group2.Id)
  4616  
  4617  	countAfter, err := ss.Group().GroupCountWithAllowReference()
  4618  	require.NoError(t, err)
  4619  	require.Greater(t, countAfter, count)
  4620  }