github.com/mattermost/mattermost-server/v5@v5.39.3/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, false)
  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, false)
  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, false)
  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, false)
  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, false)
  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, false)
  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, false)
  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, false)
  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, false)
  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, false)
  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, false)
  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, false)
  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, false)
  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, false)
  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, false)
  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, false)
  1488  	require.NoError(t, err)
  1489  	require.Empty(t, teamMembers)
  1490  
  1491  	// Leaving Team should still not return result
  1492  	_, nErr = ss.Team().UpdateMember(&model.TeamMember{
  1493  		TeamId:   team.Id,
  1494  		UserId:   user.Id,
  1495  		DeleteAt: model.GetMillis(),
  1496  	})
  1497  	require.NoError(t, nErr)
  1498  	teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, false)
  1499  	require.NoError(t, err)
  1500  	require.Empty(t, teamMembers)
  1501  
  1502  	// If includeRemovedMembers is set to true, removed members should be added back in
  1503  	teamMembers, err = ss.Group().TeamMembersToAdd(0, nil, true)
  1504  	require.NoError(t, err)
  1505  	require.Len(t, teamMembers, 1)
  1506  }
  1507  
  1508  func testTeamMembersToAddSingleTeam(t *testing.T, ss store.Store) {
  1509  	group1, err := ss.Group().Create(&model.Group{
  1510  		Name:        model.NewString(model.NewId()),
  1511  		DisplayName: "TeamMembersToAdd Test Group",
  1512  		RemoteId:    model.NewId(),
  1513  		Source:      model.GroupSourceLdap,
  1514  	})
  1515  	require.NoError(t, err)
  1516  
  1517  	group2, err := ss.Group().Create(&model.Group{
  1518  		Name:        model.NewString(model.NewId()),
  1519  		DisplayName: "TeamMembersToAdd Test Group",
  1520  		RemoteId:    model.NewId(),
  1521  		Source:      model.GroupSourceLdap,
  1522  	})
  1523  	require.NoError(t, err)
  1524  
  1525  	user1 := &model.User{
  1526  		Email:    MakeEmail(),
  1527  		Username: model.NewId(),
  1528  	}
  1529  	user1, nErr := ss.User().Save(user1)
  1530  	require.NoError(t, nErr)
  1531  
  1532  	user2 := &model.User{
  1533  		Email:    MakeEmail(),
  1534  		Username: model.NewId(),
  1535  	}
  1536  	user2, nErr = ss.User().Save(user2)
  1537  	require.NoError(t, nErr)
  1538  
  1539  	user3 := &model.User{
  1540  		Email:    MakeEmail(),
  1541  		Username: model.NewId(),
  1542  	}
  1543  	user3, nErr = ss.User().Save(user3)
  1544  	require.NoError(t, nErr)
  1545  
  1546  	for _, user := range []*model.User{user1, user2} {
  1547  		_, err = ss.Group().UpsertMember(group1.Id, user.Id)
  1548  		require.NoError(t, err)
  1549  	}
  1550  	_, err = ss.Group().UpsertMember(group2.Id, user3.Id)
  1551  	require.NoError(t, err)
  1552  
  1553  	team1 := &model.Team{
  1554  		DisplayName:     "Name",
  1555  		Description:     "Some description",
  1556  		CompanyName:     "Some company name",
  1557  		AllowOpenInvite: false,
  1558  		InviteId:        "inviteid0",
  1559  		Name:            "z-z-" + model.NewId() + "a",
  1560  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  1561  		Type:            model.TEAM_OPEN,
  1562  	}
  1563  	team1, nErr = ss.Team().Save(team1)
  1564  	require.NoError(t, nErr)
  1565  
  1566  	team2 := &model.Team{
  1567  		DisplayName:     "Name",
  1568  		Description:     "Some description",
  1569  		CompanyName:     "Some company name",
  1570  		AllowOpenInvite: false,
  1571  		InviteId:        "inviteid0",
  1572  		Name:            "z-z-" + model.NewId() + "a",
  1573  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  1574  		Type:            model.TEAM_OPEN,
  1575  	}
  1576  	team2, nErr = ss.Team().Save(team2)
  1577  	require.NoError(t, nErr)
  1578  
  1579  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupTeam(group1.Id, team1.Id, true))
  1580  	require.NoError(t, err)
  1581  
  1582  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupTeam(group2.Id, team2.Id, true))
  1583  	require.NoError(t, err)
  1584  
  1585  	teamMembers, err := ss.Group().TeamMembersToAdd(0, nil, false)
  1586  	require.NoError(t, err)
  1587  	require.Len(t, teamMembers, 3)
  1588  
  1589  	teamMembers, err = ss.Group().TeamMembersToAdd(0, &team1.Id, false)
  1590  	require.NoError(t, err)
  1591  	require.Len(t, teamMembers, 2)
  1592  
  1593  	teamMembers, err = ss.Group().TeamMembersToAdd(0, &team2.Id, false)
  1594  	require.NoError(t, err)
  1595  	require.Len(t, teamMembers, 1)
  1596  }
  1597  
  1598  func testChannelMembersToAdd(t *testing.T, ss store.Store) {
  1599  	// Create Group
  1600  	group, err := ss.Group().Create(&model.Group{
  1601  		Name:        model.NewString(model.NewId()),
  1602  		DisplayName: "ChannelMembersToAdd Test Group",
  1603  		RemoteId:    model.NewId(),
  1604  		Source:      model.GroupSourceLdap,
  1605  	})
  1606  	require.NoError(t, err)
  1607  
  1608  	// Create User
  1609  	user := &model.User{
  1610  		Email:    MakeEmail(),
  1611  		Username: model.NewId(),
  1612  	}
  1613  	user, nErr := ss.User().Save(user)
  1614  	require.NoError(t, nErr)
  1615  
  1616  	// Create GroupMember
  1617  	_, err = ss.Group().UpsertMember(group.Id, user.Id)
  1618  	require.NoError(t, err)
  1619  
  1620  	// Create Channel
  1621  	channel := &model.Channel{
  1622  		TeamId:      model.NewId(),
  1623  		DisplayName: "A Name",
  1624  		Name:        model.NewId(),
  1625  		Type:        model.CHANNEL_OPEN, // Query does not look at type so this shouldn't matter.
  1626  	}
  1627  	channel, nErr = ss.Channel().Save(channel, 9999)
  1628  	require.NoError(t, nErr)
  1629  
  1630  	// Create GroupChannel
  1631  	syncable, err := ss.Group().CreateGroupSyncable(model.NewGroupChannel(group.Id, channel.Id, true))
  1632  	require.NoError(t, err)
  1633  
  1634  	// Time before syncable was created
  1635  	channelMembers, err := ss.Group().ChannelMembersToAdd(syncable.CreateAt-1, nil, false)
  1636  	require.NoError(t, err)
  1637  	require.Len(t, channelMembers, 1)
  1638  	require.Equal(t, user.Id, channelMembers[0].UserID)
  1639  	require.Equal(t, channel.Id, channelMembers[0].ChannelID)
  1640  
  1641  	// Time after syncable was created
  1642  	channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.CreateAt+1, nil, false)
  1643  	require.NoError(t, err)
  1644  	require.Empty(t, channelMembers)
  1645  
  1646  	// Delete and restore GroupMember should return result
  1647  	_, err = ss.Group().DeleteMember(group.Id, user.Id)
  1648  	require.NoError(t, err)
  1649  	_, err = ss.Group().UpsertMember(group.Id, user.Id)
  1650  	require.NoError(t, err)
  1651  	channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.CreateAt+1, nil, false)
  1652  	require.NoError(t, err)
  1653  	require.Len(t, channelMembers, 1)
  1654  
  1655  	pristineSyncable := *syncable
  1656  
  1657  	_, err = ss.Group().UpdateGroupSyncable(syncable)
  1658  	require.NoError(t, err)
  1659  
  1660  	// Time before syncable was updated
  1661  	channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.UpdateAt-1, nil, false)
  1662  	require.NoError(t, err)
  1663  	require.Len(t, channelMembers, 1)
  1664  	require.Equal(t, user.Id, channelMembers[0].UserID)
  1665  	require.Equal(t, channel.Id, channelMembers[0].ChannelID)
  1666  
  1667  	// Time after syncable was updated
  1668  	channelMembers, err = ss.Group().ChannelMembersToAdd(syncable.UpdateAt+1, nil, false)
  1669  	require.NoError(t, err)
  1670  	require.Empty(t, channelMembers)
  1671  
  1672  	// Only includes if auto-add
  1673  	syncable.AutoAdd = false
  1674  	_, err = ss.Group().UpdateGroupSyncable(syncable)
  1675  	require.NoError(t, err)
  1676  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
  1677  	require.NoError(t, err)
  1678  	require.Empty(t, channelMembers)
  1679  
  1680  	// reset state of syncable and verify
  1681  	_, err = ss.Group().UpdateGroupSyncable(&pristineSyncable)
  1682  	require.NoError(t, err)
  1683  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
  1684  	require.NoError(t, err)
  1685  	require.Len(t, channelMembers, 1)
  1686  
  1687  	// No result if Group deleted
  1688  	_, err = ss.Group().Delete(group.Id)
  1689  	require.NoError(t, err)
  1690  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
  1691  	require.NoError(t, err)
  1692  	require.Empty(t, channelMembers)
  1693  
  1694  	// reset state of group and verify
  1695  	group.DeleteAt = 0
  1696  	_, err = ss.Group().Update(group)
  1697  	require.NoError(t, err)
  1698  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
  1699  	require.NoError(t, err)
  1700  	require.Len(t, channelMembers, 1)
  1701  
  1702  	// No result if Channel deleted
  1703  	nErr = ss.Channel().Delete(channel.Id, model.GetMillis())
  1704  	require.NoError(t, nErr)
  1705  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
  1706  	require.NoError(t, err)
  1707  	require.Empty(t, channelMembers)
  1708  
  1709  	// reset state of channel and verify
  1710  	channel.DeleteAt = 0
  1711  	_, nErr = ss.Channel().Update(channel)
  1712  	require.NoError(t, nErr)
  1713  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
  1714  	require.NoError(t, err)
  1715  	require.Len(t, channelMembers, 1)
  1716  
  1717  	// No result if GroupChannel deleted
  1718  	_, err = ss.Group().DeleteGroupSyncable(group.Id, channel.Id, model.GroupSyncableTypeChannel)
  1719  	require.NoError(t, err)
  1720  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
  1721  	require.NoError(t, err)
  1722  	require.Empty(t, channelMembers)
  1723  
  1724  	// reset GroupChannel and verify
  1725  	_, err = ss.Group().UpdateGroupSyncable(&pristineSyncable)
  1726  	require.NoError(t, err)
  1727  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
  1728  	require.NoError(t, err)
  1729  	require.Len(t, channelMembers, 1)
  1730  
  1731  	// No result if GroupMember deleted
  1732  	_, err = ss.Group().DeleteMember(group.Id, user.Id)
  1733  	require.NoError(t, err)
  1734  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
  1735  	require.NoError(t, err)
  1736  	require.Empty(t, channelMembers)
  1737  
  1738  	// restore group member and verify
  1739  	_, err = ss.Group().UpsertMember(group.Id, user.Id)
  1740  	require.NoError(t, err)
  1741  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
  1742  	require.NoError(t, err)
  1743  	require.Len(t, channelMembers, 1)
  1744  
  1745  	// Adding Channel (ChannelMemberHistory) should stop returning result
  1746  	nErr = ss.ChannelMemberHistory().LogJoinEvent(user.Id, channel.Id, model.GetMillis())
  1747  	require.NoError(t, nErr)
  1748  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
  1749  	require.NoError(t, err)
  1750  	require.Empty(t, channelMembers)
  1751  
  1752  	// Leaving Channel (ChannelMemberHistory) should still not return result
  1753  	nErr = ss.ChannelMemberHistory().LogLeaveEvent(user.Id, channel.Id, model.GetMillis())
  1754  	require.NoError(t, nErr)
  1755  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
  1756  	require.NoError(t, err)
  1757  	require.Empty(t, channelMembers)
  1758  
  1759  	// Purging ChannelMemberHistory re-returns the result
  1760  	_, _, nErr = ss.ChannelMemberHistory().PermanentDeleteBatchForRetentionPolicies(
  1761  		0, model.GetMillis()+1, 100, model.RetentionPolicyCursor{})
  1762  	require.NoError(t, nErr)
  1763  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, false)
  1764  	require.NoError(t, err)
  1765  	require.Len(t, channelMembers, 1)
  1766  
  1767  	// If includeRemovedMembers is set to true, removed members should be added back in
  1768  	nErr = ss.ChannelMemberHistory().LogLeaveEvent(user.Id, channel.Id, model.GetMillis())
  1769  	require.NoError(t, nErr)
  1770  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, nil, true)
  1771  	require.NoError(t, err)
  1772  	require.Len(t, channelMembers, 1)
  1773  }
  1774  
  1775  func testChannelMembersToAddSingleChannel(t *testing.T, ss store.Store) {
  1776  	group1, err := ss.Group().Create(&model.Group{
  1777  		Name:        model.NewString(model.NewId()),
  1778  		DisplayName: "TeamMembersToAdd Test Group",
  1779  		RemoteId:    model.NewId(),
  1780  		Source:      model.GroupSourceLdap,
  1781  	})
  1782  	require.NoError(t, err)
  1783  
  1784  	group2, err := ss.Group().Create(&model.Group{
  1785  		Name:        model.NewString(model.NewId()),
  1786  		DisplayName: "TeamMembersToAdd Test Group",
  1787  		RemoteId:    model.NewId(),
  1788  		Source:      model.GroupSourceLdap,
  1789  	})
  1790  	require.NoError(t, err)
  1791  
  1792  	user1 := &model.User{
  1793  		Email:    MakeEmail(),
  1794  		Username: model.NewId(),
  1795  	}
  1796  	user1, nErr := ss.User().Save(user1)
  1797  	require.NoError(t, nErr)
  1798  
  1799  	user2 := &model.User{
  1800  		Email:    MakeEmail(),
  1801  		Username: model.NewId(),
  1802  	}
  1803  	user2, nErr = ss.User().Save(user2)
  1804  	require.NoError(t, nErr)
  1805  
  1806  	user3 := &model.User{
  1807  		Email:    MakeEmail(),
  1808  		Username: model.NewId(),
  1809  	}
  1810  	user3, nErr = ss.User().Save(user3)
  1811  	require.NoError(t, nErr)
  1812  
  1813  	for _, user := range []*model.User{user1, user2} {
  1814  		_, err = ss.Group().UpsertMember(group1.Id, user.Id)
  1815  		require.NoError(t, err)
  1816  	}
  1817  	_, err = ss.Group().UpsertMember(group2.Id, user3.Id)
  1818  	require.NoError(t, err)
  1819  
  1820  	channel1 := &model.Channel{
  1821  		DisplayName: "Name",
  1822  		Name:        "z-z-" + model.NewId() + "a",
  1823  		Type:        model.CHANNEL_OPEN,
  1824  	}
  1825  	channel1, nErr = ss.Channel().Save(channel1, 999)
  1826  	require.NoError(t, nErr)
  1827  
  1828  	channel2 := &model.Channel{
  1829  		DisplayName: "Name",
  1830  		Name:        "z-z-" + model.NewId() + "a",
  1831  		Type:        model.CHANNEL_OPEN,
  1832  	}
  1833  	channel2, nErr = ss.Channel().Save(channel2, 999)
  1834  	require.NoError(t, nErr)
  1835  
  1836  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group1.Id, channel1.Id, true))
  1837  	require.NoError(t, err)
  1838  
  1839  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group2.Id, channel2.Id, true))
  1840  	require.NoError(t, err)
  1841  
  1842  	channelMembers, err := ss.Group().ChannelMembersToAdd(0, nil, false)
  1843  	require.NoError(t, err)
  1844  	require.GreaterOrEqual(t, len(channelMembers), 3)
  1845  
  1846  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, &channel1.Id, false)
  1847  	require.NoError(t, err)
  1848  	require.Len(t, channelMembers, 2)
  1849  
  1850  	channelMembers, err = ss.Group().ChannelMembersToAdd(0, &channel2.Id, false)
  1851  	require.NoError(t, err)
  1852  	require.Len(t, channelMembers, 1)
  1853  }
  1854  
  1855  func testTeamMembersToRemove(t *testing.T, ss store.Store) {
  1856  	data := pendingMemberRemovalsDataSetup(t, ss)
  1857  
  1858  	// one result when both users are in the group (for user C)
  1859  	teamMembers, err := ss.Group().TeamMembersToRemove(nil)
  1860  	require.NoError(t, err)
  1861  	require.Len(t, teamMembers, 1)
  1862  	require.Equal(t, data.UserC.Id, teamMembers[0].UserId)
  1863  
  1864  	_, err = ss.Group().DeleteMember(data.Group.Id, data.UserB.Id)
  1865  	require.NoError(t, err)
  1866  
  1867  	// user b and c should now be returned
  1868  	teamMembers, err = ss.Group().TeamMembersToRemove(nil)
  1869  	require.NoError(t, err)
  1870  	require.Len(t, teamMembers, 2)
  1871  
  1872  	var userIDs []string
  1873  	for _, item := range teamMembers {
  1874  		userIDs = append(userIDs, item.UserId)
  1875  	}
  1876  	require.Contains(t, userIDs, data.UserB.Id)
  1877  	require.Contains(t, userIDs, data.UserC.Id)
  1878  	require.Equal(t, data.ConstrainedTeam.Id, teamMembers[0].TeamId)
  1879  	require.Equal(t, data.ConstrainedTeam.Id, teamMembers[1].TeamId)
  1880  
  1881  	_, err = ss.Group().DeleteMember(data.Group.Id, data.UserA.Id)
  1882  	require.NoError(t, err)
  1883  
  1884  	teamMembers, err = ss.Group().TeamMembersToRemove(nil)
  1885  	require.NoError(t, err)
  1886  	require.Len(t, teamMembers, 3)
  1887  
  1888  	// Make one of them a bot
  1889  	teamMembers, err = ss.Group().TeamMembersToRemove(nil)
  1890  	require.NoError(t, err)
  1891  	teamMember := teamMembers[0]
  1892  	bot := &model.Bot{
  1893  		UserId:      teamMember.UserId,
  1894  		Username:    "un_" + model.NewId(),
  1895  		DisplayName: "dn_" + model.NewId(),
  1896  		OwnerId:     teamMember.UserId,
  1897  	}
  1898  	bot, nErr := ss.Bot().Save(bot)
  1899  	require.NoError(t, nErr)
  1900  
  1901  	// verify that bot is not returned in results
  1902  	teamMembers, err = ss.Group().TeamMembersToRemove(nil)
  1903  	require.NoError(t, err)
  1904  	require.Len(t, teamMembers, 2)
  1905  
  1906  	// delete the bot
  1907  	nErr = ss.Bot().PermanentDelete(bot.UserId)
  1908  	require.NoError(t, nErr)
  1909  
  1910  	// Should be back to 3 users
  1911  	teamMembers, err = ss.Group().TeamMembersToRemove(nil)
  1912  	require.NoError(t, err)
  1913  	require.Len(t, teamMembers, 3)
  1914  
  1915  	// add users back to groups
  1916  	res := ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserA.Id)
  1917  	require.NoError(t, res)
  1918  	res = ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserB.Id)
  1919  	require.NoError(t, res)
  1920  	res = ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserC.Id)
  1921  	require.NoError(t, res)
  1922  	nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserA.Id)
  1923  	require.NoError(t, nErr)
  1924  	nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserB.Id)
  1925  	require.NoError(t, nErr)
  1926  	nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserC.Id)
  1927  	require.NoError(t, nErr)
  1928  }
  1929  
  1930  func testTeamMembersToRemoveSingleTeam(t *testing.T, ss store.Store) {
  1931  	user1 := &model.User{
  1932  		Email:    MakeEmail(),
  1933  		Username: model.NewId(),
  1934  	}
  1935  	user1, err := ss.User().Save(user1)
  1936  	require.NoError(t, err)
  1937  
  1938  	user2 := &model.User{
  1939  		Email:    MakeEmail(),
  1940  		Username: model.NewId(),
  1941  	}
  1942  	user2, err = ss.User().Save(user2)
  1943  	require.NoError(t, err)
  1944  
  1945  	user3 := &model.User{
  1946  		Email:    MakeEmail(),
  1947  		Username: model.NewId(),
  1948  	}
  1949  	user3, err = ss.User().Save(user3)
  1950  	require.NoError(t, err)
  1951  
  1952  	team1 := &model.Team{
  1953  		DisplayName:      "Name",
  1954  		Description:      "Some description",
  1955  		CompanyName:      "Some company name",
  1956  		AllowOpenInvite:  false,
  1957  		InviteId:         "inviteid0",
  1958  		Name:             "z-z-" + model.NewId() + "a",
  1959  		Email:            "success+" + model.NewId() + "@simulator.amazonses.com",
  1960  		Type:             model.TEAM_OPEN,
  1961  		GroupConstrained: model.NewBool(true),
  1962  	}
  1963  	team1, nErr := ss.Team().Save(team1)
  1964  	require.NoError(t, nErr)
  1965  
  1966  	team2 := &model.Team{
  1967  		DisplayName:      "Name",
  1968  		Description:      "Some description",
  1969  		CompanyName:      "Some company name",
  1970  		AllowOpenInvite:  false,
  1971  		InviteId:         "inviteid0",
  1972  		Name:             "z-z-" + model.NewId() + "a",
  1973  		Email:            "success+" + model.NewId() + "@simulator.amazonses.com",
  1974  		Type:             model.TEAM_OPEN,
  1975  		GroupConstrained: model.NewBool(true),
  1976  	}
  1977  	team2, nErr = ss.Team().Save(team2)
  1978  	require.NoError(t, nErr)
  1979  
  1980  	for _, user := range []*model.User{user1, user2} {
  1981  		_, nErr = ss.Team().SaveMember(&model.TeamMember{
  1982  			TeamId: team1.Id,
  1983  			UserId: user.Id,
  1984  		}, 999)
  1985  		require.NoError(t, nErr)
  1986  	}
  1987  
  1988  	_, nErr = ss.Team().SaveMember(&model.TeamMember{
  1989  		TeamId: team2.Id,
  1990  		UserId: user3.Id,
  1991  	}, 999)
  1992  	require.NoError(t, nErr)
  1993  
  1994  	teamMembers, err := ss.Group().TeamMembersToRemove(nil)
  1995  	require.NoError(t, err)
  1996  	require.Len(t, teamMembers, 3)
  1997  
  1998  	teamMembers, err = ss.Group().TeamMembersToRemove(&team1.Id)
  1999  	require.NoError(t, err)
  2000  	require.Len(t, teamMembers, 2)
  2001  
  2002  	teamMembers, err = ss.Group().TeamMembersToRemove(&team2.Id)
  2003  	require.NoError(t, err)
  2004  	require.Len(t, teamMembers, 1)
  2005  }
  2006  
  2007  func testChannelMembersToRemove(t *testing.T, ss store.Store) {
  2008  	data := pendingMemberRemovalsDataSetup(t, ss)
  2009  
  2010  	// one result when both users are in the group (for user C)
  2011  	channelMembers, err := ss.Group().ChannelMembersToRemove(nil)
  2012  	require.NoError(t, err)
  2013  	require.Len(t, channelMembers, 1)
  2014  	require.Equal(t, data.UserC.Id, channelMembers[0].UserId)
  2015  
  2016  	_, err = ss.Group().DeleteMember(data.Group.Id, data.UserB.Id)
  2017  	require.NoError(t, err)
  2018  
  2019  	// user b and c should now be returned
  2020  	channelMembers, err = ss.Group().ChannelMembersToRemove(nil)
  2021  	require.NoError(t, err)
  2022  	require.Len(t, channelMembers, 2)
  2023  
  2024  	var userIDs []string
  2025  	for _, item := range channelMembers {
  2026  		userIDs = append(userIDs, item.UserId)
  2027  	}
  2028  	require.Contains(t, userIDs, data.UserB.Id)
  2029  	require.Contains(t, userIDs, data.UserC.Id)
  2030  	require.Equal(t, data.ConstrainedChannel.Id, channelMembers[0].ChannelId)
  2031  	require.Equal(t, data.ConstrainedChannel.Id, channelMembers[1].ChannelId)
  2032  
  2033  	_, err = ss.Group().DeleteMember(data.Group.Id, data.UserA.Id)
  2034  	require.NoError(t, err)
  2035  
  2036  	channelMembers, err = ss.Group().ChannelMembersToRemove(nil)
  2037  	require.NoError(t, err)
  2038  	require.Len(t, channelMembers, 3)
  2039  
  2040  	// Make one of them a bot
  2041  	channelMembers, err = ss.Group().ChannelMembersToRemove(nil)
  2042  	require.NoError(t, err)
  2043  	channelMember := channelMembers[0]
  2044  	bot := &model.Bot{
  2045  		UserId:      channelMember.UserId,
  2046  		Username:    "un_" + model.NewId(),
  2047  		DisplayName: "dn_" + model.NewId(),
  2048  		OwnerId:     channelMember.UserId,
  2049  	}
  2050  	bot, nErr := ss.Bot().Save(bot)
  2051  	require.NoError(t, nErr)
  2052  
  2053  	// verify that bot is not returned in results
  2054  	channelMembers, err = ss.Group().ChannelMembersToRemove(nil)
  2055  	require.NoError(t, err)
  2056  	require.Len(t, channelMembers, 2)
  2057  
  2058  	// delete the bot
  2059  	nErr = ss.Bot().PermanentDelete(bot.UserId)
  2060  	require.NoError(t, nErr)
  2061  
  2062  	// Should be back to 3 users
  2063  	channelMembers, err = ss.Group().ChannelMembersToRemove(nil)
  2064  	require.NoError(t, err)
  2065  	require.Len(t, channelMembers, 3)
  2066  
  2067  	// add users back to groups
  2068  	res := ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserA.Id)
  2069  	require.NoError(t, res)
  2070  	res = ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserB.Id)
  2071  	require.NoError(t, res)
  2072  	res = ss.Team().RemoveMember(data.ConstrainedTeam.Id, data.UserC.Id)
  2073  	require.NoError(t, res)
  2074  	nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserA.Id)
  2075  	require.NoError(t, nErr)
  2076  	nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserB.Id)
  2077  	require.NoError(t, nErr)
  2078  	nErr = ss.Channel().RemoveMember(data.ConstrainedChannel.Id, data.UserC.Id)
  2079  	require.NoError(t, nErr)
  2080  }
  2081  
  2082  func testChannelMembersToRemoveSingleChannel(t *testing.T, ss store.Store) {
  2083  	user1 := &model.User{
  2084  		Email:    MakeEmail(),
  2085  		Username: model.NewId(),
  2086  	}
  2087  	user1, err := ss.User().Save(user1)
  2088  	require.NoError(t, err)
  2089  
  2090  	user2 := &model.User{
  2091  		Email:    MakeEmail(),
  2092  		Username: model.NewId(),
  2093  	}
  2094  	user2, err = ss.User().Save(user2)
  2095  	require.NoError(t, err)
  2096  
  2097  	user3 := &model.User{
  2098  		Email:    MakeEmail(),
  2099  		Username: model.NewId(),
  2100  	}
  2101  	user3, err = ss.User().Save(user3)
  2102  	require.NoError(t, err)
  2103  
  2104  	channel1 := &model.Channel{
  2105  		DisplayName:      "Name",
  2106  		Name:             "z-z-" + model.NewId() + "a",
  2107  		Type:             model.CHANNEL_OPEN,
  2108  		GroupConstrained: model.NewBool(true),
  2109  	}
  2110  	channel1, nErr := ss.Channel().Save(channel1, 999)
  2111  	require.NoError(t, nErr)
  2112  
  2113  	channel2 := &model.Channel{
  2114  		DisplayName:      "Name",
  2115  		Name:             "z-z-" + model.NewId() + "a",
  2116  		Type:             model.CHANNEL_OPEN,
  2117  		GroupConstrained: model.NewBool(true),
  2118  	}
  2119  	channel2, nErr = ss.Channel().Save(channel2, 999)
  2120  	require.NoError(t, nErr)
  2121  
  2122  	for _, user := range []*model.User{user1, user2} {
  2123  		_, nErr = ss.Channel().SaveMember(&model.ChannelMember{
  2124  			ChannelId:   channel1.Id,
  2125  			UserId:      user.Id,
  2126  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  2127  		})
  2128  		require.NoError(t, nErr)
  2129  	}
  2130  
  2131  	_, nErr = ss.Channel().SaveMember(&model.ChannelMember{
  2132  		ChannelId:   channel2.Id,
  2133  		UserId:      user3.Id,
  2134  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  2135  	})
  2136  	require.NoError(t, nErr)
  2137  
  2138  	channelMembers, err := ss.Group().ChannelMembersToRemove(nil)
  2139  	require.NoError(t, err)
  2140  	require.Len(t, channelMembers, 3)
  2141  
  2142  	channelMembers, err = ss.Group().ChannelMembersToRemove(&channel1.Id)
  2143  	require.NoError(t, err)
  2144  	require.Len(t, channelMembers, 2)
  2145  
  2146  	channelMembers, err = ss.Group().ChannelMembersToRemove(&channel2.Id)
  2147  	require.NoError(t, err)
  2148  	require.Len(t, channelMembers, 1)
  2149  }
  2150  
  2151  type removalsData struct {
  2152  	UserA                *model.User
  2153  	UserB                *model.User
  2154  	UserC                *model.User
  2155  	ConstrainedChannel   *model.Channel
  2156  	UnconstrainedChannel *model.Channel
  2157  	ConstrainedTeam      *model.Team
  2158  	UnconstrainedTeam    *model.Team
  2159  	Group                *model.Group
  2160  }
  2161  
  2162  func pendingMemberRemovalsDataSetup(t *testing.T, ss store.Store) *removalsData {
  2163  	// create group
  2164  	group, err := ss.Group().Create(&model.Group{
  2165  		Name:        model.NewString(model.NewId()),
  2166  		DisplayName: "Pending[Channel|Team]MemberRemovals Test Group",
  2167  		RemoteId:    model.NewId(),
  2168  		Source:      model.GroupSourceLdap,
  2169  	})
  2170  	require.NoError(t, err)
  2171  
  2172  	// create users
  2173  	// userA will get removed from the group
  2174  	userA := &model.User{
  2175  		Email:    MakeEmail(),
  2176  		Username: model.NewId(),
  2177  	}
  2178  	userA, nErr := ss.User().Save(userA)
  2179  	require.NoError(t, nErr)
  2180  
  2181  	// userB will not get removed from the group
  2182  	userB := &model.User{
  2183  		Email:    MakeEmail(),
  2184  		Username: model.NewId(),
  2185  	}
  2186  	userB, nErr = ss.User().Save(userB)
  2187  	require.NoError(t, nErr)
  2188  
  2189  	// userC was never in the group
  2190  	userC := &model.User{
  2191  		Email:    MakeEmail(),
  2192  		Username: model.NewId(),
  2193  	}
  2194  	userC, nErr = ss.User().Save(userC)
  2195  	require.NoError(t, nErr)
  2196  
  2197  	// add users to group (but not userC)
  2198  	_, err = ss.Group().UpsertMember(group.Id, userA.Id)
  2199  	require.NoError(t, err)
  2200  
  2201  	_, err = ss.Group().UpsertMember(group.Id, userB.Id)
  2202  	require.NoError(t, err)
  2203  
  2204  	// create channels
  2205  	channelConstrained := &model.Channel{
  2206  		TeamId:           model.NewId(),
  2207  		DisplayName:      "A Name",
  2208  		Name:             model.NewId(),
  2209  		Type:             model.CHANNEL_PRIVATE,
  2210  		GroupConstrained: model.NewBool(true),
  2211  	}
  2212  	channelConstrained, nErr = ss.Channel().Save(channelConstrained, 9999)
  2213  	require.NoError(t, nErr)
  2214  
  2215  	channelUnconstrained := &model.Channel{
  2216  		TeamId:      model.NewId(),
  2217  		DisplayName: "A Name",
  2218  		Name:        model.NewId(),
  2219  		Type:        model.CHANNEL_PRIVATE,
  2220  	}
  2221  	channelUnconstrained, nErr = ss.Channel().Save(channelUnconstrained, 9999)
  2222  	require.NoError(t, nErr)
  2223  
  2224  	// create teams
  2225  	teamConstrained := &model.Team{
  2226  		DisplayName:      "Name",
  2227  		Description:      "Some description",
  2228  		CompanyName:      "Some company name",
  2229  		AllowOpenInvite:  false,
  2230  		InviteId:         "inviteid0",
  2231  		Name:             "z-z-" + model.NewId() + "a",
  2232  		Email:            "success+" + model.NewId() + "@simulator.amazonses.com",
  2233  		Type:             model.TEAM_INVITE,
  2234  		GroupConstrained: model.NewBool(true),
  2235  	}
  2236  	teamConstrained, nErr = ss.Team().Save(teamConstrained)
  2237  	require.NoError(t, nErr)
  2238  
  2239  	teamUnconstrained := &model.Team{
  2240  		DisplayName:     "Name",
  2241  		Description:     "Some description",
  2242  		CompanyName:     "Some company name",
  2243  		AllowOpenInvite: false,
  2244  		InviteId:        "inviteid1",
  2245  		Name:            "z-z-" + model.NewId() + "a",
  2246  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  2247  		Type:            model.TEAM_INVITE,
  2248  	}
  2249  	teamUnconstrained, nErr = ss.Team().Save(teamUnconstrained)
  2250  	require.NoError(t, nErr)
  2251  
  2252  	// create groupteams
  2253  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupTeam(group.Id, teamConstrained.Id, true))
  2254  	require.NoError(t, err)
  2255  
  2256  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupTeam(group.Id, teamUnconstrained.Id, true))
  2257  	require.NoError(t, err)
  2258  
  2259  	// create groupchannels
  2260  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group.Id, channelConstrained.Id, true))
  2261  	require.NoError(t, err)
  2262  
  2263  	_, err = ss.Group().CreateGroupSyncable(model.NewGroupChannel(group.Id, channelUnconstrained.Id, true))
  2264  	require.NoError(t, err)
  2265  
  2266  	// add users to teams
  2267  	userIDTeamIDs := [][]string{
  2268  		{userA.Id, teamConstrained.Id},
  2269  		{userB.Id, teamConstrained.Id},
  2270  		{userC.Id, teamConstrained.Id},
  2271  		{userA.Id, teamUnconstrained.Id},
  2272  		{userB.Id, teamUnconstrained.Id},
  2273  		{userC.Id, teamUnconstrained.Id},
  2274  	}
  2275  
  2276  	for _, item := range userIDTeamIDs {
  2277  		_, nErr = ss.Team().SaveMember(&model.TeamMember{
  2278  			UserId: item[0],
  2279  			TeamId: item[1],
  2280  		}, 99)
  2281  		require.NoError(t, nErr)
  2282  	}
  2283  
  2284  	// add users to channels
  2285  	userIDChannelIDs := [][]string{
  2286  		{userA.Id, channelConstrained.Id},
  2287  		{userB.Id, channelConstrained.Id},
  2288  		{userC.Id, channelConstrained.Id},
  2289  		{userA.Id, channelUnconstrained.Id},
  2290  		{userB.Id, channelUnconstrained.Id},
  2291  		{userC.Id, channelUnconstrained.Id},
  2292  	}
  2293  
  2294  	for _, item := range userIDChannelIDs {
  2295  		_, err := ss.Channel().SaveMember(&model.ChannelMember{
  2296  			UserId:      item[0],
  2297  			ChannelId:   item[1],
  2298  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  2299  		})
  2300  		require.NoError(t, err)
  2301  	}
  2302  
  2303  	return &removalsData{
  2304  		UserA:                userA,
  2305  		UserB:                userB,
  2306  		UserC:                userC,
  2307  		ConstrainedChannel:   channelConstrained,
  2308  		UnconstrainedChannel: channelUnconstrained,
  2309  		ConstrainedTeam:      teamConstrained,
  2310  		UnconstrainedTeam:    teamUnconstrained,
  2311  		Group:                group,
  2312  	}
  2313  }
  2314  
  2315  func testGetGroupsByChannel(t *testing.T, ss store.Store) {
  2316  	// Create Channel1
  2317  	channel1 := &model.Channel{
  2318  		TeamId:      model.NewId(),
  2319  		DisplayName: "Channel1",
  2320  		Name:        model.NewId(),
  2321  		Type:        model.CHANNEL_OPEN,
  2322  	}
  2323  	channel1, err := ss.Channel().Save(channel1, 9999)
  2324  	require.NoError(t, err)
  2325  
  2326  	// Create Groups 1, 2 and a deleted group
  2327  	group1, err := ss.Group().Create(&model.Group{
  2328  		Name:           model.NewString(model.NewId()),
  2329  		DisplayName:    "group-1",
  2330  		RemoteId:       model.NewId(),
  2331  		Source:         model.GroupSourceLdap,
  2332  		AllowReference: true,
  2333  	})
  2334  	require.NoError(t, err)
  2335  
  2336  	group2, err := ss.Group().Create(&model.Group{
  2337  		Name:           model.NewString(model.NewId()),
  2338  		DisplayName:    "group-2",
  2339  		RemoteId:       model.NewId(),
  2340  		Source:         model.GroupSourceLdap,
  2341  		AllowReference: false,
  2342  	})
  2343  	require.NoError(t, err)
  2344  
  2345  	deletedGroup, err := ss.Group().Create(&model.Group{
  2346  		Name:           model.NewString(model.NewId()),
  2347  		DisplayName:    "group-deleted",
  2348  		RemoteId:       model.NewId(),
  2349  		Source:         model.GroupSourceLdap,
  2350  		AllowReference: true,
  2351  		DeleteAt:       1,
  2352  	})
  2353  	require.NoError(t, err)
  2354  
  2355  	// And associate them with Channel1
  2356  	for _, g := range []*model.Group{group1, group2, deletedGroup} {
  2357  		_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  2358  			AutoAdd:    true,
  2359  			SyncableId: channel1.Id,
  2360  			Type:       model.GroupSyncableTypeChannel,
  2361  			GroupId:    g.Id,
  2362  		})
  2363  		require.NoError(t, err)
  2364  	}
  2365  
  2366  	// Create Channel2
  2367  	channel2 := &model.Channel{
  2368  		TeamId:      model.NewId(),
  2369  		DisplayName: "Channel2",
  2370  		Name:        model.NewId(),
  2371  		Type:        model.CHANNEL_OPEN,
  2372  	}
  2373  	channel2, nErr := ss.Channel().Save(channel2, 9999)
  2374  	require.NoError(t, nErr)
  2375  
  2376  	// Create Group3
  2377  	group3, err := ss.Group().Create(&model.Group{
  2378  		Name:           model.NewString(model.NewId()),
  2379  		DisplayName:    "group-3",
  2380  		RemoteId:       model.NewId(),
  2381  		Source:         model.GroupSourceLdap,
  2382  		AllowReference: true,
  2383  	})
  2384  	require.NoError(t, err)
  2385  
  2386  	// And associate it to Channel2
  2387  	_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  2388  		AutoAdd:    true,
  2389  		SyncableId: channel2.Id,
  2390  		Type:       model.GroupSyncableTypeChannel,
  2391  		GroupId:    group3.Id,
  2392  	})
  2393  	require.NoError(t, err)
  2394  
  2395  	// add members
  2396  	u1 := &model.User{
  2397  		Email:    MakeEmail(),
  2398  		Username: model.NewId(),
  2399  	}
  2400  	user1, err := ss.User().Save(u1)
  2401  	require.NoError(t, err)
  2402  
  2403  	u2 := &model.User{
  2404  		Email:    MakeEmail(),
  2405  		Username: model.NewId(),
  2406  	}
  2407  	user2, err := ss.User().Save(u2)
  2408  	require.NoError(t, err)
  2409  
  2410  	_, err = ss.Group().UpsertMember(group1.Id, user1.Id)
  2411  	require.NoError(t, err)
  2412  
  2413  	_, err = ss.Group().UpsertMember(group1.Id, user2.Id)
  2414  	require.NoError(t, err)
  2415  
  2416  	user2.DeleteAt = 1
  2417  	_, err = ss.User().Update(user2, true)
  2418  	require.NoError(t, err)
  2419  
  2420  	group1WithMemberCount := *group1
  2421  	group1WithMemberCount.MemberCount = model.NewInt(1)
  2422  
  2423  	group2WithMemberCount := *group2
  2424  	group2WithMemberCount.MemberCount = model.NewInt(0)
  2425  
  2426  	group1WSA := &model.GroupWithSchemeAdmin{Group: *group1, SchemeAdmin: model.NewBool(false)}
  2427  	group2WSA := &model.GroupWithSchemeAdmin{Group: *group2, SchemeAdmin: model.NewBool(false)}
  2428  	group3WSA := &model.GroupWithSchemeAdmin{Group: *group3, SchemeAdmin: model.NewBool(false)}
  2429  
  2430  	testCases := []struct {
  2431  		Name       string
  2432  		ChannelId  string
  2433  		Page       int
  2434  		PerPage    int
  2435  		Result     []*model.GroupWithSchemeAdmin
  2436  		Opts       model.GroupSearchOpts
  2437  		TotalCount *int64
  2438  	}{
  2439  		{
  2440  			Name:       "Get the two Groups for Channel1",
  2441  			ChannelId:  channel1.Id,
  2442  			Opts:       model.GroupSearchOpts{},
  2443  			Page:       0,
  2444  			PerPage:    60,
  2445  			Result:     []*model.GroupWithSchemeAdmin{group1WSA, group2WSA},
  2446  			TotalCount: model.NewInt64(2),
  2447  		},
  2448  		{
  2449  			Name:      "Get first Group for Channel1 with page 0 with 1 element",
  2450  			ChannelId: channel1.Id,
  2451  			Opts:      model.GroupSearchOpts{},
  2452  			Page:      0,
  2453  			PerPage:   1,
  2454  			Result:    []*model.GroupWithSchemeAdmin{group1WSA},
  2455  		},
  2456  		{
  2457  			Name:      "Get second Group for Channel1 with page 1 with 1 element",
  2458  			ChannelId: channel1.Id,
  2459  			Opts:      model.GroupSearchOpts{},
  2460  			Page:      1,
  2461  			PerPage:   1,
  2462  			Result:    []*model.GroupWithSchemeAdmin{group2WSA},
  2463  		},
  2464  		{
  2465  			Name:      "Get third Group for Channel2",
  2466  			ChannelId: channel2.Id,
  2467  			Opts:      model.GroupSearchOpts{},
  2468  			Page:      0,
  2469  			PerPage:   60,
  2470  			Result:    []*model.GroupWithSchemeAdmin{group3WSA},
  2471  		},
  2472  		{
  2473  			Name:       "Get empty Groups for a fake id",
  2474  			ChannelId:  model.NewId(),
  2475  			Opts:       model.GroupSearchOpts{},
  2476  			Page:       0,
  2477  			PerPage:    60,
  2478  			Result:     []*model.GroupWithSchemeAdmin{},
  2479  			TotalCount: model.NewInt64(0),
  2480  		},
  2481  		{
  2482  			Name:       "Get group matching name",
  2483  			ChannelId:  channel1.Id,
  2484  			Opts:       model.GroupSearchOpts{Q: string([]rune(*group1.Name)[2:10])}, // very low change of a name collision
  2485  			Page:       0,
  2486  			PerPage:    100,
  2487  			Result:     []*model.GroupWithSchemeAdmin{group1WSA},
  2488  			TotalCount: model.NewInt64(1),
  2489  		},
  2490  		{
  2491  			Name:       "Get group matching display name",
  2492  			ChannelId:  channel1.Id,
  2493  			Opts:       model.GroupSearchOpts{Q: "rouP-1"},
  2494  			Page:       0,
  2495  			PerPage:    100,
  2496  			Result:     []*model.GroupWithSchemeAdmin{group1WSA},
  2497  			TotalCount: model.NewInt64(1),
  2498  		},
  2499  		{
  2500  			Name:       "Get group matching multiple display names",
  2501  			ChannelId:  channel1.Id,
  2502  			Opts:       model.GroupSearchOpts{Q: "roUp-"},
  2503  			Page:       0,
  2504  			PerPage:    100,
  2505  			Result:     []*model.GroupWithSchemeAdmin{group1WSA, group2WSA},
  2506  			TotalCount: model.NewInt64(2),
  2507  		},
  2508  		{
  2509  			Name:      "Include member counts",
  2510  			ChannelId: channel1.Id,
  2511  			Opts:      model.GroupSearchOpts{IncludeMemberCount: true},
  2512  			Page:      0,
  2513  			PerPage:   2,
  2514  			Result: []*model.GroupWithSchemeAdmin{
  2515  				{Group: group1WithMemberCount, SchemeAdmin: model.NewBool(false)},
  2516  				{Group: group2WithMemberCount, SchemeAdmin: model.NewBool(false)},
  2517  			},
  2518  		},
  2519  		{
  2520  			Name:      "Include allow reference",
  2521  			ChannelId: channel1.Id,
  2522  			Opts:      model.GroupSearchOpts{FilterAllowReference: true},
  2523  			Page:      0,
  2524  			PerPage:   100,
  2525  			Result:    []*model.GroupWithSchemeAdmin{group1WSA},
  2526  		},
  2527  	}
  2528  
  2529  	for _, tc := range testCases {
  2530  		t.Run(tc.Name, func(t *testing.T) {
  2531  			if tc.Opts.PageOpts == nil {
  2532  				tc.Opts.PageOpts = &model.PageOpts{}
  2533  			}
  2534  			tc.Opts.PageOpts.Page = tc.Page
  2535  			tc.Opts.PageOpts.PerPage = tc.PerPage
  2536  			groups, err := ss.Group().GetGroupsByChannel(tc.ChannelId, tc.Opts)
  2537  			require.NoError(t, err)
  2538  			require.ElementsMatch(t, tc.Result, groups)
  2539  			if tc.TotalCount != nil {
  2540  				var count int64
  2541  				count, err = ss.Group().CountGroupsByChannel(tc.ChannelId, tc.Opts)
  2542  				require.NoError(t, err)
  2543  				require.Equal(t, *tc.TotalCount, count)
  2544  			}
  2545  		})
  2546  	}
  2547  }
  2548  
  2549  func testGetGroupsAssociatedToChannelsByTeam(t *testing.T, ss store.Store) {
  2550  	// Create Team1
  2551  	team1 := &model.Team{
  2552  		DisplayName:     "Team1",
  2553  		Description:     model.NewId(),
  2554  		CompanyName:     model.NewId(),
  2555  		AllowOpenInvite: false,
  2556  		InviteId:        model.NewId(),
  2557  		Name:            "zz" + model.NewId(),
  2558  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  2559  		Type:            model.TEAM_OPEN,
  2560  	}
  2561  	team1, errt := ss.Team().Save(team1)
  2562  	require.NoError(t, errt)
  2563  
  2564  	// Create Channel1
  2565  	channel1 := &model.Channel{
  2566  		TeamId:      team1.Id,
  2567  		DisplayName: "Channel1",
  2568  		Name:        model.NewId(),
  2569  		Type:        model.CHANNEL_OPEN,
  2570  	}
  2571  	channel1, err := ss.Channel().Save(channel1, 9999)
  2572  	require.NoError(t, err)
  2573  
  2574  	// Create Groups 1, 2 and a deleted group
  2575  	group1, err := ss.Group().Create(&model.Group{
  2576  		Name:           model.NewString(model.NewId()),
  2577  		DisplayName:    "group-1",
  2578  		RemoteId:       model.NewId(),
  2579  		Source:         model.GroupSourceLdap,
  2580  		AllowReference: false,
  2581  	})
  2582  	require.NoError(t, err)
  2583  
  2584  	group2, err := ss.Group().Create(&model.Group{
  2585  		Name:           model.NewString(model.NewId()),
  2586  		DisplayName:    "group-2",
  2587  		RemoteId:       model.NewId(),
  2588  		Source:         model.GroupSourceLdap,
  2589  		AllowReference: true,
  2590  	})
  2591  	require.NoError(t, err)
  2592  
  2593  	deletedGroup, err := ss.Group().Create(&model.Group{
  2594  		Name:           model.NewString(model.NewId()),
  2595  		DisplayName:    "group-deleted",
  2596  		RemoteId:       model.NewId(),
  2597  		Source:         model.GroupSourceLdap,
  2598  		AllowReference: true,
  2599  		DeleteAt:       1,
  2600  	})
  2601  	require.NoError(t, err)
  2602  
  2603  	// And associate them with Channel1
  2604  	for _, g := range []*model.Group{group1, group2, deletedGroup} {
  2605  		_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  2606  			AutoAdd:    true,
  2607  			SyncableId: channel1.Id,
  2608  			Type:       model.GroupSyncableTypeChannel,
  2609  			GroupId:    g.Id,
  2610  		})
  2611  		require.NoError(t, err)
  2612  	}
  2613  
  2614  	// Create Channel2
  2615  	channel2 := &model.Channel{
  2616  		TeamId:      team1.Id,
  2617  		DisplayName: "Channel2",
  2618  		Name:        model.NewId(),
  2619  		Type:        model.CHANNEL_OPEN,
  2620  	}
  2621  	channel2, err = ss.Channel().Save(channel2, 9999)
  2622  	require.NoError(t, err)
  2623  
  2624  	// Create Group3
  2625  	group3, err := ss.Group().Create(&model.Group{
  2626  		Name:           model.NewString(model.NewId()),
  2627  		DisplayName:    "group-3",
  2628  		RemoteId:       model.NewId(),
  2629  		Source:         model.GroupSourceLdap,
  2630  		AllowReference: true,
  2631  	})
  2632  	require.NoError(t, err)
  2633  
  2634  	// And associate it to Channel2
  2635  	_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  2636  		AutoAdd:    true,
  2637  		SyncableId: channel2.Id,
  2638  		Type:       model.GroupSyncableTypeChannel,
  2639  		GroupId:    group3.Id,
  2640  	})
  2641  	require.NoError(t, err)
  2642  
  2643  	// add members
  2644  	u1 := &model.User{
  2645  		Email:    MakeEmail(),
  2646  		Username: model.NewId(),
  2647  	}
  2648  	user1, err := ss.User().Save(u1)
  2649  	require.NoError(t, err)
  2650  
  2651  	u2 := &model.User{
  2652  		Email:    MakeEmail(),
  2653  		Username: model.NewId(),
  2654  	}
  2655  	user2, err := ss.User().Save(u2)
  2656  	require.NoError(t, err)
  2657  
  2658  	_, err = ss.Group().UpsertMember(group1.Id, user1.Id)
  2659  	require.NoError(t, err)
  2660  
  2661  	_, err = ss.Group().UpsertMember(group1.Id, user2.Id)
  2662  	require.NoError(t, err)
  2663  
  2664  	user2.DeleteAt = 1
  2665  	_, err = ss.User().Update(user2, true)
  2666  	require.NoError(t, err)
  2667  
  2668  	group1WithMemberCount := *group1
  2669  	group1WithMemberCount.MemberCount = model.NewInt(1)
  2670  
  2671  	group2WithMemberCount := *group2
  2672  	group2WithMemberCount.MemberCount = model.NewInt(0)
  2673  
  2674  	group3WithMemberCount := *group3
  2675  	group3WithMemberCount.MemberCount = model.NewInt(0)
  2676  
  2677  	group1WSA := &model.GroupWithSchemeAdmin{Group: *group1, SchemeAdmin: model.NewBool(false)}
  2678  	group2WSA := &model.GroupWithSchemeAdmin{Group: *group2, SchemeAdmin: model.NewBool(false)}
  2679  	group3WSA := &model.GroupWithSchemeAdmin{Group: *group3, SchemeAdmin: model.NewBool(false)}
  2680  
  2681  	testCases := []struct {
  2682  		Name    string
  2683  		TeamId  string
  2684  		Page    int
  2685  		PerPage int
  2686  		Result  map[string][]*model.GroupWithSchemeAdmin
  2687  		Opts    model.GroupSearchOpts
  2688  	}{
  2689  		{
  2690  			Name:    "Get the groups for Channel1 and Channel2",
  2691  			TeamId:  team1.Id,
  2692  			Opts:    model.GroupSearchOpts{},
  2693  			Page:    0,
  2694  			PerPage: 60,
  2695  			Result:  map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA, group2WSA}, channel2.Id: {group3WSA}},
  2696  		},
  2697  		{
  2698  			Name:    "Get first Group for Channel1 with page 0 with 1 element",
  2699  			TeamId:  team1.Id,
  2700  			Opts:    model.GroupSearchOpts{},
  2701  			Page:    0,
  2702  			PerPage: 1,
  2703  			Result:  map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA}},
  2704  		},
  2705  		{
  2706  			Name:    "Get second Group for Channel1 with page 1 with 1 element",
  2707  			TeamId:  team1.Id,
  2708  			Opts:    model.GroupSearchOpts{},
  2709  			Page:    1,
  2710  			PerPage: 1,
  2711  			Result:  map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group2WSA}},
  2712  		},
  2713  		{
  2714  			Name:    "Get empty Groups for a fake id",
  2715  			TeamId:  model.NewId(),
  2716  			Opts:    model.GroupSearchOpts{},
  2717  			Page:    0,
  2718  			PerPage: 60,
  2719  			Result:  map[string][]*model.GroupWithSchemeAdmin{},
  2720  		},
  2721  		{
  2722  			Name:    "Get group matching name",
  2723  			TeamId:  team1.Id,
  2724  			Opts:    model.GroupSearchOpts{Q: string([]rune(*group1.Name)[2:10])}, // very low chance of a name collision
  2725  			Page:    0,
  2726  			PerPage: 100,
  2727  			Result:  map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA}},
  2728  		},
  2729  		{
  2730  			Name:    "Get group matching display name",
  2731  			TeamId:  team1.Id,
  2732  			Opts:    model.GroupSearchOpts{Q: "rouP-1"},
  2733  			Page:    0,
  2734  			PerPage: 100,
  2735  			Result:  map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA}},
  2736  		},
  2737  		{
  2738  			Name:    "Get group matching multiple display names",
  2739  			TeamId:  team1.Id,
  2740  			Opts:    model.GroupSearchOpts{Q: "roUp-"},
  2741  			Page:    0,
  2742  			PerPage: 100,
  2743  			Result:  map[string][]*model.GroupWithSchemeAdmin{channel1.Id: {group1WSA, group2WSA}, channel2.Id: {group3WSA}},
  2744  		},
  2745  		{
  2746  			Name:    "Include member counts",
  2747  			TeamId:  team1.Id,
  2748  			Opts:    model.GroupSearchOpts{IncludeMemberCount: true},
  2749  			Page:    0,
  2750  			PerPage: 10,
  2751  			Result: map[string][]*model.GroupWithSchemeAdmin{
  2752  				channel1.Id: {
  2753  					{Group: group1WithMemberCount, SchemeAdmin: model.NewBool(false)},
  2754  					{Group: group2WithMemberCount, SchemeAdmin: model.NewBool(false)},
  2755  				},
  2756  				channel2.Id: {
  2757  					{Group: group3WithMemberCount, SchemeAdmin: model.NewBool(false)},
  2758  				},
  2759  			},
  2760  		},
  2761  		{
  2762  			Name:    "Include allow reference",
  2763  			TeamId:  team1.Id,
  2764  			Opts:    model.GroupSearchOpts{FilterAllowReference: true},
  2765  			Page:    0,
  2766  			PerPage: 2,
  2767  			Result: map[string][]*model.GroupWithSchemeAdmin{
  2768  				channel1.Id: {
  2769  					group2WSA,
  2770  				},
  2771  				channel2.Id: {
  2772  					group3WSA,
  2773  				},
  2774  			},
  2775  		},
  2776  	}
  2777  
  2778  	for _, tc := range testCases {
  2779  		t.Run(tc.Name, func(t *testing.T) {
  2780  			if tc.Opts.PageOpts == nil {
  2781  				tc.Opts.PageOpts = &model.PageOpts{}
  2782  			}
  2783  			tc.Opts.PageOpts.Page = tc.Page
  2784  			tc.Opts.PageOpts.PerPage = tc.PerPage
  2785  			groups, err := ss.Group().GetGroupsAssociatedToChannelsByTeam(tc.TeamId, tc.Opts)
  2786  			require.NoError(t, err)
  2787  			assert.Equal(t, tc.Result, groups)
  2788  		})
  2789  	}
  2790  }
  2791  
  2792  func testGetGroupsByTeam(t *testing.T, ss store.Store) {
  2793  	// Create Team1
  2794  	team1 := &model.Team{
  2795  		DisplayName:     "Team1",
  2796  		Description:     model.NewId(),
  2797  		CompanyName:     model.NewId(),
  2798  		AllowOpenInvite: false,
  2799  		InviteId:        model.NewId(),
  2800  		Name:            "zz" + model.NewId(),
  2801  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  2802  		Type:            model.TEAM_OPEN,
  2803  	}
  2804  	team1, err := ss.Team().Save(team1)
  2805  	require.NoError(t, err)
  2806  
  2807  	// Create Groups 1, 2 and a deleted group
  2808  	group1, err := ss.Group().Create(&model.Group{
  2809  		Name:           model.NewString(model.NewId()),
  2810  		DisplayName:    "group-1",
  2811  		RemoteId:       model.NewId(),
  2812  		Source:         model.GroupSourceLdap,
  2813  		AllowReference: false,
  2814  	})
  2815  	require.NoError(t, err)
  2816  
  2817  	group2, err := ss.Group().Create(&model.Group{
  2818  		Name:           model.NewString(model.NewId()),
  2819  		DisplayName:    "group-2",
  2820  		RemoteId:       model.NewId(),
  2821  		Source:         model.GroupSourceLdap,
  2822  		AllowReference: true,
  2823  	})
  2824  	require.NoError(t, err)
  2825  
  2826  	deletedGroup, err := ss.Group().Create(&model.Group{
  2827  		Name:           model.NewString(model.NewId()),
  2828  		DisplayName:    "group-deleted",
  2829  		RemoteId:       model.NewId(),
  2830  		Source:         model.GroupSourceLdap,
  2831  		AllowReference: true,
  2832  		DeleteAt:       1,
  2833  	})
  2834  	require.NoError(t, err)
  2835  
  2836  	// And associate them with Team1
  2837  	for _, g := range []*model.Group{group1, group2, deletedGroup} {
  2838  		_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  2839  			AutoAdd:    true,
  2840  			SyncableId: team1.Id,
  2841  			Type:       model.GroupSyncableTypeTeam,
  2842  			GroupId:    g.Id,
  2843  		})
  2844  		require.NoError(t, err)
  2845  	}
  2846  
  2847  	// Create Team2
  2848  	team2 := &model.Team{
  2849  		DisplayName:     "Team2",
  2850  		Description:     model.NewId(),
  2851  		CompanyName:     model.NewId(),
  2852  		AllowOpenInvite: false,
  2853  		InviteId:        model.NewId(),
  2854  		Name:            "zz" + model.NewId(),
  2855  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  2856  		Type:            model.TEAM_INVITE,
  2857  	}
  2858  	team2, err = ss.Team().Save(team2)
  2859  	require.NoError(t, err)
  2860  
  2861  	// Create Group3
  2862  	group3, err := ss.Group().Create(&model.Group{
  2863  		Name:           model.NewString(model.NewId()),
  2864  		DisplayName:    "group-3",
  2865  		RemoteId:       model.NewId(),
  2866  		Source:         model.GroupSourceLdap,
  2867  		AllowReference: true,
  2868  	})
  2869  	require.NoError(t, err)
  2870  
  2871  	// And associate it to Team2
  2872  	_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  2873  		AutoAdd:    true,
  2874  		SyncableId: team2.Id,
  2875  		Type:       model.GroupSyncableTypeTeam,
  2876  		GroupId:    group3.Id,
  2877  	})
  2878  	require.NoError(t, err)
  2879  
  2880  	// add members
  2881  	u1 := &model.User{
  2882  		Email:    MakeEmail(),
  2883  		Username: model.NewId(),
  2884  	}
  2885  	user1, err := ss.User().Save(u1)
  2886  	require.NoError(t, err)
  2887  
  2888  	u2 := &model.User{
  2889  		Email:    MakeEmail(),
  2890  		Username: model.NewId(),
  2891  	}
  2892  	user2, err := ss.User().Save(u2)
  2893  	require.NoError(t, err)
  2894  
  2895  	_, err = ss.Group().UpsertMember(group1.Id, user1.Id)
  2896  	require.NoError(t, err)
  2897  
  2898  	_, err = ss.Group().UpsertMember(group1.Id, user2.Id)
  2899  	require.NoError(t, err)
  2900  
  2901  	user2.DeleteAt = 1
  2902  	_, err = ss.User().Update(user2, true)
  2903  	require.NoError(t, err)
  2904  
  2905  	_, err = ss.Group().UpsertMember(deletedGroup.Id, user1.Id)
  2906  	require.NoError(t, err)
  2907  
  2908  	group1WithMemberCount := *group1
  2909  	group1WithMemberCount.MemberCount = model.NewInt(1)
  2910  
  2911  	group2WithMemberCount := *group2
  2912  	group2WithMemberCount.MemberCount = model.NewInt(0)
  2913  
  2914  	group1WSA := &model.GroupWithSchemeAdmin{Group: *group1, SchemeAdmin: model.NewBool(false)}
  2915  	group2WSA := &model.GroupWithSchemeAdmin{Group: *group2, SchemeAdmin: model.NewBool(false)}
  2916  	group3WSA := &model.GroupWithSchemeAdmin{Group: *group3, SchemeAdmin: model.NewBool(false)}
  2917  
  2918  	testCases := []struct {
  2919  		Name       string
  2920  		TeamId     string
  2921  		Page       int
  2922  		PerPage    int
  2923  		Opts       model.GroupSearchOpts
  2924  		Result     []*model.GroupWithSchemeAdmin
  2925  		TotalCount *int64
  2926  	}{
  2927  		{
  2928  			Name:       "Get the two Groups for Team1",
  2929  			TeamId:     team1.Id,
  2930  			Opts:       model.GroupSearchOpts{},
  2931  			Page:       0,
  2932  			PerPage:    60,
  2933  			Result:     []*model.GroupWithSchemeAdmin{group1WSA, group2WSA},
  2934  			TotalCount: model.NewInt64(2),
  2935  		},
  2936  		{
  2937  			Name:    "Get first Group for Team1 with page 0 with 1 element",
  2938  			TeamId:  team1.Id,
  2939  			Opts:    model.GroupSearchOpts{},
  2940  			Page:    0,
  2941  			PerPage: 1,
  2942  			Result:  []*model.GroupWithSchemeAdmin{group1WSA},
  2943  		},
  2944  		{
  2945  			Name:    "Get second Group for Team1 with page 1 with 1 element",
  2946  			TeamId:  team1.Id,
  2947  			Opts:    model.GroupSearchOpts{},
  2948  			Page:    1,
  2949  			PerPage: 1,
  2950  			Result:  []*model.GroupWithSchemeAdmin{group2WSA},
  2951  		},
  2952  		{
  2953  			Name:       "Get third Group for Team2",
  2954  			TeamId:     team2.Id,
  2955  			Opts:       model.GroupSearchOpts{},
  2956  			Page:       0,
  2957  			PerPage:    60,
  2958  			Result:     []*model.GroupWithSchemeAdmin{group3WSA},
  2959  			TotalCount: model.NewInt64(1),
  2960  		},
  2961  		{
  2962  			Name:       "Get empty Groups for a fake id",
  2963  			TeamId:     model.NewId(),
  2964  			Opts:       model.GroupSearchOpts{},
  2965  			Page:       0,
  2966  			PerPage:    60,
  2967  			Result:     []*model.GroupWithSchemeAdmin{},
  2968  			TotalCount: model.NewInt64(0),
  2969  		},
  2970  		{
  2971  			Name:       "Get group matching name",
  2972  			TeamId:     team1.Id,
  2973  			Opts:       model.GroupSearchOpts{Q: string([]rune(*group1.Name)[2:10])}, // very low change of a name collision
  2974  			Page:       0,
  2975  			PerPage:    100,
  2976  			Result:     []*model.GroupWithSchemeAdmin{group1WSA},
  2977  			TotalCount: model.NewInt64(1),
  2978  		},
  2979  		{
  2980  			Name:       "Get group matching display name",
  2981  			TeamId:     team1.Id,
  2982  			Opts:       model.GroupSearchOpts{Q: "rouP-1"},
  2983  			Page:       0,
  2984  			PerPage:    100,
  2985  			Result:     []*model.GroupWithSchemeAdmin{group1WSA},
  2986  			TotalCount: model.NewInt64(1),
  2987  		},
  2988  		{
  2989  			Name:       "Get group matching multiple display names",
  2990  			TeamId:     team1.Id,
  2991  			Opts:       model.GroupSearchOpts{Q: "roUp-"},
  2992  			Page:       0,
  2993  			PerPage:    100,
  2994  			Result:     []*model.GroupWithSchemeAdmin{group1WSA, group2WSA},
  2995  			TotalCount: model.NewInt64(2),
  2996  		},
  2997  		{
  2998  			Name:    "Include member counts",
  2999  			TeamId:  team1.Id,
  3000  			Opts:    model.GroupSearchOpts{IncludeMemberCount: true},
  3001  			Page:    0,
  3002  			PerPage: 2,
  3003  			Result: []*model.GroupWithSchemeAdmin{
  3004  				{Group: group1WithMemberCount, SchemeAdmin: model.NewBool(false)},
  3005  				{Group: group2WithMemberCount, SchemeAdmin: model.NewBool(false)},
  3006  			},
  3007  		},
  3008  		{
  3009  			Name:    "Include allow reference",
  3010  			TeamId:  team1.Id,
  3011  			Opts:    model.GroupSearchOpts{FilterAllowReference: true},
  3012  			Page:    0,
  3013  			PerPage: 100,
  3014  			Result:  []*model.GroupWithSchemeAdmin{group2WSA},
  3015  		},
  3016  	}
  3017  
  3018  	for _, tc := range testCases {
  3019  		t.Run(tc.Name, func(t *testing.T) {
  3020  			if tc.Opts.PageOpts == nil {
  3021  				tc.Opts.PageOpts = &model.PageOpts{}
  3022  			}
  3023  			tc.Opts.PageOpts.Page = tc.Page
  3024  			tc.Opts.PageOpts.PerPage = tc.PerPage
  3025  			groups, err := ss.Group().GetGroupsByTeam(tc.TeamId, tc.Opts)
  3026  			require.NoError(t, err)
  3027  			require.ElementsMatch(t, tc.Result, groups)
  3028  			if tc.TotalCount != nil {
  3029  				var count int64
  3030  				count, err = ss.Group().CountGroupsByTeam(tc.TeamId, tc.Opts)
  3031  				require.NoError(t, err)
  3032  				require.Equal(t, *tc.TotalCount, count)
  3033  			}
  3034  		})
  3035  	}
  3036  }
  3037  
  3038  func testGetGroups(t *testing.T, ss store.Store) {
  3039  	// Create Team1
  3040  	team1 := &model.Team{
  3041  		DisplayName:      "Team1",
  3042  		Description:      model.NewId(),
  3043  		CompanyName:      model.NewId(),
  3044  		AllowOpenInvite:  false,
  3045  		InviteId:         model.NewId(),
  3046  		Name:             "zz" + model.NewId(),
  3047  		Email:            "success+" + model.NewId() + "@simulator.amazonses.com",
  3048  		Type:             model.TEAM_OPEN,
  3049  		GroupConstrained: model.NewBool(true),
  3050  	}
  3051  	team1, err := ss.Team().Save(team1)
  3052  	require.NoError(t, err)
  3053  
  3054  	startCreateTime := team1.UpdateAt - 1
  3055  
  3056  	// Create Channel1
  3057  	channel1 := &model.Channel{
  3058  		TeamId:      model.NewId(),
  3059  		DisplayName: "Channel1",
  3060  		Name:        model.NewId(),
  3061  		Type:        model.CHANNEL_PRIVATE,
  3062  	}
  3063  	channel1, nErr := ss.Channel().Save(channel1, 9999)
  3064  	require.NoError(t, nErr)
  3065  
  3066  	// Create Groups 1 and 2
  3067  	group1, err := ss.Group().Create(&model.Group{
  3068  		Name:           model.NewString(model.NewId()),
  3069  		DisplayName:    "group-1",
  3070  		RemoteId:       model.NewId(),
  3071  		Source:         model.GroupSourceLdap,
  3072  		AllowReference: true,
  3073  	})
  3074  	require.NoError(t, err)
  3075  
  3076  	group2, err := ss.Group().Create(&model.Group{
  3077  		Name:           model.NewString(model.NewId() + "-group-2"),
  3078  		DisplayName:    "group-2",
  3079  		RemoteId:       model.NewId(),
  3080  		Source:         model.GroupSourceLdap,
  3081  		AllowReference: false,
  3082  	})
  3083  	require.NoError(t, err)
  3084  
  3085  	deletedGroup, err := ss.Group().Create(&model.Group{
  3086  		Name:           model.NewString(model.NewId() + "-group-deleted"),
  3087  		DisplayName:    "group-deleted",
  3088  		RemoteId:       model.NewId(),
  3089  		Source:         model.GroupSourceLdap,
  3090  		AllowReference: false,
  3091  		DeleteAt:       1,
  3092  	})
  3093  	require.NoError(t, err)
  3094  
  3095  	// And associate them with Team1
  3096  	for _, g := range []*model.Group{group1, group2, deletedGroup} {
  3097  		_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  3098  			AutoAdd:    true,
  3099  			SyncableId: team1.Id,
  3100  			Type:       model.GroupSyncableTypeTeam,
  3101  			GroupId:    g.Id,
  3102  		})
  3103  		require.NoError(t, err)
  3104  	}
  3105  
  3106  	// Create Team2
  3107  	team2 := &model.Team{
  3108  		DisplayName:     "Team2",
  3109  		Description:     model.NewId(),
  3110  		CompanyName:     model.NewId(),
  3111  		AllowOpenInvite: false,
  3112  		InviteId:        model.NewId(),
  3113  		Name:            "zz" + model.NewId(),
  3114  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  3115  		Type:            model.TEAM_INVITE,
  3116  	}
  3117  	team2, err = ss.Team().Save(team2)
  3118  	require.NoError(t, err)
  3119  
  3120  	// Create Channel2
  3121  	channel2 := &model.Channel{
  3122  		TeamId:      model.NewId(),
  3123  		DisplayName: "Channel2",
  3124  		Name:        model.NewId(),
  3125  		Type:        model.CHANNEL_PRIVATE,
  3126  	}
  3127  	channel2, nErr = ss.Channel().Save(channel2, 9999)
  3128  	require.NoError(t, nErr)
  3129  
  3130  	// Create Channel3
  3131  	channel3 := &model.Channel{
  3132  		TeamId:      team1.Id,
  3133  		DisplayName: "Channel3",
  3134  		Name:        model.NewId(),
  3135  		Type:        model.CHANNEL_PRIVATE,
  3136  	}
  3137  	channel3, nErr = ss.Channel().Save(channel3, 9999)
  3138  	require.NoError(t, nErr)
  3139  
  3140  	// Create Group3
  3141  	group3, err := ss.Group().Create(&model.Group{
  3142  		Name:           model.NewString(model.NewId() + "-group-3"),
  3143  		DisplayName:    "group-3",
  3144  		RemoteId:       model.NewId(),
  3145  		Source:         model.GroupSourceLdap,
  3146  		AllowReference: true,
  3147  	})
  3148  	require.NoError(t, err)
  3149  
  3150  	// And associate it to Team2
  3151  	_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  3152  		AutoAdd:    true,
  3153  		SyncableId: team2.Id,
  3154  		Type:       model.GroupSyncableTypeTeam,
  3155  		GroupId:    group3.Id,
  3156  	})
  3157  	require.NoError(t, err)
  3158  
  3159  	// And associate Group1 to Channel2
  3160  	_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  3161  		AutoAdd:    true,
  3162  		SyncableId: channel2.Id,
  3163  		Type:       model.GroupSyncableTypeChannel,
  3164  		GroupId:    group1.Id,
  3165  	})
  3166  	require.NoError(t, err)
  3167  
  3168  	// And associate Group2 and Group3 to Channel1
  3169  	for _, g := range []*model.Group{group2, group3} {
  3170  		_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  3171  			AutoAdd:    true,
  3172  			SyncableId: channel1.Id,
  3173  			Type:       model.GroupSyncableTypeChannel,
  3174  			GroupId:    g.Id,
  3175  		})
  3176  		require.NoError(t, err)
  3177  	}
  3178  
  3179  	// add members
  3180  	u1 := &model.User{
  3181  		Email:    MakeEmail(),
  3182  		Username: model.NewId(),
  3183  	}
  3184  	user1, err := ss.User().Save(u1)
  3185  	require.NoError(t, err)
  3186  
  3187  	u2 := &model.User{
  3188  		Email:    MakeEmail(),
  3189  		Username: model.NewId(),
  3190  	}
  3191  	user2, err := ss.User().Save(u2)
  3192  	require.NoError(t, err)
  3193  
  3194  	_, err = ss.Group().UpsertMember(group1.Id, user1.Id)
  3195  	require.NoError(t, err)
  3196  
  3197  	_, err = ss.Group().UpsertMember(group1.Id, user2.Id)
  3198  	require.NoError(t, err)
  3199  
  3200  	_, err = ss.Group().UpsertMember(deletedGroup.Id, user1.Id)
  3201  	require.NoError(t, err)
  3202  
  3203  	user2.DeleteAt = 1
  3204  	u2Update, _ := ss.User().Update(user2, true)
  3205  
  3206  	group2NameSubstring := "group-2"
  3207  
  3208  	endCreateTime := u2Update.New.UpdateAt + 1
  3209  
  3210  	// Create Team3
  3211  	team3 := &model.Team{
  3212  		DisplayName:     "Team3",
  3213  		Description:     model.NewId(),
  3214  		CompanyName:     model.NewId(),
  3215  		AllowOpenInvite: false,
  3216  		InviteId:        model.NewId(),
  3217  		Name:            "zz" + model.NewId(),
  3218  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  3219  		Type:            model.TEAM_INVITE,
  3220  	}
  3221  	team3, err = ss.Team().Save(team3)
  3222  	require.NoError(t, err)
  3223  
  3224  	channel4 := &model.Channel{
  3225  		TeamId:      team3.Id,
  3226  		DisplayName: "Channel4",
  3227  		Name:        model.NewId(),
  3228  		Type:        model.CHANNEL_PRIVATE,
  3229  	}
  3230  	channel4, nErr = ss.Channel().Save(channel4, 9999)
  3231  	require.NoError(t, nErr)
  3232  
  3233  	testCases := []struct {
  3234  		Name    string
  3235  		Page    int
  3236  		PerPage int
  3237  		Opts    model.GroupSearchOpts
  3238  		Resultf func([]*model.Group) bool
  3239  	}{
  3240  		{
  3241  			Name:    "Get all the Groups",
  3242  			Opts:    model.GroupSearchOpts{},
  3243  			Page:    0,
  3244  			PerPage: 3,
  3245  			Resultf: func(groups []*model.Group) bool { return len(groups) == 3 },
  3246  		},
  3247  		{
  3248  			Name:    "Get first Group with page 0 with 1 element",
  3249  			Opts:    model.GroupSearchOpts{},
  3250  			Page:    0,
  3251  			PerPage: 1,
  3252  			Resultf: func(groups []*model.Group) bool { return len(groups) == 1 },
  3253  		},
  3254  		{
  3255  			Name:    "Get single result from page 1",
  3256  			Opts:    model.GroupSearchOpts{},
  3257  			Page:    1,
  3258  			PerPage: 1,
  3259  			Resultf: func(groups []*model.Group) bool { return len(groups) == 1 },
  3260  		},
  3261  		{
  3262  			Name:    "Get multiple results from page 1",
  3263  			Opts:    model.GroupSearchOpts{},
  3264  			Page:    1,
  3265  			PerPage: 2,
  3266  			Resultf: func(groups []*model.Group) bool { return len(groups) == 2 },
  3267  		},
  3268  		{
  3269  			Name:    "Get group matching name",
  3270  			Opts:    model.GroupSearchOpts{Q: group2NameSubstring},
  3271  			Page:    0,
  3272  			PerPage: 100,
  3273  			Resultf: func(groups []*model.Group) bool {
  3274  				for _, g := range groups {
  3275  					if !strings.Contains(*g.Name, group2NameSubstring) && !strings.Contains(g.DisplayName, group2NameSubstring) {
  3276  						return false
  3277  					}
  3278  				}
  3279  				return true
  3280  			},
  3281  		},
  3282  		{
  3283  			Name:    "Get group matching display name",
  3284  			Opts:    model.GroupSearchOpts{Q: "rouP-3"},
  3285  			Page:    0,
  3286  			PerPage: 100,
  3287  			Resultf: func(groups []*model.Group) bool {
  3288  				for _, g := range groups {
  3289  					if !strings.Contains(strings.ToLower(g.DisplayName), "roup-3") {
  3290  						return false
  3291  					}
  3292  				}
  3293  				return true
  3294  			},
  3295  		},
  3296  		{
  3297  			Name:    "Get group matching multiple display names",
  3298  			Opts:    model.GroupSearchOpts{Q: "groUp"},
  3299  			Page:    0,
  3300  			PerPage: 100,
  3301  			Resultf: func(groups []*model.Group) bool {
  3302  				for _, g := range groups {
  3303  					if !strings.Contains(strings.ToLower(g.DisplayName), "group") {
  3304  						return false
  3305  					}
  3306  				}
  3307  				return true
  3308  			},
  3309  		},
  3310  		{
  3311  			Name:    "Include member counts",
  3312  			Opts:    model.GroupSearchOpts{IncludeMemberCount: true},
  3313  			Page:    0,
  3314  			PerPage: 100,
  3315  			Resultf: func(groups []*model.Group) bool {
  3316  				for _, g := range groups {
  3317  					if g.MemberCount == nil {
  3318  						return false
  3319  					}
  3320  					if g.Id == group1.Id && *g.MemberCount != 1 {
  3321  						return false
  3322  					}
  3323  					if g.DeleteAt != 0 {
  3324  						return false
  3325  					}
  3326  				}
  3327  				return true
  3328  			},
  3329  		},
  3330  		{
  3331  			Name:    "Not associated to team",
  3332  			Opts:    model.GroupSearchOpts{NotAssociatedToTeam: team2.Id},
  3333  			Page:    0,
  3334  			PerPage: 100,
  3335  			Resultf: func(groups []*model.Group) bool {
  3336  				if len(groups) == 0 {
  3337  					return false
  3338  				}
  3339  				for _, g := range groups {
  3340  					if g.Id == group3.Id {
  3341  						return false
  3342  					}
  3343  					if g.DeleteAt != 0 {
  3344  						return false
  3345  					}
  3346  				}
  3347  				return true
  3348  			},
  3349  		},
  3350  		{
  3351  			Name:    "Not associated to other team",
  3352  			Opts:    model.GroupSearchOpts{NotAssociatedToTeam: team1.Id},
  3353  			Page:    0,
  3354  			PerPage: 100,
  3355  			Resultf: func(groups []*model.Group) bool {
  3356  				if len(groups) == 0 {
  3357  					return false
  3358  				}
  3359  				for _, g := range groups {
  3360  					if g.Id == group1.Id || g.Id == group2.Id {
  3361  						return false
  3362  					}
  3363  					if g.DeleteAt != 0 {
  3364  						return false
  3365  					}
  3366  				}
  3367  				return true
  3368  			},
  3369  		},
  3370  		{
  3371  			Name:    "Include allow reference",
  3372  			Opts:    model.GroupSearchOpts{FilterAllowReference: true},
  3373  			Page:    0,
  3374  			PerPage: 100,
  3375  			Resultf: func(groups []*model.Group) bool {
  3376  				if len(groups) == 0 {
  3377  					return false
  3378  				}
  3379  				for _, g := range groups {
  3380  					if !g.AllowReference {
  3381  						return false
  3382  					}
  3383  					if g.DeleteAt != 0 {
  3384  						return false
  3385  					}
  3386  				}
  3387  				return true
  3388  			},
  3389  		},
  3390  		{
  3391  			Name:    "Use Since return all",
  3392  			Opts:    model.GroupSearchOpts{FilterAllowReference: true, Since: startCreateTime},
  3393  			Page:    0,
  3394  			PerPage: 100,
  3395  			Resultf: func(groups []*model.Group) bool {
  3396  				if len(groups) == 0 {
  3397  					return false
  3398  				}
  3399  				for _, g := range groups {
  3400  					if g.DeleteAt != 0 {
  3401  						return false
  3402  					}
  3403  				}
  3404  				return true
  3405  			},
  3406  		},
  3407  		{
  3408  			Name:    "Use Since return none",
  3409  			Opts:    model.GroupSearchOpts{FilterAllowReference: true, Since: endCreateTime},
  3410  			Page:    0,
  3411  			PerPage: 100,
  3412  			Resultf: func(groups []*model.Group) bool {
  3413  				return len(groups) == 0
  3414  			},
  3415  		},
  3416  		{
  3417  			Name:    "Filter groups from group-constrained teams",
  3418  			Opts:    model.GroupSearchOpts{NotAssociatedToChannel: channel3.Id, FilterParentTeamPermitted: true},
  3419  			Page:    0,
  3420  			PerPage: 100,
  3421  			Resultf: func(groups []*model.Group) bool {
  3422  				return len(groups) == 2 && groups[0].Id == group1.Id && groups[1].Id == group2.Id
  3423  			},
  3424  		},
  3425  		{
  3426  			Name:    "Filter groups from group-constrained page 0",
  3427  			Opts:    model.GroupSearchOpts{NotAssociatedToChannel: channel3.Id, FilterParentTeamPermitted: true},
  3428  			Page:    0,
  3429  			PerPage: 1,
  3430  			Resultf: func(groups []*model.Group) bool {
  3431  				return groups[0].Id == group1.Id
  3432  			},
  3433  		},
  3434  		{
  3435  			Name:    "Filter groups from group-constrained page 1",
  3436  			Opts:    model.GroupSearchOpts{NotAssociatedToChannel: channel3.Id, FilterParentTeamPermitted: true},
  3437  			Page:    1,
  3438  			PerPage: 1,
  3439  			Resultf: func(groups []*model.Group) bool {
  3440  				return groups[0].Id == group2.Id
  3441  			},
  3442  		},
  3443  		{
  3444  			Name:    "Non-group constrained team with no associated groups still returns groups for the child channel",
  3445  			Opts:    model.GroupSearchOpts{NotAssociatedToChannel: channel4.Id, FilterParentTeamPermitted: true},
  3446  			Page:    0,
  3447  			PerPage: 100,
  3448  			Resultf: func(groups []*model.Group) bool {
  3449  				return len(groups) > 0
  3450  			},
  3451  		},
  3452  	}
  3453  
  3454  	for _, tc := range testCases {
  3455  		t.Run(tc.Name, func(t *testing.T) {
  3456  			groups, err := ss.Group().GetGroups(tc.Page, tc.PerPage, tc.Opts)
  3457  			require.NoError(t, err)
  3458  			require.True(t, tc.Resultf(groups))
  3459  		})
  3460  	}
  3461  }
  3462  
  3463  func testTeamMembersMinusGroupMembers(t *testing.T, ss store.Store) {
  3464  	const numberOfGroups = 3
  3465  	const numberOfUsers = 4
  3466  
  3467  	groups := []*model.Group{}
  3468  	users := []*model.User{}
  3469  
  3470  	team := &model.Team{
  3471  		DisplayName:      model.NewId(),
  3472  		Description:      model.NewId(),
  3473  		CompanyName:      model.NewId(),
  3474  		AllowOpenInvite:  false,
  3475  		InviteId:         model.NewId(),
  3476  		Name:             "zz" + model.NewId(),
  3477  		Email:            model.NewId() + "@simulator.amazonses.com",
  3478  		Type:             model.TEAM_OPEN,
  3479  		GroupConstrained: model.NewBool(true),
  3480  	}
  3481  	team, err := ss.Team().Save(team)
  3482  	require.NoError(t, err)
  3483  
  3484  	for i := 0; i < numberOfUsers; i++ {
  3485  		user := &model.User{
  3486  			Email:    MakeEmail(),
  3487  			Username: fmt.Sprintf("%d_%s", i, model.NewId()),
  3488  		}
  3489  		user, err = ss.User().Save(user)
  3490  		require.NoError(t, err)
  3491  		users = append(users, user)
  3492  
  3493  		trueOrFalse := int(math.Mod(float64(i), 2)) == 0
  3494  		_, nErr := ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: user.Id, SchemeUser: trueOrFalse, SchemeAdmin: !trueOrFalse}, 999)
  3495  		require.NoError(t, nErr)
  3496  	}
  3497  
  3498  	// Extra user outside of the group member users.
  3499  	user := &model.User{
  3500  		Email:    MakeEmail(),
  3501  		Username: "99_" + model.NewId(),
  3502  	}
  3503  	user, err = ss.User().Save(user)
  3504  	require.NoError(t, err)
  3505  	users = append(users, user)
  3506  	_, nErr := ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: user.Id, SchemeUser: true, SchemeAdmin: false}, 999)
  3507  	require.NoError(t, nErr)
  3508  
  3509  	for i := 0; i < numberOfGroups; i++ {
  3510  		group := &model.Group{
  3511  			Name:        model.NewString(fmt.Sprintf("n_%d_%s", i, model.NewId())),
  3512  			DisplayName: model.NewId(),
  3513  			Source:      model.GroupSourceLdap,
  3514  			Description: model.NewId(),
  3515  			RemoteId:    model.NewId(),
  3516  		}
  3517  		group, err := ss.Group().Create(group)
  3518  		require.NoError(t, err)
  3519  		groups = append(groups, group)
  3520  	}
  3521  
  3522  	sort.Slice(users, func(i, j int) bool {
  3523  		return users[i].Username < users[j].Username
  3524  	})
  3525  
  3526  	// Add even users to even group, and the inverse
  3527  	for i := 0; i < numberOfUsers; i++ {
  3528  		groupIndex := int(math.Mod(float64(i), 2))
  3529  		_, err := ss.Group().UpsertMember(groups[groupIndex].Id, users[i].Id)
  3530  		require.NoError(t, err)
  3531  
  3532  		// Add everyone to group 2
  3533  		_, err = ss.Group().UpsertMember(groups[numberOfGroups-1].Id, users[i].Id)
  3534  		require.NoError(t, err)
  3535  	}
  3536  
  3537  	testCases := map[string]struct {
  3538  		expectedUserIDs    []string
  3539  		expectedTotalCount int64
  3540  		groupIDs           []string
  3541  		page               int
  3542  		perPage            int
  3543  		setup              func()
  3544  		teardown           func()
  3545  	}{
  3546  		"No group IDs, all members": {
  3547  			expectedUserIDs:    []string{users[0].Id, users[1].Id, users[2].Id, users[3].Id, user.Id},
  3548  			expectedTotalCount: numberOfUsers + 1,
  3549  			groupIDs:           []string{},
  3550  			page:               0,
  3551  			perPage:            100,
  3552  		},
  3553  		"All members, page 1": {
  3554  			expectedUserIDs:    []string{users[0].Id, users[1].Id, users[2].Id},
  3555  			expectedTotalCount: numberOfUsers + 1,
  3556  			groupIDs:           []string{},
  3557  			page:               0,
  3558  			perPage:            3,
  3559  		},
  3560  		"All members, page 2": {
  3561  			expectedUserIDs:    []string{users[3].Id, users[4].Id},
  3562  			expectedTotalCount: numberOfUsers + 1,
  3563  			groupIDs:           []string{},
  3564  			page:               1,
  3565  			perPage:            3,
  3566  		},
  3567  		"Group 1, even users would be removed": {
  3568  			expectedUserIDs:    []string{users[0].Id, users[2].Id, users[4].Id},
  3569  			expectedTotalCount: 3,
  3570  			groupIDs:           []string{groups[1].Id},
  3571  			page:               0,
  3572  			perPage:            100,
  3573  		},
  3574  		"Group 0, odd users would be removed": {
  3575  			expectedUserIDs:    []string{users[1].Id, users[3].Id, users[4].Id},
  3576  			expectedTotalCount: 3,
  3577  			groupIDs:           []string{groups[0].Id},
  3578  			page:               0,
  3579  			perPage:            100,
  3580  		},
  3581  		"All groups, no users would be removed": {
  3582  			expectedUserIDs:    []string{users[4].Id},
  3583  			expectedTotalCount: 1,
  3584  			groupIDs:           []string{groups[0].Id, groups[1].Id},
  3585  			page:               0,
  3586  			perPage:            100,
  3587  		},
  3588  	}
  3589  
  3590  	mapUserIDs := func(users []*model.UserWithGroups) []string {
  3591  		ids := []string{}
  3592  		for _, user := range users {
  3593  			ids = append(ids, user.Id)
  3594  		}
  3595  		return ids
  3596  	}
  3597  
  3598  	for tcName, tc := range testCases {
  3599  		t.Run(tcName, func(t *testing.T) {
  3600  			if tc.setup != nil {
  3601  				tc.setup()
  3602  			}
  3603  
  3604  			if tc.teardown != nil {
  3605  				defer tc.teardown()
  3606  			}
  3607  
  3608  			actual, err := ss.Group().TeamMembersMinusGroupMembers(team.Id, tc.groupIDs, tc.page, tc.perPage)
  3609  			require.NoError(t, err)
  3610  			require.ElementsMatch(t, tc.expectedUserIDs, mapUserIDs(actual))
  3611  
  3612  			actualCount, err := ss.Group().CountTeamMembersMinusGroupMembers(team.Id, tc.groupIDs)
  3613  			require.NoError(t, err)
  3614  			require.Equal(t, tc.expectedTotalCount, actualCount)
  3615  		})
  3616  	}
  3617  }
  3618  
  3619  func testChannelMembersMinusGroupMembers(t *testing.T, ss store.Store) {
  3620  	const numberOfGroups = 3
  3621  	const numberOfUsers = 4
  3622  
  3623  	groups := []*model.Group{}
  3624  	users := []*model.User{}
  3625  
  3626  	channel := &model.Channel{
  3627  		TeamId:           model.NewId(),
  3628  		DisplayName:      "A Name",
  3629  		Name:             model.NewId(),
  3630  		Type:             model.CHANNEL_PRIVATE,
  3631  		GroupConstrained: model.NewBool(true),
  3632  	}
  3633  	channel, err := ss.Channel().Save(channel, 9999)
  3634  	require.NoError(t, err)
  3635  
  3636  	for i := 0; i < numberOfUsers; i++ {
  3637  		user := &model.User{
  3638  			Email:    MakeEmail(),
  3639  			Username: fmt.Sprintf("%d_%s", i, model.NewId()),
  3640  		}
  3641  		user, err = ss.User().Save(user)
  3642  		require.NoError(t, err)
  3643  		users = append(users, user)
  3644  
  3645  		trueOrFalse := int(math.Mod(float64(i), 2)) == 0
  3646  		_, err = ss.Channel().SaveMember(&model.ChannelMember{
  3647  			ChannelId:   channel.Id,
  3648  			UserId:      user.Id,
  3649  			SchemeUser:  trueOrFalse,
  3650  			SchemeAdmin: !trueOrFalse,
  3651  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  3652  		})
  3653  		require.NoError(t, err)
  3654  	}
  3655  
  3656  	// Extra user outside of the group member users.
  3657  	user, err := ss.User().Save(&model.User{
  3658  		Email:    MakeEmail(),
  3659  		Username: "99_" + model.NewId(),
  3660  	})
  3661  	require.NoError(t, err)
  3662  	users = append(users, user)
  3663  	_, err = ss.Channel().SaveMember(&model.ChannelMember{
  3664  		ChannelId:   channel.Id,
  3665  		UserId:      user.Id,
  3666  		SchemeUser:  true,
  3667  		SchemeAdmin: false,
  3668  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  3669  	})
  3670  	require.NoError(t, err)
  3671  
  3672  	for i := 0; i < numberOfGroups; i++ {
  3673  		group := &model.Group{
  3674  			Name:        model.NewString(fmt.Sprintf("n_%d_%s", i, model.NewId())),
  3675  			DisplayName: model.NewId(),
  3676  			Source:      model.GroupSourceLdap,
  3677  			Description: model.NewId(),
  3678  			RemoteId:    model.NewId(),
  3679  		}
  3680  		group, err := ss.Group().Create(group)
  3681  		require.NoError(t, err)
  3682  		groups = append(groups, group)
  3683  	}
  3684  
  3685  	sort.Slice(users, func(i, j int) bool {
  3686  		return users[i].Username < users[j].Username
  3687  	})
  3688  
  3689  	// Add even users to even group, and the inverse
  3690  	for i := 0; i < numberOfUsers; i++ {
  3691  		groupIndex := int(math.Mod(float64(i), 2))
  3692  		_, err := ss.Group().UpsertMember(groups[groupIndex].Id, users[i].Id)
  3693  		require.NoError(t, err)
  3694  
  3695  		// Add everyone to group 2
  3696  		_, err = ss.Group().UpsertMember(groups[numberOfGroups-1].Id, users[i].Id)
  3697  		require.NoError(t, err)
  3698  	}
  3699  
  3700  	testCases := map[string]struct {
  3701  		expectedUserIDs    []string
  3702  		expectedTotalCount int64
  3703  		groupIDs           []string
  3704  		page               int
  3705  		perPage            int
  3706  		setup              func()
  3707  		teardown           func()
  3708  	}{
  3709  		"No group IDs, all members": {
  3710  			expectedUserIDs:    []string{users[0].Id, users[1].Id, users[2].Id, users[3].Id, users[4].Id},
  3711  			expectedTotalCount: numberOfUsers + 1,
  3712  			groupIDs:           []string{},
  3713  			page:               0,
  3714  			perPage:            100,
  3715  		},
  3716  		"All members, page 1": {
  3717  			expectedUserIDs:    []string{users[0].Id, users[1].Id, users[2].Id},
  3718  			expectedTotalCount: numberOfUsers + 1,
  3719  			groupIDs:           []string{},
  3720  			page:               0,
  3721  			perPage:            3,
  3722  		},
  3723  		"All members, page 2": {
  3724  			expectedUserIDs:    []string{users[3].Id, users[4].Id},
  3725  			expectedTotalCount: numberOfUsers + 1,
  3726  			groupIDs:           []string{},
  3727  			page:               1,
  3728  			perPage:            3,
  3729  		},
  3730  		"Group 1, even users would be removed": {
  3731  			expectedUserIDs:    []string{users[0].Id, users[2].Id, users[4].Id},
  3732  			expectedTotalCount: 3,
  3733  			groupIDs:           []string{groups[1].Id},
  3734  			page:               0,
  3735  			perPage:            100,
  3736  		},
  3737  		"Group 0, odd users would be removed": {
  3738  			expectedUserIDs:    []string{users[1].Id, users[3].Id, users[4].Id},
  3739  			expectedTotalCount: 3,
  3740  			groupIDs:           []string{groups[0].Id},
  3741  			page:               0,
  3742  			perPage:            100,
  3743  		},
  3744  		"All groups, no users would be removed": {
  3745  			expectedUserIDs:    []string{users[4].Id},
  3746  			expectedTotalCount: 1,
  3747  			groupIDs:           []string{groups[0].Id, groups[1].Id},
  3748  			page:               0,
  3749  			perPage:            100,
  3750  		},
  3751  	}
  3752  
  3753  	mapUserIDs := func(users []*model.UserWithGroups) []string {
  3754  		ids := []string{}
  3755  		for _, user := range users {
  3756  			ids = append(ids, user.Id)
  3757  		}
  3758  		return ids
  3759  	}
  3760  
  3761  	for tcName, tc := range testCases {
  3762  		t.Run(tcName, func(t *testing.T) {
  3763  			if tc.setup != nil {
  3764  				tc.setup()
  3765  			}
  3766  
  3767  			if tc.teardown != nil {
  3768  				defer tc.teardown()
  3769  			}
  3770  
  3771  			actual, err := ss.Group().ChannelMembersMinusGroupMembers(channel.Id, tc.groupIDs, tc.page, tc.perPage)
  3772  			require.NoError(t, err)
  3773  			require.ElementsMatch(t, tc.expectedUserIDs, mapUserIDs(actual))
  3774  
  3775  			actualCount, err := ss.Group().CountChannelMembersMinusGroupMembers(channel.Id, tc.groupIDs)
  3776  			require.NoError(t, err)
  3777  			require.Equal(t, tc.expectedTotalCount, actualCount)
  3778  		})
  3779  	}
  3780  }
  3781  
  3782  func groupTestGetMemberCount(t *testing.T, ss store.Store) {
  3783  	group := &model.Group{
  3784  		Name:        model.NewString(model.NewId()),
  3785  		DisplayName: model.NewId(),
  3786  		Source:      model.GroupSourceLdap,
  3787  		Description: model.NewId(),
  3788  		RemoteId:    model.NewId(),
  3789  	}
  3790  	group, err := ss.Group().Create(group)
  3791  	require.NoError(t, err)
  3792  
  3793  	var user *model.User
  3794  	var nErr error
  3795  	for i := 0; i < 2; i++ {
  3796  		user = &model.User{
  3797  			Email:    MakeEmail(),
  3798  			Username: fmt.Sprintf("%d_%s", i, model.NewId()),
  3799  		}
  3800  		user, nErr = ss.User().Save(user)
  3801  		require.NoError(t, nErr)
  3802  
  3803  		_, err = ss.Group().UpsertMember(group.Id, user.Id)
  3804  		require.NoError(t, err)
  3805  	}
  3806  
  3807  	count, err := ss.Group().GetMemberCount(group.Id)
  3808  	require.NoError(t, err)
  3809  	require.Equal(t, int64(2), count)
  3810  
  3811  	user.DeleteAt = 1
  3812  	_, nErr = ss.User().Update(user, true)
  3813  	require.NoError(t, nErr)
  3814  
  3815  	count, err = ss.Group().GetMemberCount(group.Id)
  3816  	require.NoError(t, err)
  3817  	require.Equal(t, int64(1), count)
  3818  }
  3819  
  3820  func groupTestAdminRoleGroupsForSyncableMemberChannel(t *testing.T, ss store.Store) {
  3821  	user := &model.User{
  3822  		Email:    MakeEmail(),
  3823  		Username: model.NewId(),
  3824  	}
  3825  	user, err := ss.User().Save(user)
  3826  	require.NoError(t, err)
  3827  
  3828  	group1 := &model.Group{
  3829  		Name:        model.NewString(model.NewId()),
  3830  		DisplayName: model.NewId(),
  3831  		Source:      model.GroupSourceLdap,
  3832  		Description: model.NewId(),
  3833  		RemoteId:    model.NewId(),
  3834  	}
  3835  	group1, err = ss.Group().Create(group1)
  3836  	require.NoError(t, err)
  3837  
  3838  	_, err = ss.Group().UpsertMember(group1.Id, user.Id)
  3839  	require.NoError(t, err)
  3840  
  3841  	group2 := &model.Group{
  3842  		Name:        model.NewString(model.NewId()),
  3843  		DisplayName: model.NewId(),
  3844  		Source:      model.GroupSourceLdap,
  3845  		Description: model.NewId(),
  3846  		RemoteId:    model.NewId(),
  3847  	}
  3848  	group2, err = ss.Group().Create(group2)
  3849  	require.NoError(t, err)
  3850  
  3851  	_, err = ss.Group().UpsertMember(group2.Id, user.Id)
  3852  	require.NoError(t, err)
  3853  
  3854  	channel := &model.Channel{
  3855  		TeamId:      model.NewId(),
  3856  		DisplayName: "A Name",
  3857  		Name:        model.NewId(),
  3858  		Type:        model.CHANNEL_OPEN,
  3859  	}
  3860  	channel, nErr := ss.Channel().Save(channel, 9999)
  3861  	require.NoError(t, nErr)
  3862  
  3863  	_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  3864  		AutoAdd:     true,
  3865  		SyncableId:  channel.Id,
  3866  		Type:        model.GroupSyncableTypeChannel,
  3867  		GroupId:     group1.Id,
  3868  		SchemeAdmin: true,
  3869  	})
  3870  	require.NoError(t, err)
  3871  
  3872  	groupSyncable2, err := ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  3873  		AutoAdd:    true,
  3874  		SyncableId: channel.Id,
  3875  		Type:       model.GroupSyncableTypeChannel,
  3876  		GroupId:    group2.Id,
  3877  	})
  3878  	require.NoError(t, err)
  3879  
  3880  	// User is a member of both groups but only one is SchmeAdmin: true
  3881  	actualGroupIDs, err := ss.Group().AdminRoleGroupsForSyncableMember(user.Id, channel.Id, model.GroupSyncableTypeChannel)
  3882  	require.NoError(t, err)
  3883  	require.ElementsMatch(t, []string{group1.Id}, actualGroupIDs)
  3884  
  3885  	// Update the second group syncable to be SchemeAdmin: true and both groups should be returned
  3886  	groupSyncable2.SchemeAdmin = true
  3887  	_, err = ss.Group().UpdateGroupSyncable(groupSyncable2)
  3888  	require.NoError(t, err)
  3889  	actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, channel.Id, model.GroupSyncableTypeChannel)
  3890  	require.NoError(t, err)
  3891  	require.ElementsMatch(t, []string{group1.Id, group2.Id}, actualGroupIDs)
  3892  
  3893  	// Deleting membership from group should stop the group from being returned
  3894  	_, err = ss.Group().DeleteMember(group1.Id, user.Id)
  3895  	require.NoError(t, err)
  3896  	actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, channel.Id, model.GroupSyncableTypeChannel)
  3897  	require.NoError(t, err)
  3898  	require.ElementsMatch(t, []string{group2.Id}, actualGroupIDs)
  3899  
  3900  	// Deleting group syncable should stop it being returned
  3901  	_, err = ss.Group().DeleteGroupSyncable(group2.Id, channel.Id, model.GroupSyncableTypeChannel)
  3902  	require.NoError(t, err)
  3903  	actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, channel.Id, model.GroupSyncableTypeChannel)
  3904  	require.NoError(t, err)
  3905  	require.ElementsMatch(t, []string{}, actualGroupIDs)
  3906  }
  3907  
  3908  func groupTestAdminRoleGroupsForSyncableMemberTeam(t *testing.T, ss store.Store) {
  3909  	user := &model.User{
  3910  		Email:    MakeEmail(),
  3911  		Username: model.NewId(),
  3912  	}
  3913  	user, err := ss.User().Save(user)
  3914  	require.NoError(t, err)
  3915  
  3916  	group1 := &model.Group{
  3917  		Name:        model.NewString(model.NewId()),
  3918  		DisplayName: model.NewId(),
  3919  		Source:      model.GroupSourceLdap,
  3920  		Description: model.NewId(),
  3921  		RemoteId:    model.NewId(),
  3922  	}
  3923  	group1, err = ss.Group().Create(group1)
  3924  	require.NoError(t, err)
  3925  
  3926  	_, err = ss.Group().UpsertMember(group1.Id, user.Id)
  3927  	require.NoError(t, err)
  3928  
  3929  	group2 := &model.Group{
  3930  		Name:        model.NewString(model.NewId()),
  3931  		DisplayName: model.NewId(),
  3932  		Source:      model.GroupSourceLdap,
  3933  		Description: model.NewId(),
  3934  		RemoteId:    model.NewId(),
  3935  	}
  3936  	group2, err = ss.Group().Create(group2)
  3937  	require.NoError(t, err)
  3938  
  3939  	_, err = ss.Group().UpsertMember(group2.Id, user.Id)
  3940  	require.NoError(t, err)
  3941  
  3942  	team := &model.Team{
  3943  		DisplayName: "A Name",
  3944  		Name:        "zz" + model.NewId(),
  3945  		Type:        model.CHANNEL_OPEN,
  3946  	}
  3947  	team, nErr := ss.Team().Save(team)
  3948  	require.NoError(t, nErr)
  3949  
  3950  	_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  3951  		AutoAdd:     true,
  3952  		SyncableId:  team.Id,
  3953  		Type:        model.GroupSyncableTypeTeam,
  3954  		GroupId:     group1.Id,
  3955  		SchemeAdmin: true,
  3956  	})
  3957  	require.NoError(t, err)
  3958  
  3959  	groupSyncable2, err := ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  3960  		AutoAdd:    true,
  3961  		SyncableId: team.Id,
  3962  		Type:       model.GroupSyncableTypeTeam,
  3963  		GroupId:    group2.Id,
  3964  	})
  3965  	require.NoError(t, err)
  3966  
  3967  	// User is a member of both groups but only one is SchmeAdmin: true
  3968  	actualGroupIDs, err := ss.Group().AdminRoleGroupsForSyncableMember(user.Id, team.Id, model.GroupSyncableTypeTeam)
  3969  	require.NoError(t, err)
  3970  	require.ElementsMatch(t, []string{group1.Id}, actualGroupIDs)
  3971  
  3972  	// Update the second group syncable to be SchemeAdmin: true and both groups should be returned
  3973  	groupSyncable2.SchemeAdmin = true
  3974  	_, err = ss.Group().UpdateGroupSyncable(groupSyncable2)
  3975  	require.NoError(t, err)
  3976  	actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, team.Id, model.GroupSyncableTypeTeam)
  3977  	require.NoError(t, err)
  3978  	require.ElementsMatch(t, []string{group1.Id, group2.Id}, actualGroupIDs)
  3979  
  3980  	// Deleting membership from group should stop the group from being returned
  3981  	_, err = ss.Group().DeleteMember(group1.Id, user.Id)
  3982  	require.NoError(t, err)
  3983  	actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, team.Id, model.GroupSyncableTypeTeam)
  3984  	require.NoError(t, err)
  3985  	require.ElementsMatch(t, []string{group2.Id}, actualGroupIDs)
  3986  
  3987  	// Deleting group syncable should stop it being returned
  3988  	_, err = ss.Group().DeleteGroupSyncable(group2.Id, team.Id, model.GroupSyncableTypeTeam)
  3989  	require.NoError(t, err)
  3990  	actualGroupIDs, err = ss.Group().AdminRoleGroupsForSyncableMember(user.Id, team.Id, model.GroupSyncableTypeTeam)
  3991  	require.NoError(t, err)
  3992  	require.ElementsMatch(t, []string{}, actualGroupIDs)
  3993  }
  3994  
  3995  func groupTestPermittedSyncableAdminsTeam(t *testing.T, ss store.Store) {
  3996  	user1 := &model.User{
  3997  		Email:    MakeEmail(),
  3998  		Username: model.NewId(),
  3999  	}
  4000  	user1, err := ss.User().Save(user1)
  4001  	require.NoError(t, err)
  4002  
  4003  	user2 := &model.User{
  4004  		Email:    MakeEmail(),
  4005  		Username: model.NewId(),
  4006  	}
  4007  	user2, err = ss.User().Save(user2)
  4008  	require.NoError(t, err)
  4009  
  4010  	user3 := &model.User{
  4011  		Email:    MakeEmail(),
  4012  		Username: model.NewId(),
  4013  	}
  4014  	user3, err = ss.User().Save(user3)
  4015  	require.NoError(t, err)
  4016  
  4017  	group1 := &model.Group{
  4018  		Name:        model.NewString(model.NewId()),
  4019  		DisplayName: model.NewId(),
  4020  		Source:      model.GroupSourceLdap,
  4021  		Description: model.NewId(),
  4022  		RemoteId:    model.NewId(),
  4023  	}
  4024  	group1, err = ss.Group().Create(group1)
  4025  	require.NoError(t, err)
  4026  
  4027  	_, err = ss.Group().UpsertMember(group1.Id, user1.Id)
  4028  	require.NoError(t, err)
  4029  	_, err = ss.Group().UpsertMember(group1.Id, user2.Id)
  4030  	require.NoError(t, err)
  4031  
  4032  	group2 := &model.Group{
  4033  		Name:        model.NewString(model.NewId()),
  4034  		DisplayName: model.NewId(),
  4035  		Source:      model.GroupSourceLdap,
  4036  		Description: model.NewId(),
  4037  		RemoteId:    model.NewId(),
  4038  	}
  4039  	group2, err = ss.Group().Create(group2)
  4040  	require.NoError(t, err)
  4041  
  4042  	_, err = ss.Group().UpsertMember(group2.Id, user3.Id)
  4043  	require.NoError(t, err)
  4044  
  4045  	team := &model.Team{
  4046  		DisplayName: "A Name",
  4047  		Name:        "zz" + model.NewId(),
  4048  		Type:        model.CHANNEL_OPEN,
  4049  	}
  4050  	team, nErr := ss.Team().Save(team)
  4051  	require.NoError(t, nErr)
  4052  
  4053  	_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  4054  		AutoAdd:     true,
  4055  		SyncableId:  team.Id,
  4056  		Type:        model.GroupSyncableTypeTeam,
  4057  		GroupId:     group1.Id,
  4058  		SchemeAdmin: true,
  4059  	})
  4060  	require.NoError(t, err)
  4061  
  4062  	groupSyncable2, err := ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  4063  		AutoAdd:     true,
  4064  		SyncableId:  team.Id,
  4065  		Type:        model.GroupSyncableTypeTeam,
  4066  		GroupId:     group2.Id,
  4067  		SchemeAdmin: false,
  4068  	})
  4069  	require.NoError(t, err)
  4070  
  4071  	// group 1's users are returned because groupsyncable 2 has SchemeAdmin false.
  4072  	actualUserIDs, err := ss.Group().PermittedSyncableAdmins(team.Id, model.GroupSyncableTypeTeam)
  4073  	require.NoError(t, err)
  4074  	require.ElementsMatch(t, []string{user1.Id, user2.Id}, actualUserIDs)
  4075  
  4076  	// update groupsyncable 2 to be SchemeAdmin true
  4077  	groupSyncable2.SchemeAdmin = true
  4078  	_, err = ss.Group().UpdateGroupSyncable(groupSyncable2)
  4079  	require.NoError(t, err)
  4080  
  4081  	// group 2's users are now included in return value
  4082  	actualUserIDs, err = ss.Group().PermittedSyncableAdmins(team.Id, model.GroupSyncableTypeTeam)
  4083  	require.NoError(t, err)
  4084  	require.ElementsMatch(t, []string{user1.Id, user2.Id, user3.Id}, actualUserIDs)
  4085  
  4086  	// deleted group member should not be included
  4087  	ss.Group().DeleteMember(group1.Id, user2.Id)
  4088  	require.NoError(t, err)
  4089  	actualUserIDs, err = ss.Group().PermittedSyncableAdmins(team.Id, model.GroupSyncableTypeTeam)
  4090  	require.NoError(t, err)
  4091  	require.ElementsMatch(t, []string{user1.Id, user3.Id}, actualUserIDs)
  4092  
  4093  	// deleted group syncable no longer includes group members
  4094  	_, err = ss.Group().DeleteGroupSyncable(group1.Id, team.Id, model.GroupSyncableTypeTeam)
  4095  	require.NoError(t, err)
  4096  	actualUserIDs, err = ss.Group().PermittedSyncableAdmins(team.Id, model.GroupSyncableTypeTeam)
  4097  	require.NoError(t, err)
  4098  	require.ElementsMatch(t, []string{user3.Id}, actualUserIDs)
  4099  }
  4100  
  4101  func groupTestPermittedSyncableAdminsChannel(t *testing.T, ss store.Store) {
  4102  	user1 := &model.User{
  4103  		Email:    MakeEmail(),
  4104  		Username: model.NewId(),
  4105  	}
  4106  	user1, err := ss.User().Save(user1)
  4107  	require.NoError(t, err)
  4108  
  4109  	user2 := &model.User{
  4110  		Email:    MakeEmail(),
  4111  		Username: model.NewId(),
  4112  	}
  4113  	user2, err = ss.User().Save(user2)
  4114  	require.NoError(t, err)
  4115  
  4116  	user3 := &model.User{
  4117  		Email:    MakeEmail(),
  4118  		Username: model.NewId(),
  4119  	}
  4120  	user3, err = ss.User().Save(user3)
  4121  	require.NoError(t, err)
  4122  
  4123  	group1 := &model.Group{
  4124  		Name:        model.NewString(model.NewId()),
  4125  		DisplayName: model.NewId(),
  4126  		Source:      model.GroupSourceLdap,
  4127  		Description: model.NewId(),
  4128  		RemoteId:    model.NewId(),
  4129  	}
  4130  	group1, err = ss.Group().Create(group1)
  4131  	require.NoError(t, err)
  4132  
  4133  	_, err = ss.Group().UpsertMember(group1.Id, user1.Id)
  4134  	require.NoError(t, err)
  4135  	_, err = ss.Group().UpsertMember(group1.Id, user2.Id)
  4136  	require.NoError(t, err)
  4137  
  4138  	group2 := &model.Group{
  4139  		Name:        model.NewString(model.NewId()),
  4140  		DisplayName: model.NewId(),
  4141  		Source:      model.GroupSourceLdap,
  4142  		Description: model.NewId(),
  4143  		RemoteId:    model.NewId(),
  4144  	}
  4145  	group2, err = ss.Group().Create(group2)
  4146  	require.NoError(t, err)
  4147  
  4148  	_, err = ss.Group().UpsertMember(group2.Id, user3.Id)
  4149  	require.NoError(t, err)
  4150  
  4151  	channel := &model.Channel{
  4152  		TeamId:      model.NewId(),
  4153  		DisplayName: "A Name",
  4154  		Name:        model.NewId(),
  4155  		Type:        model.CHANNEL_OPEN,
  4156  	}
  4157  	channel, nErr := ss.Channel().Save(channel, 9999)
  4158  	require.NoError(t, nErr)
  4159  
  4160  	_, err = ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  4161  		AutoAdd:     true,
  4162  		SyncableId:  channel.Id,
  4163  		Type:        model.GroupSyncableTypeChannel,
  4164  		GroupId:     group1.Id,
  4165  		SchemeAdmin: true,
  4166  	})
  4167  	require.NoError(t, err)
  4168  
  4169  	groupSyncable2, err := ss.Group().CreateGroupSyncable(&model.GroupSyncable{
  4170  		AutoAdd:     true,
  4171  		SyncableId:  channel.Id,
  4172  		Type:        model.GroupSyncableTypeChannel,
  4173  		GroupId:     group2.Id,
  4174  		SchemeAdmin: false,
  4175  	})
  4176  	require.NoError(t, err)
  4177  
  4178  	// group 1's users are returned because groupsyncable 2 has SchemeAdmin false.
  4179  	actualUserIDs, err := ss.Group().PermittedSyncableAdmins(channel.Id, model.GroupSyncableTypeChannel)
  4180  	require.NoError(t, err)
  4181  	require.ElementsMatch(t, []string{user1.Id, user2.Id}, actualUserIDs)
  4182  
  4183  	// update groupsyncable 2 to be SchemeAdmin true
  4184  	groupSyncable2.SchemeAdmin = true
  4185  	_, err = ss.Group().UpdateGroupSyncable(groupSyncable2)
  4186  	require.NoError(t, err)
  4187  
  4188  	// group 2's users are now included in return value
  4189  	actualUserIDs, err = ss.Group().PermittedSyncableAdmins(channel.Id, model.GroupSyncableTypeChannel)
  4190  	require.NoError(t, err)
  4191  	require.ElementsMatch(t, []string{user1.Id, user2.Id, user3.Id}, actualUserIDs)
  4192  
  4193  	// deleted group member should not be included
  4194  	ss.Group().DeleteMember(group1.Id, user2.Id)
  4195  	require.NoError(t, err)
  4196  	actualUserIDs, err = ss.Group().PermittedSyncableAdmins(channel.Id, model.GroupSyncableTypeChannel)
  4197  	require.NoError(t, err)
  4198  	require.ElementsMatch(t, []string{user1.Id, user3.Id}, actualUserIDs)
  4199  
  4200  	// deleted group syncable no longer includes group members
  4201  	_, err = ss.Group().DeleteGroupSyncable(group1.Id, channel.Id, model.GroupSyncableTypeChannel)
  4202  	require.NoError(t, err)
  4203  	actualUserIDs, err = ss.Group().PermittedSyncableAdmins(channel.Id, model.GroupSyncableTypeChannel)
  4204  	require.NoError(t, err)
  4205  	require.ElementsMatch(t, []string{user3.Id}, actualUserIDs)
  4206  }
  4207  
  4208  func groupTestpUpdateMembersRoleTeam(t *testing.T, ss store.Store) {
  4209  	team := &model.Team{
  4210  		DisplayName:     "Name",
  4211  		Description:     "Some description",
  4212  		CompanyName:     "Some company name",
  4213  		AllowOpenInvite: false,
  4214  		InviteId:        "inviteid0",
  4215  		Name:            "z-z-" + model.NewId() + "a",
  4216  		Email:           "success+" + model.NewId() + "@simulator.amazonses.com",
  4217  		Type:            model.TEAM_OPEN,
  4218  	}
  4219  	team, err := ss.Team().Save(team)
  4220  	require.NoError(t, err)
  4221  
  4222  	user1 := &model.User{
  4223  		Email:    MakeEmail(),
  4224  		Username: model.NewId(),
  4225  	}
  4226  	user1, err = ss.User().Save(user1)
  4227  	require.NoError(t, err)
  4228  
  4229  	user2 := &model.User{
  4230  		Email:    MakeEmail(),
  4231  		Username: model.NewId(),
  4232  	}
  4233  	user2, err = ss.User().Save(user2)
  4234  	require.NoError(t, err)
  4235  
  4236  	user3 := &model.User{
  4237  		Email:    MakeEmail(),
  4238  		Username: model.NewId(),
  4239  	}
  4240  	user3, err = ss.User().Save(user3)
  4241  	require.NoError(t, err)
  4242  
  4243  	user4 := &model.User{
  4244  		Email:    MakeEmail(),
  4245  		Username: model.NewId(),
  4246  	}
  4247  	user4, err = ss.User().Save(user4)
  4248  	require.NoError(t, err)
  4249  
  4250  	for _, user := range []*model.User{user1, user2, user3} {
  4251  		_, nErr := ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: user.Id}, 9999)
  4252  		require.NoError(t, nErr)
  4253  	}
  4254  
  4255  	_, nErr := ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: user4.Id, SchemeGuest: true}, 9999)
  4256  	require.NoError(t, nErr)
  4257  
  4258  	tests := []struct {
  4259  		testName               string
  4260  		inUserIDs              []string
  4261  		targetSchemeAdminValue bool
  4262  	}{
  4263  		{
  4264  			"Given users are admins",
  4265  			[]string{user1.Id, user2.Id},
  4266  			true,
  4267  		},
  4268  		{
  4269  			"Given users are members",
  4270  			[]string{user2.Id},
  4271  			false,
  4272  		},
  4273  		{
  4274  			"Non-given users are admins",
  4275  			[]string{user2.Id},
  4276  			false,
  4277  		},
  4278  		{
  4279  			"Non-given users are members",
  4280  			[]string{user2.Id},
  4281  			false,
  4282  		},
  4283  	}
  4284  
  4285  	for _, tt := range tests {
  4286  		t.Run(tt.testName, func(t *testing.T) {
  4287  			err = ss.Team().UpdateMembersRole(team.Id, tt.inUserIDs)
  4288  			require.NoError(t, err)
  4289  
  4290  			members, err := ss.Team().GetMembers(team.Id, 0, 100, nil)
  4291  			require.NoError(t, err)
  4292  			require.GreaterOrEqual(t, len(members), 4) // sanity check for team membership
  4293  
  4294  			for _, member := range members {
  4295  				if utils.StringInSlice(member.UserId, tt.inUserIDs) {
  4296  					require.True(t, member.SchemeAdmin)
  4297  				} else {
  4298  					require.False(t, member.SchemeAdmin)
  4299  				}
  4300  
  4301  				// Ensure guest account never changes.
  4302  				if member.UserId == user4.Id {
  4303  					require.False(t, member.SchemeUser)
  4304  					require.False(t, member.SchemeAdmin)
  4305  					require.True(t, member.SchemeGuest)
  4306  				}
  4307  			}
  4308  		})
  4309  	}
  4310  }
  4311  
  4312  func groupTestpUpdateMembersRoleChannel(t *testing.T, ss store.Store) {
  4313  	channel := &model.Channel{
  4314  		TeamId:      model.NewId(),
  4315  		DisplayName: "A Name",
  4316  		Name:        model.NewId(),
  4317  		Type:        model.CHANNEL_OPEN, // Query does not look at type so this shouldn't matter.
  4318  	}
  4319  	channel, err := ss.Channel().Save(channel, 9999)
  4320  	require.NoError(t, err)
  4321  
  4322  	user1 := &model.User{
  4323  		Email:    MakeEmail(),
  4324  		Username: model.NewId(),
  4325  	}
  4326  	user1, err = ss.User().Save(user1)
  4327  	require.NoError(t, err)
  4328  
  4329  	user2 := &model.User{
  4330  		Email:    MakeEmail(),
  4331  		Username: model.NewId(),
  4332  	}
  4333  	user2, err = ss.User().Save(user2)
  4334  	require.NoError(t, err)
  4335  
  4336  	user3 := &model.User{
  4337  		Email:    MakeEmail(),
  4338  		Username: model.NewId(),
  4339  	}
  4340  	user3, err = ss.User().Save(user3)
  4341  	require.NoError(t, err)
  4342  
  4343  	user4 := &model.User{
  4344  		Email:    MakeEmail(),
  4345  		Username: model.NewId(),
  4346  	}
  4347  	user4, err = ss.User().Save(user4)
  4348  	require.NoError(t, err)
  4349  
  4350  	for _, user := range []*model.User{user1, user2, user3} {
  4351  		_, err = ss.Channel().SaveMember(&model.ChannelMember{
  4352  			ChannelId:   channel.Id,
  4353  			UserId:      user.Id,
  4354  			NotifyProps: model.GetDefaultChannelNotifyProps(),
  4355  		})
  4356  		require.NoError(t, err)
  4357  	}
  4358  
  4359  	_, err = ss.Channel().SaveMember(&model.ChannelMember{
  4360  		ChannelId:   channel.Id,
  4361  		UserId:      user4.Id,
  4362  		NotifyProps: model.GetDefaultChannelNotifyProps(),
  4363  		SchemeGuest: true,
  4364  	})
  4365  	require.NoError(t, err)
  4366  
  4367  	tests := []struct {
  4368  		testName               string
  4369  		inUserIDs              []string
  4370  		targetSchemeAdminValue bool
  4371  	}{
  4372  		{
  4373  			"Given users are admins",
  4374  			[]string{user1.Id, user2.Id},
  4375  			true,
  4376  		},
  4377  		{
  4378  			"Given users are members",
  4379  			[]string{user2.Id},
  4380  			false,
  4381  		},
  4382  		{
  4383  			"Non-given users are admins",
  4384  			[]string{user2.Id},
  4385  			false,
  4386  		},
  4387  		{
  4388  			"Non-given users are members",
  4389  			[]string{user2.Id},
  4390  			false,
  4391  		},
  4392  	}
  4393  
  4394  	for _, tt := range tests {
  4395  		t.Run(tt.testName, func(t *testing.T) {
  4396  			err = ss.Channel().UpdateMembersRole(channel.Id, tt.inUserIDs)
  4397  			require.NoError(t, err)
  4398  
  4399  			members, err := ss.Channel().GetMembers(channel.Id, 0, 100)
  4400  			require.NoError(t, err)
  4401  
  4402  			require.GreaterOrEqual(t, len(*members), 4) // sanity check for channel membership
  4403  
  4404  			for _, member := range *members {
  4405  				if utils.StringInSlice(member.UserId, tt.inUserIDs) {
  4406  					require.True(t, member.SchemeAdmin)
  4407  				} else {
  4408  					require.False(t, member.SchemeAdmin)
  4409  				}
  4410  
  4411  				// Ensure guest account never changes.
  4412  				if member.UserId == user4.Id {
  4413  					require.False(t, member.SchemeUser)
  4414  					require.False(t, member.SchemeAdmin)
  4415  					require.True(t, member.SchemeGuest)
  4416  				}
  4417  			}
  4418  		})
  4419  	}
  4420  }
  4421  
  4422  func groupTestGroupCount(t *testing.T, ss store.Store) {
  4423  	group1, err := ss.Group().Create(&model.Group{
  4424  		Name:        model.NewString(model.NewId()),
  4425  		DisplayName: model.NewId(),
  4426  		Source:      model.GroupSourceLdap,
  4427  		RemoteId:    model.NewId(),
  4428  	})
  4429  	require.NoError(t, err)
  4430  	defer ss.Group().Delete(group1.Id)
  4431  
  4432  	count, err := ss.Group().GroupCount()
  4433  	require.NoError(t, err)
  4434  	require.GreaterOrEqual(t, count, int64(1))
  4435  
  4436  	group2, err := ss.Group().Create(&model.Group{
  4437  		Name:        model.NewString(model.NewId()),
  4438  		DisplayName: model.NewId(),
  4439  		Source:      model.GroupSourceLdap,
  4440  		RemoteId:    model.NewId(),
  4441  	})
  4442  	require.NoError(t, err)
  4443  	defer ss.Group().Delete(group2.Id)
  4444  
  4445  	countAfter, err := ss.Group().GroupCount()
  4446  	require.NoError(t, err)
  4447  	require.GreaterOrEqual(t, countAfter, count+1)
  4448  }
  4449  
  4450  func groupTestGroupTeamCount(t *testing.T, ss store.Store) {
  4451  	team, err := ss.Team().Save(&model.Team{
  4452  		DisplayName:     model.NewId(),
  4453  		Description:     model.NewId(),
  4454  		AllowOpenInvite: false,
  4455  		InviteId:        model.NewId(),
  4456  		Name:            "zz" + model.NewId(),
  4457  		Email:           model.NewId() + "@simulator.amazonses.com",
  4458  		Type:            model.TEAM_OPEN,
  4459  	})
  4460  	require.NoError(t, err)
  4461  	defer ss.Team().PermanentDelete(team.Id)
  4462  
  4463  	group1, err := ss.Group().Create(&model.Group{
  4464  		Name:        model.NewString(model.NewId()),
  4465  		DisplayName: model.NewId(),
  4466  		Source:      model.GroupSourceLdap,
  4467  		RemoteId:    model.NewId(),
  4468  	})
  4469  	require.NoError(t, err)
  4470  	defer ss.Group().Delete(group1.Id)
  4471  
  4472  	group2, err := ss.Group().Create(&model.Group{
  4473  		Name:        model.NewString(model.NewId()),
  4474  		DisplayName: model.NewId(),
  4475  		Source:      model.GroupSourceLdap,
  4476  		RemoteId:    model.NewId(),
  4477  	})
  4478  	require.NoError(t, err)
  4479  	defer ss.Group().Delete(group2.Id)
  4480  
  4481  	groupSyncable1, err := ss.Group().CreateGroupSyncable(model.NewGroupTeam(group1.Id, team.Id, false))
  4482  	require.NoError(t, err)
  4483  	defer ss.Group().DeleteGroupSyncable(groupSyncable1.GroupId, groupSyncable1.SyncableId, groupSyncable1.Type)
  4484  
  4485  	count, err := ss.Group().GroupTeamCount()
  4486  	require.NoError(t, err)
  4487  	require.GreaterOrEqual(t, count, int64(1))
  4488  
  4489  	groupSyncable2, err := ss.Group().CreateGroupSyncable(model.NewGroupTeam(group2.Id, team.Id, false))
  4490  	require.NoError(t, err)
  4491  	defer ss.Group().DeleteGroupSyncable(groupSyncable2.GroupId, groupSyncable2.SyncableId, groupSyncable2.Type)
  4492  
  4493  	countAfter, err := ss.Group().GroupTeamCount()
  4494  	require.NoError(t, err)
  4495  	require.GreaterOrEqual(t, countAfter, count+1)
  4496  }
  4497  
  4498  func groupTestGroupChannelCount(t *testing.T, ss store.Store) {
  4499  	channel, err := ss.Channel().Save(&model.Channel{
  4500  		TeamId:      model.NewId(),
  4501  		DisplayName: model.NewId(),
  4502  		Name:        model.NewId(),
  4503  		Type:        model.CHANNEL_OPEN,
  4504  	}, 9999)
  4505  	require.NoError(t, err)
  4506  	defer ss.Channel().Delete(channel.Id, 0)
  4507  
  4508  	group1, err := ss.Group().Create(&model.Group{
  4509  		Name:        model.NewString(model.NewId()),
  4510  		DisplayName: model.NewId(),
  4511  		Source:      model.GroupSourceLdap,
  4512  		RemoteId:    model.NewId(),
  4513  	})
  4514  	require.NoError(t, err)
  4515  	defer ss.Group().Delete(group1.Id)
  4516  
  4517  	group2, err := ss.Group().Create(&model.Group{
  4518  		Name:        model.NewString(model.NewId()),
  4519  		DisplayName: model.NewId(),
  4520  		Source:      model.GroupSourceLdap,
  4521  		RemoteId:    model.NewId(),
  4522  	})
  4523  	require.NoError(t, err)
  4524  	defer ss.Group().Delete(group2.Id)
  4525  
  4526  	groupSyncable1, err := ss.Group().CreateGroupSyncable(model.NewGroupChannel(group1.Id, channel.Id, false))
  4527  	require.NoError(t, err)
  4528  	defer ss.Group().DeleteGroupSyncable(groupSyncable1.GroupId, groupSyncable1.SyncableId, groupSyncable1.Type)
  4529  
  4530  	count, err := ss.Group().GroupChannelCount()
  4531  	require.NoError(t, err)
  4532  	require.GreaterOrEqual(t, count, int64(1))
  4533  
  4534  	groupSyncable2, err := ss.Group().CreateGroupSyncable(model.NewGroupChannel(group2.Id, channel.Id, false))
  4535  	require.NoError(t, err)
  4536  	defer ss.Group().DeleteGroupSyncable(groupSyncable2.GroupId, groupSyncable2.SyncableId, groupSyncable2.Type)
  4537  
  4538  	countAfter, err := ss.Group().GroupChannelCount()
  4539  	require.NoError(t, err)
  4540  	require.GreaterOrEqual(t, countAfter, count+1)
  4541  }
  4542  
  4543  func groupTestGroupMemberCount(t *testing.T, ss store.Store) {
  4544  	group, err := ss.Group().Create(&model.Group{
  4545  		Name:        model.NewString(model.NewId()),
  4546  		DisplayName: model.NewId(),
  4547  		Source:      model.GroupSourceLdap,
  4548  		RemoteId:    model.NewId(),
  4549  	})
  4550  	require.NoError(t, err)
  4551  	defer ss.Group().Delete(group.Id)
  4552  
  4553  	member1, err := ss.Group().UpsertMember(group.Id, model.NewId())
  4554  	require.NoError(t, err)
  4555  	defer ss.Group().DeleteMember(group.Id, member1.UserId)
  4556  
  4557  	count, err := ss.Group().GroupMemberCount()
  4558  	require.NoError(t, err)
  4559  	require.GreaterOrEqual(t, count, int64(1))
  4560  
  4561  	member2, err := ss.Group().UpsertMember(group.Id, model.NewId())
  4562  	require.NoError(t, err)
  4563  	defer ss.Group().DeleteMember(group.Id, member2.UserId)
  4564  
  4565  	countAfter, err := ss.Group().GroupMemberCount()
  4566  	require.NoError(t, err)
  4567  	require.GreaterOrEqual(t, countAfter, count+1)
  4568  }
  4569  
  4570  func groupTestDistinctGroupMemberCount(t *testing.T, ss store.Store) {
  4571  	group1, err := ss.Group().Create(&model.Group{
  4572  		Name:        model.NewString(model.NewId()),
  4573  		DisplayName: model.NewId(),
  4574  		Source:      model.GroupSourceLdap,
  4575  		RemoteId:    model.NewId(),
  4576  	})
  4577  	require.NoError(t, err)
  4578  	defer ss.Group().Delete(group1.Id)
  4579  
  4580  	group2, err := ss.Group().Create(&model.Group{
  4581  		Name:        model.NewString(model.NewId()),
  4582  		DisplayName: model.NewId(),
  4583  		Source:      model.GroupSourceLdap,
  4584  		RemoteId:    model.NewId(),
  4585  	})
  4586  	require.NoError(t, err)
  4587  	defer ss.Group().Delete(group2.Id)
  4588  
  4589  	member1, err := ss.Group().UpsertMember(group1.Id, model.NewId())
  4590  	require.NoError(t, err)
  4591  	defer ss.Group().DeleteMember(group1.Id, member1.UserId)
  4592  
  4593  	count, err := ss.Group().GroupMemberCount()
  4594  	require.NoError(t, err)
  4595  	require.GreaterOrEqual(t, count, int64(1))
  4596  
  4597  	member2, err := ss.Group().UpsertMember(group1.Id, model.NewId())
  4598  	require.NoError(t, err)
  4599  	defer ss.Group().DeleteMember(group1.Id, member2.UserId)
  4600  
  4601  	countAfter1, err := ss.Group().GroupMemberCount()
  4602  	require.NoError(t, err)
  4603  	require.GreaterOrEqual(t, countAfter1, count+1)
  4604  
  4605  	member3, err := ss.Group().UpsertMember(group1.Id, member1.UserId)
  4606  	require.NoError(t, err)
  4607  	defer ss.Group().DeleteMember(group1.Id, member3.UserId)
  4608  
  4609  	countAfter2, err := ss.Group().GroupMemberCount()
  4610  	require.NoError(t, err)
  4611  	require.GreaterOrEqual(t, countAfter2, countAfter1)
  4612  }
  4613  
  4614  func groupTestGroupCountWithAllowReference(t *testing.T, ss store.Store) {
  4615  	initialCount, err := ss.Group().GroupCountWithAllowReference()
  4616  	require.NoError(t, err)
  4617  
  4618  	group1, err := ss.Group().Create(&model.Group{
  4619  		Name:        model.NewString(model.NewId()),
  4620  		DisplayName: model.NewId(),
  4621  		Source:      model.GroupSourceLdap,
  4622  		RemoteId:    model.NewId(),
  4623  	})
  4624  	require.NoError(t, err)
  4625  	defer ss.Group().Delete(group1.Id)
  4626  
  4627  	count, err := ss.Group().GroupCountWithAllowReference()
  4628  	require.NoError(t, err)
  4629  	require.Equal(t, count, initialCount)
  4630  
  4631  	group2, err := ss.Group().Create(&model.Group{
  4632  		Name:           model.NewString(model.NewId()),
  4633  		DisplayName:    model.NewId(),
  4634  		Source:         model.GroupSourceLdap,
  4635  		RemoteId:       model.NewId(),
  4636  		AllowReference: true,
  4637  	})
  4638  	require.NoError(t, err)
  4639  	defer ss.Group().Delete(group2.Id)
  4640  
  4641  	countAfter, err := ss.Group().GroupCountWithAllowReference()
  4642  	require.NoError(t, err)
  4643  	require.Greater(t, countAfter, count)
  4644  }