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