github.com/mattermost/mattermost-server/v5@v5.39.3/store/storetest/team_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  	"context"
     8  	"errors"
     9  	"strings"
    10  	"testing"
    11  	"time"
    12  
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/require"
    15  
    16  	"github.com/mattermost/mattermost-server/v5/model"
    17  	"github.com/mattermost/mattermost-server/v5/store"
    18  )
    19  
    20  func cleanupTeamStore(t *testing.T, ss store.Store) {
    21  	allTeams, err := ss.Team().GetAll()
    22  	for _, team := range allTeams {
    23  		ss.Team().PermanentDelete(team.Id)
    24  	}
    25  	assert.NoError(t, err)
    26  }
    27  
    28  func TestTeamStore(t *testing.T, ss store.Store) {
    29  	createDefaultRoles(ss)
    30  
    31  	t.Run("Save", func(t *testing.T) { testTeamStoreSave(t, ss) })
    32  	t.Run("Update", func(t *testing.T) { testTeamStoreUpdate(t, ss) })
    33  	t.Run("Get", func(t *testing.T) { testTeamStoreGet(t, ss) })
    34  	t.Run("GetByName", func(t *testing.T) { testTeamStoreGetByName(t, ss) })
    35  	t.Run("GetByNames", func(t *testing.T) { testTeamStoreGetByNames(t, ss) })
    36  	t.Run("SearchAll", func(t *testing.T) { testTeamStoreSearchAll(t, ss) })
    37  	t.Run("SearchOpen", func(t *testing.T) { testTeamStoreSearchOpen(t, ss) })
    38  	t.Run("SearchPrivate", func(t *testing.T) { testTeamStoreSearchPrivate(t, ss) })
    39  	t.Run("GetByInviteId", func(t *testing.T) { testTeamStoreGetByInviteId(t, ss) })
    40  	t.Run("ByUserId", func(t *testing.T) { testTeamStoreByUserId(t, ss) })
    41  	t.Run("GetAllTeamListing", func(t *testing.T) { testGetAllTeamListing(t, ss) })
    42  	t.Run("GetAllTeamPage", func(t *testing.T) { testTeamStoreGetAllPage(t, ss) })
    43  	t.Run("GetAllTeamPageListing", func(t *testing.T) { testGetAllTeamPageListing(t, ss) })
    44  	t.Run("GetAllPrivateTeamListing", func(t *testing.T) { testGetAllPrivateTeamListing(t, ss) })
    45  	t.Run("GetAllPrivateTeamPageListing", func(t *testing.T) { testGetAllPrivateTeamPageListing(t, ss) })
    46  	t.Run("GetAllPublicTeamPageListing", func(t *testing.T) { testGetAllPublicTeamPageListing(t, ss) })
    47  	t.Run("Delete", func(t *testing.T) { testDelete(t, ss) })
    48  	t.Run("TeamCount", func(t *testing.T) { testTeamCount(t, ss) })
    49  	t.Run("TeamPublicCount", func(t *testing.T) { testPublicTeamCount(t, ss) })
    50  	t.Run("TeamPrivateCount", func(t *testing.T) { testPrivateTeamCount(t, ss) })
    51  	t.Run("TeamMembers", func(t *testing.T) { testTeamMembers(t, ss) })
    52  	t.Run("TestGetMembers", func(t *testing.T) { testGetMembers(t, ss) })
    53  	t.Run("SaveMember", func(t *testing.T) { testTeamSaveMember(t, ss) })
    54  	t.Run("SaveMultipleMembers", func(t *testing.T) { testTeamSaveMultipleMembers(t, ss) })
    55  	t.Run("UpdateMember", func(t *testing.T) { testTeamUpdateMember(t, ss) })
    56  	t.Run("UpdateMultipleMembers", func(t *testing.T) { testTeamUpdateMultipleMembers(t, ss) })
    57  	t.Run("RemoveMember", func(t *testing.T) { testTeamRemoveMember(t, ss) })
    58  	t.Run("RemoveMembers", func(t *testing.T) { testTeamRemoveMembers(t, ss) })
    59  	t.Run("SaveTeamMemberMaxMembers", func(t *testing.T) { testSaveTeamMemberMaxMembers(t, ss) })
    60  	t.Run("GetTeamMember", func(t *testing.T) { testGetTeamMember(t, ss) })
    61  	t.Run("GetTeamMembersByIds", func(t *testing.T) { testGetTeamMembersByIds(t, ss) })
    62  	t.Run("MemberCount", func(t *testing.T) { testTeamStoreMemberCount(t, ss) })
    63  	t.Run("GetChannelUnreadsForAllTeams", func(t *testing.T) { testGetChannelUnreadsForAllTeams(t, ss) })
    64  	t.Run("GetChannelUnreadsForTeam", func(t *testing.T) { testGetChannelUnreadsForTeam(t, ss) })
    65  	t.Run("UpdateLastTeamIconUpdate", func(t *testing.T) { testUpdateLastTeamIconUpdate(t, ss) })
    66  	t.Run("GetTeamsByScheme", func(t *testing.T) { testGetTeamsByScheme(t, ss) })
    67  	t.Run("MigrateTeamMembers", func(t *testing.T) { testTeamStoreMigrateTeamMembers(t, ss) })
    68  	t.Run("ResetAllTeamSchemes", func(t *testing.T) { testResetAllTeamSchemes(t, ss) })
    69  	t.Run("ClearAllCustomRoleAssignments", func(t *testing.T) { testTeamStoreClearAllCustomRoleAssignments(t, ss) })
    70  	t.Run("AnalyticsGetTeamCountForScheme", func(t *testing.T) { testTeamStoreAnalyticsGetTeamCountForScheme(t, ss) })
    71  	t.Run("GetAllForExportAfter", func(t *testing.T) { testTeamStoreGetAllForExportAfter(t, ss) })
    72  	t.Run("GetTeamMembersForExport", func(t *testing.T) { testTeamStoreGetTeamMembersForExport(t, ss) })
    73  	t.Run("GetTeamsForUserWithPagination", func(t *testing.T) { testTeamMembersWithPagination(t, ss) })
    74  	t.Run("GroupSyncedTeamCount", func(t *testing.T) { testGroupSyncedTeamCount(t, ss) })
    75  }
    76  
    77  func testTeamStoreSave(t *testing.T, ss store.Store) {
    78  	o1 := model.Team{}
    79  	o1.DisplayName = "DisplayName"
    80  	o1.Name = NewTestId()
    81  	o1.Email = MakeEmail()
    82  	o1.Type = model.TEAM_OPEN
    83  
    84  	_, err := ss.Team().Save(&o1)
    85  	require.NoError(t, err, "couldn't save item")
    86  
    87  	_, err = ss.Team().Save(&o1)
    88  	require.Error(t, err, "shouldn't be able to update from save")
    89  
    90  	o1.Id = ""
    91  	_, err = ss.Team().Save(&o1)
    92  	require.Error(t, err, "should be unique domain")
    93  }
    94  
    95  func testTeamStoreUpdate(t *testing.T, ss store.Store) {
    96  	o1 := model.Team{}
    97  	o1.DisplayName = "DisplayName"
    98  	o1.Name = NewTestId()
    99  	o1.Email = MakeEmail()
   100  	o1.Type = model.TEAM_OPEN
   101  	_, err := ss.Team().Save(&o1)
   102  	require.NoError(t, err)
   103  
   104  	time.Sleep(100 * time.Millisecond)
   105  
   106  	_, err = ss.Team().Update(&o1)
   107  	require.NoError(t, err)
   108  
   109  	o1.Id = "missing"
   110  	_, err = ss.Team().Update(&o1)
   111  	require.Error(t, err, "Update should have failed because of missing key")
   112  
   113  	o1.Id = model.NewId()
   114  	_, err = ss.Team().Update(&o1)
   115  	require.Error(t, err, "Update should have faile because id change")
   116  }
   117  
   118  func testTeamStoreGet(t *testing.T, ss store.Store) {
   119  	o1 := model.Team{}
   120  	o1.DisplayName = "DisplayName"
   121  	o1.Name = NewTestId()
   122  	o1.Email = MakeEmail()
   123  	o1.Type = model.TEAM_OPEN
   124  	_, err := ss.Team().Save(&o1)
   125  	require.NoError(t, err)
   126  
   127  	r1, err := ss.Team().Get(o1.Id)
   128  	require.NoError(t, err)
   129  	require.Equal(t, r1.ToJson(), o1.ToJson())
   130  
   131  	_, err = ss.Team().Get("")
   132  	require.Error(t, err, "Missing id should have failed")
   133  }
   134  
   135  func testTeamStoreGetByNames(t *testing.T, ss store.Store) {
   136  	o1 := model.Team{}
   137  	o1.DisplayName = "DisplayName"
   138  	o1.Name = NewTestId()
   139  	o1.Email = MakeEmail()
   140  	o1.Type = model.TEAM_OPEN
   141  
   142  	_, err := ss.Team().Save(&o1)
   143  	require.NoError(t, err)
   144  
   145  	o2 := model.Team{}
   146  	o2.DisplayName = "DisplayName2"
   147  	o2.Name = NewTestId()
   148  	o2.Email = MakeEmail()
   149  	o2.Type = model.TEAM_OPEN
   150  
   151  	_, err = ss.Team().Save(&o2)
   152  	require.NoError(t, err)
   153  
   154  	t.Run("Get empty list", func(t *testing.T) {
   155  		var teams []*model.Team
   156  		teams, err = ss.Team().GetByNames([]string{})
   157  		require.NoError(t, err)
   158  		require.Empty(t, teams)
   159  	})
   160  
   161  	t.Run("Get existing teams", func(t *testing.T) {
   162  		var teams []*model.Team
   163  		teams, err = ss.Team().GetByNames([]string{o1.Name, o2.Name})
   164  		require.NoError(t, err)
   165  		teamsIds := []string{}
   166  		for _, team := range teams {
   167  			teamsIds = append(teamsIds, team.Id)
   168  		}
   169  		assert.Contains(t, teamsIds, o1.Id, "invalid returned team")
   170  		assert.Contains(t, teamsIds, o2.Id, "invalid returned team")
   171  	})
   172  
   173  	t.Run("Get existing team and one invalid team name", func(t *testing.T) {
   174  		_, err = ss.Team().GetByNames([]string{o1.Name, ""})
   175  		require.Error(t, err)
   176  	})
   177  
   178  	t.Run("Get existing team and not existing team", func(t *testing.T) {
   179  		_, err = ss.Team().GetByNames([]string{o1.Name, "not-existing-team-name"})
   180  		require.Error(t, err)
   181  	})
   182  	t.Run("Get not existing teams", func(t *testing.T) {
   183  		_, err = ss.Team().GetByNames([]string{"not-existing-team-name", "not-existing-team-name-2"})
   184  		require.Error(t, err)
   185  	})
   186  }
   187  
   188  func testTeamStoreGetByName(t *testing.T, ss store.Store) {
   189  	o1 := model.Team{}
   190  	o1.DisplayName = "DisplayName"
   191  	o1.Name = NewTestId()
   192  	o1.Email = MakeEmail()
   193  	o1.Type = model.TEAM_OPEN
   194  
   195  	_, err := ss.Team().Save(&o1)
   196  	require.NoError(t, err)
   197  
   198  	t.Run("Get existing team", func(t *testing.T) {
   199  		var team *model.Team
   200  		team, err = ss.Team().GetByName(o1.Name)
   201  		require.NoError(t, err)
   202  		require.Equal(t, *team, o1, "invalid returned team")
   203  	})
   204  
   205  	t.Run("Get invalid team name", func(t *testing.T) {
   206  		_, err = ss.Team().GetByName("")
   207  		require.Error(t, err, "Missing id should have failed")
   208  	})
   209  
   210  	t.Run("Get not existing team", func(t *testing.T) {
   211  		_, err = ss.Team().GetByName("not-existing-team-name")
   212  		require.Error(t, err, "Missing id should have failed")
   213  	})
   214  }
   215  
   216  func testTeamStoreSearchAll(t *testing.T, ss store.Store) {
   217  	cleanupTeamStore(t, ss)
   218  
   219  	o := model.Team{}
   220  	o.DisplayName = "ADisplayName" + NewTestId()
   221  	o.Name = "searchterm-" + NewTestId()
   222  	o.Email = MakeEmail()
   223  	o.Type = model.TEAM_OPEN
   224  	o.AllowOpenInvite = true
   225  
   226  	_, err := ss.Team().Save(&o)
   227  	require.NoError(t, err)
   228  
   229  	p := model.Team{}
   230  	p.DisplayName = "BDisplayName" + NewTestId()
   231  	p.Name = "searchterm-" + NewTestId()
   232  	p.Email = MakeEmail()
   233  	p.Type = model.TEAM_OPEN
   234  	p.AllowOpenInvite = false
   235  
   236  	_, err = ss.Team().Save(&p)
   237  	require.NoError(t, err)
   238  
   239  	g := model.Team{}
   240  	g.DisplayName = "CDisplayName" + NewTestId()
   241  	g.Name = "searchterm-" + NewTestId()
   242  	g.Email = MakeEmail()
   243  	g.Type = model.TEAM_OPEN
   244  	g.AllowOpenInvite = false
   245  	g.GroupConstrained = model.NewBool(true)
   246  
   247  	_, err = ss.Team().Save(&g)
   248  	require.NoError(t, err)
   249  
   250  	q := &model.Team{}
   251  	q.DisplayName = "CHOCOLATE"
   252  	q.Name = "ilovecake"
   253  	q.Email = MakeEmail()
   254  	q.Type = model.TEAM_OPEN
   255  	q.AllowOpenInvite = false
   256  
   257  	q, err = ss.Team().Save(q)
   258  	require.NoError(t, err)
   259  
   260  	_, err = ss.RetentionPolicy().Save(&model.RetentionPolicyWithTeamAndChannelIDs{
   261  		RetentionPolicy: model.RetentionPolicy{
   262  			DisplayName:  "Policy 1",
   263  			PostDuration: model.NewInt64(20),
   264  		},
   265  		TeamIDs: []string{q.Id},
   266  	})
   267  	require.NoError(t, err)
   268  
   269  	testCases := []struct {
   270  		Name            string
   271  		Opts            *model.TeamSearch
   272  		ExpectedLenth   int
   273  		ExpectedTeamIds []string
   274  	}{
   275  		{
   276  			"Search chocolate by display name",
   277  			&model.TeamSearch{Term: "ocola"},
   278  			1,
   279  			[]string{q.Id},
   280  		},
   281  		{
   282  			"Search chocolate by display name",
   283  			&model.TeamSearch{Term: "choc"},
   284  			1,
   285  			[]string{q.Id},
   286  		},
   287  		{
   288  			"Search chocolate by display name",
   289  			&model.TeamSearch{Term: "late"},
   290  			1,
   291  			[]string{q.Id},
   292  		},
   293  		{
   294  			"Search chocolate by  name",
   295  			&model.TeamSearch{Term: "ilov"},
   296  			1,
   297  			[]string{q.Id},
   298  		},
   299  		{
   300  			"Search chocolate by  name",
   301  			&model.TeamSearch{Term: "ecake"},
   302  			1,
   303  			[]string{q.Id},
   304  		},
   305  		{
   306  			"Search for open team name",
   307  			&model.TeamSearch{Term: o.Name},
   308  			1,
   309  			[]string{o.Id},
   310  		},
   311  		{
   312  			"Search for open team displayName",
   313  			&model.TeamSearch{Term: o.DisplayName},
   314  			1,
   315  			[]string{o.Id},
   316  		},
   317  		{
   318  			"Search for open team without results",
   319  			&model.TeamSearch{Term: "notexists"},
   320  			0,
   321  			[]string{},
   322  		},
   323  		{
   324  			"Search for private team",
   325  			&model.TeamSearch{Term: p.DisplayName},
   326  			1,
   327  			[]string{p.Id},
   328  		},
   329  		{
   330  			"Search for all 3 searchterm teams",
   331  			&model.TeamSearch{Term: "searchterm"},
   332  			3,
   333  			[]string{o.Id, p.Id, g.Id},
   334  		},
   335  		{
   336  			"Search for all 3 teams filter by allow open invite",
   337  			&model.TeamSearch{Term: "searchterm", AllowOpenInvite: model.NewBool(true)},
   338  			1,
   339  			[]string{o.Id},
   340  		},
   341  		{
   342  			"Search for all 3 teams filter by allow open invite = false",
   343  			&model.TeamSearch{Term: "searchterm", AllowOpenInvite: model.NewBool(false)},
   344  			1,
   345  			[]string{p.Id},
   346  		},
   347  		{
   348  			"Search for all 3 teams filter by group constrained",
   349  			&model.TeamSearch{Term: "searchterm", GroupConstrained: model.NewBool(true)},
   350  			1,
   351  			[]string{g.Id},
   352  		},
   353  		{
   354  			"Search for all 3 teams filter by group constrained = false",
   355  			&model.TeamSearch{Term: "searchterm", GroupConstrained: model.NewBool(false)},
   356  			2,
   357  			[]string{o.Id, p.Id},
   358  		},
   359  		{
   360  			"Search for all 3 teams filter by allow open invite and include group constrained",
   361  			&model.TeamSearch{Term: "searchterm", AllowOpenInvite: model.NewBool(true), GroupConstrained: model.NewBool(true)},
   362  			2,
   363  			[]string{o.Id, g.Id},
   364  		},
   365  		{
   366  			"Search for all 3 teams filter by group constrained and not open invite",
   367  			&model.TeamSearch{Term: "searchterm", GroupConstrained: model.NewBool(true), AllowOpenInvite: model.NewBool(false)},
   368  			2,
   369  			[]string{g.Id, p.Id},
   370  		},
   371  		{
   372  			"Search for all 3 teams filter by group constrained false and open invite",
   373  			&model.TeamSearch{Term: "searchterm", GroupConstrained: model.NewBool(false), AllowOpenInvite: model.NewBool(true)},
   374  			2,
   375  			[]string{o.Id, p.Id},
   376  		},
   377  		{
   378  			"Search for all 3 teams filter by group constrained false and open invite false",
   379  			&model.TeamSearch{Term: "searchterm", GroupConstrained: model.NewBool(false), AllowOpenInvite: model.NewBool(false)},
   380  			2,
   381  			[]string{p.Id, o.Id},
   382  		},
   383  		{
   384  			"Search for teams which are not part of a data retention policy",
   385  			&model.TeamSearch{Term: "", ExcludePolicyConstrained: model.NewBool(true)},
   386  			3,
   387  			[]string{o.Id, p.Id, g.Id},
   388  		},
   389  	}
   390  
   391  	for _, tc := range testCases {
   392  		t.Run(tc.Name, func(t *testing.T) {
   393  			response, err := ss.Team().SearchAll(tc.Opts)
   394  			require.NoError(t, err)
   395  			require.Equal(t, tc.ExpectedLenth, len(response))
   396  			responseTeamIds := []string{}
   397  			for _, team := range response {
   398  				responseTeamIds = append(responseTeamIds, team.Id)
   399  			}
   400  			require.ElementsMatch(t, tc.ExpectedTeamIds, responseTeamIds)
   401  		})
   402  	}
   403  }
   404  
   405  func testTeamStoreSearchOpen(t *testing.T, ss store.Store) {
   406  	o := model.Team{}
   407  	o.DisplayName = "ADisplayName" + NewTestId()
   408  	o.Name = NewTestId()
   409  	o.Email = MakeEmail()
   410  	o.Type = model.TEAM_OPEN
   411  	o.AllowOpenInvite = true
   412  
   413  	_, err := ss.Team().Save(&o)
   414  	require.NoError(t, err)
   415  
   416  	p := model.Team{}
   417  	p.DisplayName = "ADisplayName" + NewTestId()
   418  	p.Name = NewTestId()
   419  	p.Email = MakeEmail()
   420  	p.Type = model.TEAM_OPEN
   421  	p.AllowOpenInvite = false
   422  
   423  	_, err = ss.Team().Save(&p)
   424  	require.NoError(t, err)
   425  
   426  	q := model.Team{}
   427  	q.DisplayName = "PINEAPPLEPIE"
   428  	q.Name = "ihadsomepineapplepiewithstrawberry"
   429  	q.Email = MakeEmail()
   430  	q.Type = model.TEAM_OPEN
   431  	q.AllowOpenInvite = true
   432  
   433  	_, err = ss.Team().Save(&q)
   434  	require.NoError(t, err)
   435  
   436  	testCases := []struct {
   437  		Name            string
   438  		Term            string
   439  		ExpectedLength  int
   440  		ExpectedFirstId string
   441  	}{
   442  		{
   443  			"Search PINEAPPLEPIE by display name",
   444  			"neapplep",
   445  			1,
   446  			q.Id,
   447  		},
   448  		{
   449  			"Search PINEAPPLEPIE by display name",
   450  			"pine",
   451  			1,
   452  			q.Id,
   453  		},
   454  		{
   455  			"Search PINEAPPLEPIE by display name",
   456  			"epie",
   457  			1,
   458  			q.Id,
   459  		},
   460  		{
   461  			"Search PINEAPPLEPIE by  name",
   462  			"ihadsome",
   463  			1,
   464  			q.Id,
   465  		},
   466  		{
   467  			"Search PINEAPPLEPIE by  name",
   468  			"pineapplepiewithstrawberry",
   469  			1,
   470  			q.Id,
   471  		},
   472  		{
   473  			"Search for open team name",
   474  			o.Name,
   475  			1,
   476  			o.Id,
   477  		},
   478  		{
   479  			"Search for open team displayName",
   480  			o.DisplayName,
   481  			1,
   482  			o.Id,
   483  		},
   484  		{
   485  			"Search for open team without results",
   486  			"notexists",
   487  			0,
   488  			"",
   489  		},
   490  		{
   491  			"Search for a private team (expected no results)",
   492  			p.DisplayName,
   493  			0,
   494  			"",
   495  		},
   496  	}
   497  
   498  	for _, tc := range testCases {
   499  		t.Run(tc.Name, func(t *testing.T) {
   500  			r1, err := ss.Team().SearchOpen(&model.TeamSearch{Term: tc.Term})
   501  			require.NoError(t, err)
   502  			results := r1
   503  			require.Equal(t, tc.ExpectedLength, len(results))
   504  			if tc.ExpectedFirstId != "" {
   505  				assert.Equal(t, tc.ExpectedFirstId, results[0].Id)
   506  			}
   507  		})
   508  	}
   509  }
   510  
   511  func testTeamStoreSearchPrivate(t *testing.T, ss store.Store) {
   512  	o := model.Team{}
   513  	o.DisplayName = "ADisplayName" + NewTestId()
   514  	o.Name = NewTestId()
   515  	o.Email = MakeEmail()
   516  	o.Type = model.TEAM_OPEN
   517  	o.AllowOpenInvite = true
   518  
   519  	_, err := ss.Team().Save(&o)
   520  	require.NoError(t, err)
   521  
   522  	p := model.Team{}
   523  	p.DisplayName = "ADisplayName" + NewTestId()
   524  	p.Name = NewTestId()
   525  	p.Email = MakeEmail()
   526  	p.Type = model.TEAM_OPEN
   527  	p.AllowOpenInvite = false
   528  
   529  	_, err = ss.Team().Save(&p)
   530  	require.NoError(t, err)
   531  
   532  	q := model.Team{}
   533  	q.DisplayName = "FOOBARDISPLAYNAME"
   534  	q.Name = "averylongname"
   535  	q.Email = MakeEmail()
   536  	q.Type = model.TEAM_OPEN
   537  	q.AllowOpenInvite = false
   538  
   539  	_, err = ss.Team().Save(&q)
   540  	require.NoError(t, err)
   541  
   542  	testCases := []struct {
   543  		Name            string
   544  		Term            string
   545  		ExpectedLength  int
   546  		ExpectedFirstId string
   547  	}{
   548  		{
   549  			"Search FooBar by display name from text in the middle of display name",
   550  			"oobardisplay",
   551  			1,
   552  			q.Id,
   553  		},
   554  		{
   555  			"Search FooBar by display name from text at the beginning of display name",
   556  			"foobar",
   557  			1,
   558  			q.Id,
   559  		},
   560  		{
   561  			"Search FooBar by display name from text at the end of display name",
   562  			"bardisplayname",
   563  			1,
   564  			q.Id,
   565  		},
   566  		{
   567  			"Search FooBar by  name from text at the beginning name",
   568  			"averyl",
   569  			1,
   570  			q.Id,
   571  		},
   572  		{
   573  			"Search FooBar by  name from text at the end of name",
   574  			"ongname",
   575  			1,
   576  			q.Id,
   577  		},
   578  		{
   579  			"Search for private team name",
   580  			p.Name,
   581  			1,
   582  			p.Id,
   583  		},
   584  		{
   585  			"Search for private team displayName",
   586  			p.DisplayName,
   587  			1,
   588  			p.Id,
   589  		},
   590  		{
   591  			"Search for private team without results",
   592  			"notexists",
   593  			0,
   594  			"",
   595  		},
   596  		{
   597  			"Search for a open team (expected no results)",
   598  			o.DisplayName,
   599  			0,
   600  			"",
   601  		},
   602  	}
   603  
   604  	for _, tc := range testCases {
   605  		t.Run(tc.Name, func(t *testing.T) {
   606  			r1, err := ss.Team().SearchPrivate(&model.TeamSearch{Term: tc.Term})
   607  			require.NoError(t, err)
   608  			results := r1
   609  			require.Equal(t, tc.ExpectedLength, len(results))
   610  			if tc.ExpectedFirstId != "" {
   611  				assert.Equal(t, tc.ExpectedFirstId, results[0].Id)
   612  			}
   613  		})
   614  	}
   615  }
   616  
   617  func testTeamStoreGetByInviteId(t *testing.T, ss store.Store) {
   618  	o1 := model.Team{}
   619  	o1.DisplayName = "DisplayName"
   620  	o1.Name = NewTestId()
   621  	o1.Email = MakeEmail()
   622  	o1.Type = model.TEAM_OPEN
   623  	o1.InviteId = model.NewId()
   624  
   625  	save1, err := ss.Team().Save(&o1)
   626  	require.NoError(t, err)
   627  
   628  	o2 := model.Team{}
   629  	o2.DisplayName = "DisplayName"
   630  	o2.Name = NewTestId()
   631  	o2.Email = MakeEmail()
   632  	o2.Type = model.TEAM_OPEN
   633  
   634  	r1, err := ss.Team().GetByInviteId(save1.InviteId)
   635  	require.NoError(t, err)
   636  	require.Equal(t, *r1, o1, "invalid returned team")
   637  
   638  	_, err = ss.Team().GetByInviteId("")
   639  	require.Error(t, err, "Missing id should have failed")
   640  }
   641  
   642  func testTeamStoreByUserId(t *testing.T, ss store.Store) {
   643  	o1 := &model.Team{}
   644  	o1.DisplayName = "DisplayName"
   645  	o1.Name = NewTestId()
   646  	o1.Email = MakeEmail()
   647  	o1.Type = model.TEAM_OPEN
   648  	o1.InviteId = model.NewId()
   649  	o1, err := ss.Team().Save(o1)
   650  	require.NoError(t, err)
   651  
   652  	m1 := &model.TeamMember{TeamId: o1.Id, UserId: model.NewId()}
   653  	_, nErr := ss.Team().SaveMember(m1, -1)
   654  	require.NoError(t, nErr)
   655  
   656  	teams, err := ss.Team().GetTeamsByUserId(m1.UserId)
   657  	require.NoError(t, err)
   658  	require.Len(t, teams, 1, "Should return a team")
   659  	require.Equal(t, teams[0].Id, o1.Id, "should be a member")
   660  }
   661  
   662  func testTeamStoreGetAllPage(t *testing.T, ss store.Store) {
   663  	o := model.Team{}
   664  	o.DisplayName = "ADisplayName" + model.NewId()
   665  	o.Name = "zz" + model.NewId() + "a"
   666  	o.Email = MakeEmail()
   667  	o.Type = model.TEAM_OPEN
   668  	o.AllowOpenInvite = true
   669  	_, err := ss.Team().Save(&o)
   670  	require.NoError(t, err)
   671  
   672  	policy, err := ss.RetentionPolicy().Save(&model.RetentionPolicyWithTeamAndChannelIDs{
   673  		RetentionPolicy: model.RetentionPolicy{
   674  			DisplayName:  "Policy 1",
   675  			PostDuration: model.NewInt64(30),
   676  		},
   677  		TeamIDs: []string{o.Id},
   678  	})
   679  	require.NoError(t, err)
   680  
   681  	// Without ExcludePolicyConstrained
   682  	teams, err := ss.Team().GetAllPage(0, 100, nil)
   683  	require.NoError(t, err)
   684  	found := false
   685  	for _, team := range teams {
   686  		if team.Id == o.Id {
   687  			found = true
   688  			require.Nil(t, team.PolicyID)
   689  			break
   690  		}
   691  	}
   692  	require.True(t, found)
   693  
   694  	// With ExcludePolicyConstrained
   695  	teams, err = ss.Team().GetAllPage(0, 100, &model.TeamSearch{ExcludePolicyConstrained: model.NewBool(true)})
   696  	require.NoError(t, err)
   697  	found = false
   698  	for _, team := range teams {
   699  		if team.Id == o.Id {
   700  			found = true
   701  			break
   702  		}
   703  	}
   704  	require.False(t, found)
   705  
   706  	// With policy ID
   707  	teams, err = ss.Team().GetAllPage(0, 100, &model.TeamSearch{IncludePolicyID: model.NewBool(true)})
   708  	require.NoError(t, err)
   709  	found = false
   710  	for _, team := range teams {
   711  		if team.Id == o.Id {
   712  			found = true
   713  			require.Equal(t, *team.PolicyID, policy.ID)
   714  			break
   715  		}
   716  	}
   717  	require.True(t, found)
   718  }
   719  
   720  func testGetAllTeamListing(t *testing.T, ss store.Store) {
   721  	o1 := model.Team{}
   722  	o1.DisplayName = "DisplayName"
   723  	o1.Name = NewTestId()
   724  	o1.Email = MakeEmail()
   725  	o1.Type = model.TEAM_OPEN
   726  	o1.AllowOpenInvite = true
   727  	_, err := ss.Team().Save(&o1)
   728  	require.NoError(t, err)
   729  
   730  	o2 := model.Team{}
   731  	o2.DisplayName = "DisplayName"
   732  	o2.Name = NewTestId()
   733  	o2.Email = MakeEmail()
   734  	o2.Type = model.TEAM_OPEN
   735  	_, err = ss.Team().Save(&o2)
   736  	require.NoError(t, err)
   737  
   738  	o3 := model.Team{}
   739  	o3.DisplayName = "DisplayName"
   740  	o3.Name = NewTestId()
   741  	o3.Email = MakeEmail()
   742  	o3.Type = model.TEAM_INVITE
   743  	o3.AllowOpenInvite = true
   744  	_, err = ss.Team().Save(&o3)
   745  	require.NoError(t, err)
   746  
   747  	o4 := model.Team{}
   748  	o4.DisplayName = "DisplayName"
   749  	o4.Name = NewTestId()
   750  	o4.Email = MakeEmail()
   751  	o4.Type = model.TEAM_INVITE
   752  	_, err = ss.Team().Save(&o4)
   753  	require.NoError(t, err)
   754  
   755  	teams, err := ss.Team().GetAllTeamListing()
   756  	require.NoError(t, err)
   757  	for _, team := range teams {
   758  		require.True(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as true")
   759  	}
   760  
   761  	require.NotEmpty(t, teams, "failed team listing")
   762  }
   763  
   764  func testGetAllTeamPageListing(t *testing.T, ss store.Store) {
   765  	o1 := model.Team{}
   766  	o1.DisplayName = "DisplayName"
   767  	o1.Name = NewTestId()
   768  	o1.Email = MakeEmail()
   769  	o1.Type = model.TEAM_OPEN
   770  	o1.AllowOpenInvite = true
   771  	_, err := ss.Team().Save(&o1)
   772  	require.NoError(t, err)
   773  
   774  	o2 := model.Team{}
   775  	o2.DisplayName = "DisplayName"
   776  	o2.Name = NewTestId()
   777  	o2.Email = MakeEmail()
   778  	o2.Type = model.TEAM_OPEN
   779  	o2.AllowOpenInvite = false
   780  	_, err = ss.Team().Save(&o2)
   781  	require.NoError(t, err)
   782  
   783  	o3 := model.Team{}
   784  	o3.DisplayName = "DisplayName"
   785  	o3.Name = NewTestId()
   786  	o3.Email = MakeEmail()
   787  	o3.Type = model.TEAM_INVITE
   788  	o3.AllowOpenInvite = true
   789  	_, err = ss.Team().Save(&o3)
   790  	require.NoError(t, err)
   791  
   792  	o4 := model.Team{}
   793  	o4.DisplayName = "DisplayName"
   794  	o4.Name = NewTestId()
   795  	o4.Email = MakeEmail()
   796  	o4.Type = model.TEAM_INVITE
   797  	o4.AllowOpenInvite = false
   798  	_, err = ss.Team().Save(&o4)
   799  	require.NoError(t, err)
   800  
   801  	opts := &model.TeamSearch{AllowOpenInvite: model.NewBool(true)}
   802  
   803  	teams, err := ss.Team().GetAllPage(0, 10, opts)
   804  	require.NoError(t, err)
   805  
   806  	for _, team := range teams {
   807  		require.True(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as true")
   808  	}
   809  
   810  	require.LessOrEqual(t, len(teams), 10, "should have returned max of 10 teams")
   811  
   812  	o5 := model.Team{}
   813  	o5.DisplayName = "DisplayName"
   814  	o5.Name = NewTestId()
   815  	o5.Email = MakeEmail()
   816  	o5.Type = model.TEAM_OPEN
   817  	o5.AllowOpenInvite = true
   818  	_, err = ss.Team().Save(&o5)
   819  	require.NoError(t, err)
   820  
   821  	teams, err = ss.Team().GetAllPage(0, 4, opts)
   822  	require.NoError(t, err)
   823  
   824  	for _, team := range teams {
   825  		require.True(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as true")
   826  	}
   827  
   828  	require.LessOrEqual(t, len(teams), 4, "should have returned max of 4 teams")
   829  
   830  	teams, err = ss.Team().GetAllPage(1, 1, opts)
   831  	require.NoError(t, err)
   832  
   833  	for _, team := range teams {
   834  		require.True(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as true")
   835  	}
   836  
   837  	require.LessOrEqual(t, len(teams), 1, "should have returned max of 1 team")
   838  }
   839  
   840  func testGetAllPrivateTeamListing(t *testing.T, ss store.Store) {
   841  	o1 := model.Team{}
   842  	o1.DisplayName = "DisplayName"
   843  	o1.Name = NewTestId()
   844  	o1.Email = MakeEmail()
   845  	o1.Type = model.TEAM_OPEN
   846  	o1.AllowOpenInvite = true
   847  	_, err := ss.Team().Save(&o1)
   848  	require.NoError(t, err)
   849  
   850  	o2 := model.Team{}
   851  	o2.DisplayName = "DisplayName"
   852  	o2.Name = NewTestId()
   853  	o2.Email = MakeEmail()
   854  	o2.Type = model.TEAM_OPEN
   855  	_, err = ss.Team().Save(&o2)
   856  	require.NoError(t, err)
   857  
   858  	o3 := model.Team{}
   859  	o3.DisplayName = "DisplayName"
   860  	o3.Name = NewTestId()
   861  	o3.Email = MakeEmail()
   862  	o3.Type = model.TEAM_INVITE
   863  	o3.AllowOpenInvite = true
   864  	_, err = ss.Team().Save(&o3)
   865  	require.NoError(t, err)
   866  
   867  	o4 := model.Team{}
   868  	o4.DisplayName = "DisplayName"
   869  	o4.Name = NewTestId()
   870  	o4.Email = MakeEmail()
   871  	o4.Type = model.TEAM_INVITE
   872  	_, err = ss.Team().Save(&o4)
   873  	require.NoError(t, err)
   874  
   875  	teams, err := ss.Team().GetAllPrivateTeamListing()
   876  	require.NoError(t, err)
   877  	require.NotEmpty(t, teams, "failed team listing")
   878  
   879  	for _, team := range teams {
   880  		require.False(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as false")
   881  	}
   882  }
   883  
   884  func testGetAllPrivateTeamPageListing(t *testing.T, ss store.Store) {
   885  	o1 := model.Team{}
   886  	o1.DisplayName = "DisplayName"
   887  	o1.Name = NewTestId()
   888  	o1.Email = MakeEmail()
   889  	o1.Type = model.TEAM_OPEN
   890  	o1.AllowOpenInvite = true
   891  	_, err := ss.Team().Save(&o1)
   892  	require.NoError(t, err)
   893  
   894  	o2 := model.Team{}
   895  	o2.DisplayName = "DisplayName"
   896  	o2.Name = NewTestId()
   897  	o2.Email = MakeEmail()
   898  	o2.Type = model.TEAM_OPEN
   899  	o2.AllowOpenInvite = false
   900  	_, err = ss.Team().Save(&o2)
   901  	require.NoError(t, err)
   902  
   903  	o3 := model.Team{}
   904  	o3.DisplayName = "DisplayName"
   905  	o3.Name = NewTestId()
   906  	o3.Email = MakeEmail()
   907  	o3.Type = model.TEAM_INVITE
   908  	o3.AllowOpenInvite = true
   909  	_, err = ss.Team().Save(&o3)
   910  	require.NoError(t, err)
   911  
   912  	o4 := model.Team{}
   913  	o4.DisplayName = "DisplayName"
   914  	o4.Name = NewTestId()
   915  	o4.Email = MakeEmail()
   916  	o4.Type = model.TEAM_INVITE
   917  	o4.AllowOpenInvite = false
   918  	_, err = ss.Team().Save(&o4)
   919  	require.NoError(t, err)
   920  
   921  	opts := &model.TeamSearch{AllowOpenInvite: model.NewBool(false)}
   922  
   923  	teams, listErr := ss.Team().GetAllPage(0, 10, opts)
   924  	require.NoError(t, listErr)
   925  	for _, team := range teams {
   926  		require.False(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as false")
   927  	}
   928  
   929  	require.LessOrEqual(t, len(teams), 10, "should have returned max of 10 teams")
   930  
   931  	o5 := model.Team{}
   932  	o5.DisplayName = "DisplayName"
   933  	o5.Name = NewTestId()
   934  	o5.Email = MakeEmail()
   935  	o5.Type = model.TEAM_OPEN
   936  	o5.AllowOpenInvite = true
   937  	_, err = ss.Team().Save(&o5)
   938  	require.NoError(t, err)
   939  
   940  	teams, listErr = ss.Team().GetAllPage(0, 4, opts)
   941  	require.NoError(t, listErr)
   942  	for _, team := range teams {
   943  		require.False(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as false")
   944  	}
   945  
   946  	require.LessOrEqual(t, len(teams), 4, "should have returned max of 4 teams")
   947  
   948  	teams, listErr = ss.Team().GetAllPage(1, 1, opts)
   949  	require.NoError(t, listErr)
   950  	for _, team := range teams {
   951  		require.False(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as false")
   952  	}
   953  
   954  	require.LessOrEqual(t, len(teams), 1, "should have returned max of 1 team")
   955  }
   956  
   957  func testGetAllPublicTeamPageListing(t *testing.T, ss store.Store) {
   958  	cleanupTeamStore(t, ss)
   959  
   960  	o1 := model.Team{}
   961  	o1.DisplayName = "DisplayName1"
   962  	o1.Name = NewTestId()
   963  	o1.Email = MakeEmail()
   964  	o1.Type = model.TEAM_OPEN
   965  	o1.AllowOpenInvite = true
   966  	t1, err := ss.Team().Save(&o1)
   967  	require.NoError(t, err)
   968  
   969  	o2 := model.Team{}
   970  	o2.DisplayName = "DisplayName2"
   971  	o2.Name = NewTestId()
   972  	o2.Email = MakeEmail()
   973  	o2.Type = model.TEAM_OPEN
   974  	o2.AllowOpenInvite = false
   975  	_, err = ss.Team().Save(&o2)
   976  	require.NoError(t, err)
   977  
   978  	o3 := model.Team{}
   979  	o3.DisplayName = "DisplayName3"
   980  	o3.Name = NewTestId()
   981  	o3.Email = MakeEmail()
   982  	o3.Type = model.TEAM_INVITE
   983  	o3.AllowOpenInvite = true
   984  	t3, err := ss.Team().Save(&o3)
   985  	require.NoError(t, err)
   986  
   987  	o4 := model.Team{}
   988  	o4.DisplayName = "DisplayName4"
   989  	o4.Name = NewTestId()
   990  	o4.Email = MakeEmail()
   991  	o4.Type = model.TEAM_INVITE
   992  	o4.AllowOpenInvite = false
   993  	_, err = ss.Team().Save(&o4)
   994  	require.NoError(t, err)
   995  
   996  	opts := &model.TeamSearch{AllowOpenInvite: model.NewBool(true)}
   997  
   998  	teams, err := ss.Team().GetAllPage(0, 10, opts)
   999  	assert.NoError(t, err)
  1000  	assert.Equal(t, []*model.Team{t1, t3}, teams)
  1001  
  1002  	o5 := model.Team{}
  1003  	o5.DisplayName = "DisplayName5"
  1004  	o5.Name = NewTestId()
  1005  	o5.Email = MakeEmail()
  1006  	o5.Type = model.TEAM_OPEN
  1007  	o5.AllowOpenInvite = true
  1008  	t5, err := ss.Team().Save(&o5)
  1009  	require.NoError(t, err)
  1010  
  1011  	teams, err = ss.Team().GetAllPage(0, 4, opts)
  1012  	assert.NoError(t, err)
  1013  	assert.Equal(t, []*model.Team{t1, t3, t5}, teams)
  1014  
  1015  	_, err = ss.Team().GetAllPage(1, 1, opts)
  1016  	assert.NoError(t, err)
  1017  }
  1018  
  1019  func testDelete(t *testing.T, ss store.Store) {
  1020  	o1 := model.Team{}
  1021  	o1.DisplayName = "DisplayName"
  1022  	o1.Name = NewTestId()
  1023  	o1.Email = MakeEmail()
  1024  	o1.Type = model.TEAM_OPEN
  1025  	o1.AllowOpenInvite = true
  1026  	_, err := ss.Team().Save(&o1)
  1027  	require.NoError(t, err)
  1028  
  1029  	o2 := model.Team{}
  1030  	o2.DisplayName = "DisplayName"
  1031  	o2.Name = NewTestId()
  1032  	o2.Email = MakeEmail()
  1033  	o2.Type = model.TEAM_OPEN
  1034  	_, err = ss.Team().Save(&o2)
  1035  	require.NoError(t, err)
  1036  
  1037  	r1 := ss.Team().PermanentDelete(o1.Id)
  1038  	require.NoError(t, r1)
  1039  }
  1040  
  1041  func testPublicTeamCount(t *testing.T, ss store.Store) {
  1042  	cleanupTeamStore(t, ss)
  1043  
  1044  	o1 := model.Team{}
  1045  	o1.DisplayName = "DisplayName"
  1046  	o1.Name = NewTestId()
  1047  	o1.Email = MakeEmail()
  1048  	o1.Type = model.TEAM_OPEN
  1049  	o1.AllowOpenInvite = true
  1050  	_, err := ss.Team().Save(&o1)
  1051  	require.NoError(t, err)
  1052  
  1053  	o2 := model.Team{}
  1054  	o2.DisplayName = "DisplayName"
  1055  	o2.Name = NewTestId()
  1056  	o2.Email = MakeEmail()
  1057  	o2.Type = model.TEAM_OPEN
  1058  	o2.AllowOpenInvite = false
  1059  	_, err = ss.Team().Save(&o2)
  1060  	require.NoError(t, err)
  1061  
  1062  	o3 := model.Team{}
  1063  	o3.DisplayName = "DisplayName"
  1064  	o3.Name = NewTestId()
  1065  	o3.Email = MakeEmail()
  1066  	o3.Type = model.TEAM_OPEN
  1067  	o3.AllowOpenInvite = true
  1068  	_, err = ss.Team().Save(&o3)
  1069  	require.NoError(t, err)
  1070  
  1071  	teamCount, err := ss.Team().AnalyticsTeamCount(&model.TeamSearch{AllowOpenInvite: model.NewBool(true)})
  1072  	require.NoError(t, err)
  1073  	require.Equal(t, int64(2), teamCount, "should only be 1 team")
  1074  }
  1075  
  1076  func testPrivateTeamCount(t *testing.T, ss store.Store) {
  1077  	cleanupTeamStore(t, ss)
  1078  
  1079  	o1 := model.Team{}
  1080  	o1.DisplayName = "DisplayName"
  1081  	o1.Name = NewTestId()
  1082  	o1.Email = MakeEmail()
  1083  	o1.Type = model.TEAM_OPEN
  1084  	o1.AllowOpenInvite = false
  1085  	_, err := ss.Team().Save(&o1)
  1086  	require.NoError(t, err)
  1087  
  1088  	o2 := model.Team{}
  1089  	o2.DisplayName = "DisplayName"
  1090  	o2.Name = NewTestId()
  1091  	o2.Email = MakeEmail()
  1092  	o2.Type = model.TEAM_OPEN
  1093  	o2.AllowOpenInvite = true
  1094  	_, err = ss.Team().Save(&o2)
  1095  	require.NoError(t, err)
  1096  
  1097  	o3 := model.Team{}
  1098  	o3.DisplayName = "DisplayName"
  1099  	o3.Name = NewTestId()
  1100  	o3.Email = MakeEmail()
  1101  	o3.Type = model.TEAM_OPEN
  1102  	o3.AllowOpenInvite = false
  1103  	_, err = ss.Team().Save(&o3)
  1104  	require.NoError(t, err)
  1105  
  1106  	teamCount, err := ss.Team().AnalyticsTeamCount(&model.TeamSearch{AllowOpenInvite: model.NewBool(false)})
  1107  	require.NoError(t, err)
  1108  	require.Equal(t, int64(2), teamCount, "should only be 1 team")
  1109  }
  1110  
  1111  func testTeamCount(t *testing.T, ss store.Store) {
  1112  	o1 := model.Team{}
  1113  	o1.DisplayName = "DisplayName"
  1114  	o1.Name = NewTestId()
  1115  	o1.Email = MakeEmail()
  1116  	o1.Type = model.TEAM_OPEN
  1117  	o1.AllowOpenInvite = true
  1118  	team, err := ss.Team().Save(&o1)
  1119  	require.NoError(t, err)
  1120  
  1121  	// not including deleted teams
  1122  	teamCount, err := ss.Team().AnalyticsTeamCount(nil)
  1123  	require.NoError(t, err)
  1124  	require.NotEqual(t, 0, int(teamCount), "should be at least 1 team")
  1125  
  1126  	// delete the team for the next check
  1127  	team.DeleteAt = model.GetMillis()
  1128  	_, err = ss.Team().Update(team)
  1129  	require.NoError(t, err)
  1130  
  1131  	// get the count of teams not including deleted
  1132  	countNotIncludingDeleted, err := ss.Team().AnalyticsTeamCount(nil)
  1133  	require.NoError(t, err)
  1134  
  1135  	// get the count of teams including deleted
  1136  	countIncludingDeleted, err := ss.Team().AnalyticsTeamCount(&model.TeamSearch{IncludeDeleted: model.NewBool(true)})
  1137  	require.NoError(t, err)
  1138  
  1139  	// count including deleted should be one greater than not including deleted
  1140  	require.Equal(t, countNotIncludingDeleted+1, countIncludingDeleted)
  1141  }
  1142  
  1143  func testGetMembers(t *testing.T, ss store.Store) {
  1144  	// Each user should have a mention count of exactly 1 in the DB at this point.
  1145  	t.Run("Test GetMembers Order By UserID", func(t *testing.T) {
  1146  		teamId1 := model.NewId()
  1147  		teamId2 := model.NewId()
  1148  
  1149  		m1 := &model.TeamMember{TeamId: teamId1, UserId: "55555555555555555555555555"}
  1150  		m2 := &model.TeamMember{TeamId: teamId1, UserId: "11111111111111111111111111"}
  1151  		m3 := &model.TeamMember{TeamId: teamId1, UserId: "33333333333333333333333333"}
  1152  		m4 := &model.TeamMember{TeamId: teamId1, UserId: "22222222222222222222222222"}
  1153  		m5 := &model.TeamMember{TeamId: teamId1, UserId: "44444444444444444444444444"}
  1154  		m6 := &model.TeamMember{TeamId: teamId2, UserId: "00000000000000000000000000"}
  1155  
  1156  		_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4, m5, m6}, -1)
  1157  		require.NoError(t, nErr)
  1158  
  1159  		// Gets users ordered by UserId
  1160  		ms, err := ss.Team().GetMembers(teamId1, 0, 100, nil)
  1161  		require.NoError(t, err)
  1162  		assert.Len(t, ms, 5)
  1163  		assert.Equal(t, "11111111111111111111111111", ms[0].UserId)
  1164  		assert.Equal(t, "22222222222222222222222222", ms[1].UserId)
  1165  		assert.Equal(t, "33333333333333333333333333", ms[2].UserId)
  1166  		assert.Equal(t, "44444444444444444444444444", ms[3].UserId)
  1167  		assert.Equal(t, "55555555555555555555555555", ms[4].UserId)
  1168  	})
  1169  
  1170  	t.Run("Test GetMembers Order By Username And Exclude Deleted Members", func(t *testing.T) {
  1171  		teamId1 := model.NewId()
  1172  		teamId2 := model.NewId()
  1173  
  1174  		u1 := &model.User{Username: "a", Email: MakeEmail(), DeleteAt: int64(1)}
  1175  		u2 := &model.User{Username: "c", Email: MakeEmail()}
  1176  		u3 := &model.User{Username: "b", Email: MakeEmail(), DeleteAt: int64(1)}
  1177  		u4 := &model.User{Username: "f", Email: MakeEmail()}
  1178  		u5 := &model.User{Username: "e", Email: MakeEmail(), DeleteAt: int64(1)}
  1179  		u6 := &model.User{Username: "d", Email: MakeEmail()}
  1180  
  1181  		u1, err := ss.User().Save(u1)
  1182  		require.NoError(t, err)
  1183  		u2, err = ss.User().Save(u2)
  1184  		require.NoError(t, err)
  1185  		u3, err = ss.User().Save(u3)
  1186  		require.NoError(t, err)
  1187  		u4, err = ss.User().Save(u4)
  1188  		require.NoError(t, err)
  1189  		u5, err = ss.User().Save(u5)
  1190  		require.NoError(t, err)
  1191  		u6, err = ss.User().Save(u6)
  1192  		require.NoError(t, err)
  1193  
  1194  		m1 := &model.TeamMember{TeamId: teamId1, UserId: u1.Id}
  1195  		m2 := &model.TeamMember{TeamId: teamId1, UserId: u2.Id}
  1196  		m3 := &model.TeamMember{TeamId: teamId1, UserId: u3.Id}
  1197  		m4 := &model.TeamMember{TeamId: teamId1, UserId: u4.Id}
  1198  		m5 := &model.TeamMember{TeamId: teamId1, UserId: u5.Id}
  1199  		m6 := &model.TeamMember{TeamId: teamId2, UserId: u6.Id}
  1200  
  1201  		_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4, m5, m6}, -1)
  1202  		require.NoError(t, nErr)
  1203  
  1204  		// Gets users ordered by UserName
  1205  		ms, nErr := ss.Team().GetMembers(teamId1, 0, 100, &model.TeamMembersGetOptions{Sort: model.USERNAME})
  1206  		require.NoError(t, nErr)
  1207  		assert.Len(t, ms, 5)
  1208  		assert.Equal(t, u1.Id, ms[0].UserId)
  1209  		assert.Equal(t, u3.Id, ms[1].UserId)
  1210  		assert.Equal(t, u2.Id, ms[2].UserId)
  1211  		assert.Equal(t, u5.Id, ms[3].UserId)
  1212  		assert.Equal(t, u4.Id, ms[4].UserId)
  1213  
  1214  		// Gets users ordered by UserName and excludes deleted members
  1215  		ms, nErr = ss.Team().GetMembers(teamId1, 0, 100, &model.TeamMembersGetOptions{Sort: model.USERNAME, ExcludeDeletedUsers: true})
  1216  		require.NoError(t, nErr)
  1217  		assert.Len(t, ms, 2)
  1218  		assert.Equal(t, u2.Id, ms[0].UserId)
  1219  		assert.Equal(t, u4.Id, ms[1].UserId)
  1220  	})
  1221  
  1222  	t.Run("Test GetMembers Excluded Deleted Users", func(t *testing.T) {
  1223  		teamId1 := model.NewId()
  1224  		teamId2 := model.NewId()
  1225  
  1226  		u1 := &model.User{Email: MakeEmail()}
  1227  		u2 := &model.User{Email: MakeEmail(), DeleteAt: int64(1)}
  1228  		u3 := &model.User{Email: MakeEmail()}
  1229  		u4 := &model.User{Email: MakeEmail(), DeleteAt: int64(3)}
  1230  		u5 := &model.User{Email: MakeEmail()}
  1231  		u6 := &model.User{Email: MakeEmail(), DeleteAt: int64(5)}
  1232  
  1233  		u1, err := ss.User().Save(u1)
  1234  		require.NoError(t, err)
  1235  		u2, err = ss.User().Save(u2)
  1236  		require.NoError(t, err)
  1237  		u3, err = ss.User().Save(u3)
  1238  		require.NoError(t, err)
  1239  		u4, err = ss.User().Save(u4)
  1240  		require.NoError(t, err)
  1241  		u5, err = ss.User().Save(u5)
  1242  		require.NoError(t, err)
  1243  		u6, err = ss.User().Save(u6)
  1244  		require.NoError(t, err)
  1245  
  1246  		m1 := &model.TeamMember{TeamId: teamId1, UserId: u1.Id}
  1247  		m2 := &model.TeamMember{TeamId: teamId1, UserId: u2.Id}
  1248  		m3 := &model.TeamMember{TeamId: teamId1, UserId: u3.Id}
  1249  		m4 := &model.TeamMember{TeamId: teamId1, UserId: u4.Id}
  1250  		m5 := &model.TeamMember{TeamId: teamId1, UserId: u5.Id}
  1251  		m6 := &model.TeamMember{TeamId: teamId2, UserId: u6.Id}
  1252  
  1253  		t1, nErr := ss.Team().SaveMember(m1, -1)
  1254  		require.NoError(t, nErr)
  1255  		_, nErr = ss.Team().SaveMember(m2, -1)
  1256  		require.NoError(t, nErr)
  1257  		t3, nErr := ss.Team().SaveMember(m3, -1)
  1258  		require.NoError(t, nErr)
  1259  		_, nErr = ss.Team().SaveMember(m4, -1)
  1260  		require.NoError(t, nErr)
  1261  		t5, nErr := ss.Team().SaveMember(m5, -1)
  1262  		require.NoError(t, nErr)
  1263  		_, nErr = ss.Team().SaveMember(m6, -1)
  1264  		require.NoError(t, nErr)
  1265  
  1266  		// Gets users ordered by UserName
  1267  		ms, nErr := ss.Team().GetMembers(teamId1, 0, 100, &model.TeamMembersGetOptions{ExcludeDeletedUsers: true})
  1268  		require.NoError(t, nErr)
  1269  		assert.Len(t, ms, 3)
  1270  		require.ElementsMatch(t, ms, [3]*model.TeamMember{t1, t3, t5})
  1271  	})
  1272  }
  1273  
  1274  func testTeamMembers(t *testing.T, ss store.Store) {
  1275  	teamId1 := model.NewId()
  1276  	teamId2 := model.NewId()
  1277  
  1278  	m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
  1279  	m2 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
  1280  	m3 := &model.TeamMember{TeamId: teamId2, UserId: model.NewId()}
  1281  
  1282  	_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3}, -1)
  1283  	require.NoError(t, nErr)
  1284  
  1285  	ms, err := ss.Team().GetMembers(teamId1, 0, 100, nil)
  1286  	require.NoError(t, err)
  1287  	assert.Len(t, ms, 2)
  1288  
  1289  	ms, err = ss.Team().GetMembers(teamId2, 0, 100, nil)
  1290  	require.NoError(t, err)
  1291  	require.Len(t, ms, 1)
  1292  	require.Equal(t, m3.UserId, ms[0].UserId)
  1293  
  1294  	ctx := context.Background()
  1295  	ms, err = ss.Team().GetTeamsForUser(ctx, m1.UserId)
  1296  	require.NoError(t, err)
  1297  	require.Len(t, ms, 1)
  1298  	require.Equal(t, m1.TeamId, ms[0].TeamId)
  1299  
  1300  	err = ss.Team().RemoveMember(teamId1, m1.UserId)
  1301  	require.NoError(t, err)
  1302  
  1303  	ms, err = ss.Team().GetMembers(teamId1, 0, 100, nil)
  1304  	require.NoError(t, err)
  1305  	require.Len(t, ms, 1)
  1306  	require.Equal(t, m2.UserId, ms[0].UserId)
  1307  
  1308  	_, nErr = ss.Team().SaveMember(m1, -1)
  1309  	require.NoError(t, nErr)
  1310  
  1311  	err = ss.Team().RemoveAllMembersByTeam(teamId1)
  1312  	require.NoError(t, err)
  1313  
  1314  	ms, err = ss.Team().GetMembers(teamId1, 0, 100, nil)
  1315  	require.NoError(t, err)
  1316  	require.Empty(t, ms)
  1317  
  1318  	uid := model.NewId()
  1319  	m4 := &model.TeamMember{TeamId: teamId1, UserId: uid}
  1320  	m5 := &model.TeamMember{TeamId: teamId2, UserId: uid}
  1321  	_, nErr = ss.Team().SaveMultipleMembers([]*model.TeamMember{m4, m5}, -1)
  1322  	require.NoError(t, nErr)
  1323  
  1324  	ms, err = ss.Team().GetTeamsForUser(ctx, uid)
  1325  	require.NoError(t, err)
  1326  	require.Len(t, ms, 2)
  1327  
  1328  	nErr = ss.Team().RemoveAllMembersByUser(uid)
  1329  	require.NoError(t, nErr)
  1330  
  1331  	ms, err = ss.Team().GetTeamsForUser(ctx, m1.UserId)
  1332  	require.NoError(t, err)
  1333  	require.Empty(t, ms)
  1334  }
  1335  
  1336  func testTeamSaveMember(t *testing.T, ss store.Store) {
  1337  	u1, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  1338  	require.NoError(t, err)
  1339  	u2, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  1340  	require.NoError(t, err)
  1341  
  1342  	t.Run("not valid team member", func(t *testing.T) {
  1343  		member := &model.TeamMember{TeamId: "wrong", UserId: u1.Id}
  1344  		_, nErr := ss.Team().SaveMember(member, -1)
  1345  		require.Error(t, nErr)
  1346  		require.Equal(t, "TeamMember.IsValid: model.team_member.is_valid.team_id.app_error, ", nErr.Error())
  1347  	})
  1348  
  1349  	t.Run("too many members", func(t *testing.T) {
  1350  		member := &model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}
  1351  		_, nErr := ss.Team().SaveMember(member, 0)
  1352  		require.Error(t, nErr)
  1353  		require.Equal(t, "limit exceeded: what: TeamMember count: 1 metadata: team members limit exceeded", nErr.Error())
  1354  	})
  1355  
  1356  	t.Run("too many members because previous existing members", func(t *testing.T) {
  1357  		teamID := model.NewId()
  1358  
  1359  		m1 := &model.TeamMember{TeamId: teamID, UserId: u1.Id}
  1360  		_, nErr := ss.Team().SaveMember(m1, 1)
  1361  		require.NoError(t, nErr)
  1362  		m2 := &model.TeamMember{TeamId: teamID, UserId: u2.Id}
  1363  		_, nErr = ss.Team().SaveMember(m2, 1)
  1364  		require.Error(t, nErr)
  1365  		require.Equal(t, "limit exceeded: what: TeamMember count: 2 metadata: team members limit exceeded", nErr.Error())
  1366  	})
  1367  
  1368  	t.Run("duplicated entries should fail", func(t *testing.T) {
  1369  		teamID1 := model.NewId()
  1370  		m1 := &model.TeamMember{TeamId: teamID1, UserId: u1.Id}
  1371  		_, nErr := ss.Team().SaveMember(m1, -1)
  1372  		require.NoError(t, nErr)
  1373  		m2 := &model.TeamMember{TeamId: teamID1, UserId: u1.Id}
  1374  		_, nErr = ss.Team().SaveMember(m2, -1)
  1375  		require.Error(t, nErr)
  1376  		require.IsType(t, &store.ErrConflict{}, nErr)
  1377  	})
  1378  
  1379  	t.Run("insert member correctly (in team without scheme)", func(t *testing.T) {
  1380  		team := &model.Team{
  1381  			DisplayName: "Name",
  1382  			Name:        NewTestId(),
  1383  			Email:       MakeEmail(),
  1384  			Type:        model.TEAM_OPEN,
  1385  		}
  1386  
  1387  		team, nErr := ss.Team().Save(team)
  1388  		require.NoError(t, nErr)
  1389  
  1390  		testCases := []struct {
  1391  			Name                  string
  1392  			SchemeGuest           bool
  1393  			SchemeUser            bool
  1394  			SchemeAdmin           bool
  1395  			ExplicitRoles         string
  1396  			ExpectedRoles         string
  1397  			ExpectedExplicitRoles string
  1398  			ExpectedSchemeGuest   bool
  1399  			ExpectedSchemeUser    bool
  1400  			ExpectedSchemeAdmin   bool
  1401  		}{
  1402  			{
  1403  				Name:               "team user implicit",
  1404  				SchemeUser:         true,
  1405  				ExpectedRoles:      "team_user",
  1406  				ExpectedSchemeUser: true,
  1407  			},
  1408  			{
  1409  				Name:               "team user explicit",
  1410  				ExplicitRoles:      "team_user",
  1411  				ExpectedRoles:      "team_user",
  1412  				ExpectedSchemeUser: true,
  1413  			},
  1414  			{
  1415  				Name:                "team guest implicit",
  1416  				SchemeGuest:         true,
  1417  				ExpectedRoles:       "team_guest",
  1418  				ExpectedSchemeGuest: true,
  1419  			},
  1420  			{
  1421  				Name:                "team guest explicit",
  1422  				ExplicitRoles:       "team_guest",
  1423  				ExpectedRoles:       "team_guest",
  1424  				ExpectedSchemeGuest: true,
  1425  			},
  1426  			{
  1427  				Name:                "team admin implicit",
  1428  				SchemeUser:          true,
  1429  				SchemeAdmin:         true,
  1430  				ExpectedRoles:       "team_user team_admin",
  1431  				ExpectedSchemeUser:  true,
  1432  				ExpectedSchemeAdmin: true,
  1433  			},
  1434  			{
  1435  				Name:                "team admin explicit",
  1436  				ExplicitRoles:       "team_user team_admin",
  1437  				ExpectedRoles:       "team_user team_admin",
  1438  				ExpectedSchemeUser:  true,
  1439  				ExpectedSchemeAdmin: true,
  1440  			},
  1441  			{
  1442  				Name:                  "team user implicit and explicit custom role",
  1443  				SchemeUser:            true,
  1444  				ExplicitRoles:         "test",
  1445  				ExpectedRoles:         "test team_user",
  1446  				ExpectedExplicitRoles: "test",
  1447  				ExpectedSchemeUser:    true,
  1448  			},
  1449  			{
  1450  				Name:                  "team user explicit and explicit custom role",
  1451  				ExplicitRoles:         "team_user test",
  1452  				ExpectedRoles:         "test team_user",
  1453  				ExpectedExplicitRoles: "test",
  1454  				ExpectedSchemeUser:    true,
  1455  			},
  1456  			{
  1457  				Name:                  "team guest implicit and explicit custom role",
  1458  				SchemeGuest:           true,
  1459  				ExplicitRoles:         "test",
  1460  				ExpectedRoles:         "test team_guest",
  1461  				ExpectedExplicitRoles: "test",
  1462  				ExpectedSchemeGuest:   true,
  1463  			},
  1464  			{
  1465  				Name:                  "team guest explicit and explicit custom role",
  1466  				ExplicitRoles:         "team_guest test",
  1467  				ExpectedRoles:         "test team_guest",
  1468  				ExpectedExplicitRoles: "test",
  1469  				ExpectedSchemeGuest:   true,
  1470  			},
  1471  			{
  1472  				Name:                  "team admin implicit and explicit custom role",
  1473  				SchemeUser:            true,
  1474  				SchemeAdmin:           true,
  1475  				ExplicitRoles:         "test",
  1476  				ExpectedRoles:         "test team_user team_admin",
  1477  				ExpectedExplicitRoles: "test",
  1478  				ExpectedSchemeUser:    true,
  1479  				ExpectedSchemeAdmin:   true,
  1480  			},
  1481  			{
  1482  				Name:                  "team admin explicit and explicit custom role",
  1483  				ExplicitRoles:         "team_user team_admin test",
  1484  				ExpectedRoles:         "test team_user team_admin",
  1485  				ExpectedExplicitRoles: "test",
  1486  				ExpectedSchemeUser:    true,
  1487  				ExpectedSchemeAdmin:   true,
  1488  			},
  1489  			{
  1490  				Name:                  "team member with only explicit custom roles",
  1491  				ExplicitRoles:         "test test2",
  1492  				ExpectedRoles:         "test test2",
  1493  				ExpectedExplicitRoles: "test test2",
  1494  			},
  1495  		}
  1496  
  1497  		for _, tc := range testCases {
  1498  			t.Run(tc.Name, func(t *testing.T) {
  1499  				member := &model.TeamMember{
  1500  					TeamId:        team.Id,
  1501  					UserId:        u1.Id,
  1502  					SchemeGuest:   tc.SchemeGuest,
  1503  					SchemeUser:    tc.SchemeUser,
  1504  					SchemeAdmin:   tc.SchemeAdmin,
  1505  					ExplicitRoles: tc.ExplicitRoles,
  1506  				}
  1507  				member, nErr := ss.Team().SaveMember(member, -1)
  1508  				require.NoError(t, nErr)
  1509  				defer ss.Team().RemoveMember(team.Id, u1.Id)
  1510  
  1511  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  1512  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  1513  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  1514  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  1515  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  1516  			})
  1517  		}
  1518  	})
  1519  
  1520  	t.Run("insert member correctly (in team with scheme)", func(t *testing.T) {
  1521  		ts := &model.Scheme{
  1522  			Name:        NewTestId(),
  1523  			DisplayName: NewTestId(),
  1524  			Description: NewTestId(),
  1525  			Scope:       model.SCHEME_SCOPE_TEAM,
  1526  		}
  1527  		ts, nErr := ss.Scheme().Save(ts)
  1528  		require.NoError(t, nErr)
  1529  
  1530  		team := &model.Team{
  1531  			DisplayName: "Name",
  1532  			Name:        NewTestId(),
  1533  			Email:       MakeEmail(),
  1534  			Type:        model.TEAM_OPEN,
  1535  			SchemeId:    &ts.Id,
  1536  		}
  1537  
  1538  		team, nErr = ss.Team().Save(team)
  1539  		require.NoError(t, nErr)
  1540  
  1541  		testCases := []struct {
  1542  			Name                  string
  1543  			SchemeGuest           bool
  1544  			SchemeUser            bool
  1545  			SchemeAdmin           bool
  1546  			ExplicitRoles         string
  1547  			ExpectedRoles         string
  1548  			ExpectedExplicitRoles string
  1549  			ExpectedSchemeGuest   bool
  1550  			ExpectedSchemeUser    bool
  1551  			ExpectedSchemeAdmin   bool
  1552  		}{
  1553  			{
  1554  				Name:               "team user implicit",
  1555  				SchemeUser:         true,
  1556  				ExpectedRoles:      ts.DefaultTeamUserRole,
  1557  				ExpectedSchemeUser: true,
  1558  			},
  1559  			{
  1560  				Name:               "team user explicit",
  1561  				ExplicitRoles:      "team_user",
  1562  				ExpectedRoles:      ts.DefaultTeamUserRole,
  1563  				ExpectedSchemeUser: true,
  1564  			},
  1565  			{
  1566  				Name:                "team guest implicit",
  1567  				SchemeGuest:         true,
  1568  				ExpectedRoles:       ts.DefaultTeamGuestRole,
  1569  				ExpectedSchemeGuest: true,
  1570  			},
  1571  			{
  1572  				Name:                "team guest explicit",
  1573  				ExplicitRoles:       "team_guest",
  1574  				ExpectedRoles:       ts.DefaultTeamGuestRole,
  1575  				ExpectedSchemeGuest: true,
  1576  			},
  1577  			{
  1578  				Name:                "team admin implicit",
  1579  				SchemeUser:          true,
  1580  				SchemeAdmin:         true,
  1581  				ExpectedRoles:       ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
  1582  				ExpectedSchemeUser:  true,
  1583  				ExpectedSchemeAdmin: true,
  1584  			},
  1585  			{
  1586  				Name:                "team admin explicit",
  1587  				ExplicitRoles:       "team_user team_admin",
  1588  				ExpectedRoles:       ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
  1589  				ExpectedSchemeUser:  true,
  1590  				ExpectedSchemeAdmin: true,
  1591  			},
  1592  			{
  1593  				Name:                  "team user implicit and explicit custom role",
  1594  				SchemeUser:            true,
  1595  				ExplicitRoles:         "test",
  1596  				ExpectedRoles:         "test " + ts.DefaultTeamUserRole,
  1597  				ExpectedExplicitRoles: "test",
  1598  				ExpectedSchemeUser:    true,
  1599  			},
  1600  			{
  1601  				Name:                  "team user explicit and explicit custom role",
  1602  				ExplicitRoles:         "team_user test",
  1603  				ExpectedRoles:         "test " + ts.DefaultTeamUserRole,
  1604  				ExpectedExplicitRoles: "test",
  1605  				ExpectedSchemeUser:    true,
  1606  			},
  1607  			{
  1608  				Name:                  "team guest implicit and explicit custom role",
  1609  				SchemeGuest:           true,
  1610  				ExplicitRoles:         "test",
  1611  				ExpectedRoles:         "test " + ts.DefaultTeamGuestRole,
  1612  				ExpectedExplicitRoles: "test",
  1613  				ExpectedSchemeGuest:   true,
  1614  			},
  1615  			{
  1616  				Name:                  "team guest explicit and explicit custom role",
  1617  				ExplicitRoles:         "team_guest test",
  1618  				ExpectedRoles:         "test " + ts.DefaultTeamGuestRole,
  1619  				ExpectedExplicitRoles: "test",
  1620  				ExpectedSchemeGuest:   true,
  1621  			},
  1622  			{
  1623  				Name:                  "team admin implicit and explicit custom role",
  1624  				SchemeUser:            true,
  1625  				SchemeAdmin:           true,
  1626  				ExplicitRoles:         "test",
  1627  				ExpectedRoles:         "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
  1628  				ExpectedExplicitRoles: "test",
  1629  				ExpectedSchemeUser:    true,
  1630  				ExpectedSchemeAdmin:   true,
  1631  			},
  1632  			{
  1633  				Name:                  "team admin explicit and explicit custom role",
  1634  				ExplicitRoles:         "team_user team_admin test",
  1635  				ExpectedRoles:         "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
  1636  				ExpectedExplicitRoles: "test",
  1637  				ExpectedSchemeUser:    true,
  1638  				ExpectedSchemeAdmin:   true,
  1639  			},
  1640  			{
  1641  				Name:                  "team member with only explicit custom roles",
  1642  				ExplicitRoles:         "test test2",
  1643  				ExpectedRoles:         "test test2",
  1644  				ExpectedExplicitRoles: "test test2",
  1645  			},
  1646  		}
  1647  
  1648  		for _, tc := range testCases {
  1649  			t.Run(tc.Name, func(t *testing.T) {
  1650  				member := &model.TeamMember{
  1651  					TeamId:        team.Id,
  1652  					UserId:        u1.Id,
  1653  					SchemeGuest:   tc.SchemeGuest,
  1654  					SchemeUser:    tc.SchemeUser,
  1655  					SchemeAdmin:   tc.SchemeAdmin,
  1656  					ExplicitRoles: tc.ExplicitRoles,
  1657  				}
  1658  				member, nErr := ss.Team().SaveMember(member, -1)
  1659  				require.NoError(t, nErr)
  1660  				defer ss.Team().RemoveMember(team.Id, u1.Id)
  1661  
  1662  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  1663  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  1664  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  1665  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  1666  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  1667  			})
  1668  		}
  1669  	})
  1670  }
  1671  
  1672  func testTeamSaveMultipleMembers(t *testing.T, ss store.Store) {
  1673  	u1, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  1674  	require.NoError(t, err)
  1675  	u2, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  1676  	require.NoError(t, err)
  1677  	u3, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  1678  	require.NoError(t, err)
  1679  	u4, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  1680  	require.NoError(t, err)
  1681  
  1682  	t.Run("any not valid team member", func(t *testing.T) {
  1683  		m1 := &model.TeamMember{TeamId: "wrong", UserId: u1.Id}
  1684  		m2 := &model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}
  1685  		_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2}, -1)
  1686  		require.Error(t, nErr)
  1687  		require.Equal(t, "TeamMember.IsValid: model.team_member.is_valid.team_id.app_error, ", nErr.Error())
  1688  	})
  1689  
  1690  	t.Run("too many members in one team", func(t *testing.T) {
  1691  		teamID := model.NewId()
  1692  		m1 := &model.TeamMember{TeamId: teamID, UserId: u1.Id}
  1693  		m2 := &model.TeamMember{TeamId: teamID, UserId: u2.Id}
  1694  		_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2}, 0)
  1695  		require.Error(t, nErr)
  1696  		require.Equal(t, "limit exceeded: what: TeamMember count: 2 metadata: team members limit exceeded", nErr.Error())
  1697  	})
  1698  
  1699  	t.Run("too many members in one team because previous existing members", func(t *testing.T) {
  1700  		teamID := model.NewId()
  1701  		m1 := &model.TeamMember{TeamId: teamID, UserId: u1.Id}
  1702  		m2 := &model.TeamMember{TeamId: teamID, UserId: u2.Id}
  1703  		m3 := &model.TeamMember{TeamId: teamID, UserId: u3.Id}
  1704  		m4 := &model.TeamMember{TeamId: teamID, UserId: u4.Id}
  1705  		_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2}, 3)
  1706  		require.NoError(t, nErr)
  1707  
  1708  		_, nErr = ss.Team().SaveMultipleMembers([]*model.TeamMember{m3, m4}, 3)
  1709  		require.Error(t, nErr)
  1710  		require.Equal(t, "limit exceeded: what: TeamMember count: 4 metadata: team members limit exceeded", nErr.Error())
  1711  	})
  1712  
  1713  	t.Run("too many members, but in different teams", func(t *testing.T) {
  1714  		teamID1 := model.NewId()
  1715  		teamID2 := model.NewId()
  1716  		m1 := &model.TeamMember{TeamId: teamID1, UserId: u1.Id}
  1717  		m2 := &model.TeamMember{TeamId: teamID1, UserId: u2.Id}
  1718  		m3 := &model.TeamMember{TeamId: teamID1, UserId: u3.Id}
  1719  		m4 := &model.TeamMember{TeamId: teamID2, UserId: u1.Id}
  1720  		m5 := &model.TeamMember{TeamId: teamID2, UserId: u2.Id}
  1721  		_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4, m5}, 2)
  1722  		require.Error(t, nErr)
  1723  		require.Equal(t, "limit exceeded: what: TeamMember count: 3 metadata: team members limit exceeded", nErr.Error())
  1724  	})
  1725  
  1726  	t.Run("duplicated entries should fail", func(t *testing.T) {
  1727  		teamID1 := model.NewId()
  1728  		m1 := &model.TeamMember{TeamId: teamID1, UserId: u1.Id}
  1729  		m2 := &model.TeamMember{TeamId: teamID1, UserId: u1.Id}
  1730  		_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2}, 10)
  1731  		require.Error(t, nErr)
  1732  		require.IsType(t, &store.ErrConflict{}, nErr)
  1733  	})
  1734  
  1735  	t.Run("insert members correctly (in team without scheme)", func(t *testing.T) {
  1736  		team := &model.Team{
  1737  			DisplayName: "Name",
  1738  			Name:        NewTestId(),
  1739  			Email:       MakeEmail(),
  1740  			Type:        model.TEAM_OPEN,
  1741  		}
  1742  
  1743  		team, nErr := ss.Team().Save(team)
  1744  		require.NoError(t, nErr)
  1745  
  1746  		testCases := []struct {
  1747  			Name                  string
  1748  			SchemeGuest           bool
  1749  			SchemeUser            bool
  1750  			SchemeAdmin           bool
  1751  			ExplicitRoles         string
  1752  			ExpectedRoles         string
  1753  			ExpectedExplicitRoles string
  1754  			ExpectedSchemeGuest   bool
  1755  			ExpectedSchemeUser    bool
  1756  			ExpectedSchemeAdmin   bool
  1757  		}{
  1758  			{
  1759  				Name:               "team user implicit",
  1760  				SchemeUser:         true,
  1761  				ExpectedRoles:      "team_user",
  1762  				ExpectedSchemeUser: true,
  1763  			},
  1764  			{
  1765  				Name:               "team user explicit",
  1766  				ExplicitRoles:      "team_user",
  1767  				ExpectedRoles:      "team_user",
  1768  				ExpectedSchemeUser: true,
  1769  			},
  1770  			{
  1771  				Name:                "team guest implicit",
  1772  				SchemeGuest:         true,
  1773  				ExpectedRoles:       "team_guest",
  1774  				ExpectedSchemeGuest: true,
  1775  			},
  1776  			{
  1777  				Name:                "team guest explicit",
  1778  				ExplicitRoles:       "team_guest",
  1779  				ExpectedRoles:       "team_guest",
  1780  				ExpectedSchemeGuest: true,
  1781  			},
  1782  			{
  1783  				Name:                "team admin implicit",
  1784  				SchemeUser:          true,
  1785  				SchemeAdmin:         true,
  1786  				ExpectedRoles:       "team_user team_admin",
  1787  				ExpectedSchemeUser:  true,
  1788  				ExpectedSchemeAdmin: true,
  1789  			},
  1790  			{
  1791  				Name:                "team admin explicit",
  1792  				ExplicitRoles:       "team_user team_admin",
  1793  				ExpectedRoles:       "team_user team_admin",
  1794  				ExpectedSchemeUser:  true,
  1795  				ExpectedSchemeAdmin: true,
  1796  			},
  1797  			{
  1798  				Name:                  "team user implicit and explicit custom role",
  1799  				SchemeUser:            true,
  1800  				ExplicitRoles:         "test",
  1801  				ExpectedRoles:         "test team_user",
  1802  				ExpectedExplicitRoles: "test",
  1803  				ExpectedSchemeUser:    true,
  1804  			},
  1805  			{
  1806  				Name:                  "team user explicit and explicit custom role",
  1807  				ExplicitRoles:         "team_user test",
  1808  				ExpectedRoles:         "test team_user",
  1809  				ExpectedExplicitRoles: "test",
  1810  				ExpectedSchemeUser:    true,
  1811  			},
  1812  			{
  1813  				Name:                  "team guest implicit and explicit custom role",
  1814  				SchemeGuest:           true,
  1815  				ExplicitRoles:         "test",
  1816  				ExpectedRoles:         "test team_guest",
  1817  				ExpectedExplicitRoles: "test",
  1818  				ExpectedSchemeGuest:   true,
  1819  			},
  1820  			{
  1821  				Name:                  "team guest explicit and explicit custom role",
  1822  				ExplicitRoles:         "team_guest test",
  1823  				ExpectedRoles:         "test team_guest",
  1824  				ExpectedExplicitRoles: "test",
  1825  				ExpectedSchemeGuest:   true,
  1826  			},
  1827  			{
  1828  				Name:                  "team admin implicit and explicit custom role",
  1829  				SchemeUser:            true,
  1830  				SchemeAdmin:           true,
  1831  				ExplicitRoles:         "test",
  1832  				ExpectedRoles:         "test team_user team_admin",
  1833  				ExpectedExplicitRoles: "test",
  1834  				ExpectedSchemeUser:    true,
  1835  				ExpectedSchemeAdmin:   true,
  1836  			},
  1837  			{
  1838  				Name:                  "team admin explicit and explicit custom role",
  1839  				ExplicitRoles:         "team_user team_admin test",
  1840  				ExpectedRoles:         "test team_user team_admin",
  1841  				ExpectedExplicitRoles: "test",
  1842  				ExpectedSchemeUser:    true,
  1843  				ExpectedSchemeAdmin:   true,
  1844  			},
  1845  			{
  1846  				Name:                  "team member with only explicit custom roles",
  1847  				ExplicitRoles:         "test test2",
  1848  				ExpectedRoles:         "test test2",
  1849  				ExpectedExplicitRoles: "test test2",
  1850  			},
  1851  		}
  1852  
  1853  		for _, tc := range testCases {
  1854  			t.Run(tc.Name, func(t *testing.T) {
  1855  				member := &model.TeamMember{
  1856  					TeamId:        team.Id,
  1857  					UserId:        u1.Id,
  1858  					SchemeGuest:   tc.SchemeGuest,
  1859  					SchemeUser:    tc.SchemeUser,
  1860  					SchemeAdmin:   tc.SchemeAdmin,
  1861  					ExplicitRoles: tc.ExplicitRoles,
  1862  				}
  1863  				otherMember := &model.TeamMember{
  1864  					TeamId:        team.Id,
  1865  					UserId:        u2.Id,
  1866  					SchemeGuest:   tc.SchemeGuest,
  1867  					SchemeUser:    tc.SchemeUser,
  1868  					SchemeAdmin:   tc.SchemeAdmin,
  1869  					ExplicitRoles: tc.ExplicitRoles,
  1870  				}
  1871  				var members []*model.TeamMember
  1872  				members, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{member, otherMember}, -1)
  1873  				require.NoError(t, nErr)
  1874  				require.Len(t, members, 2)
  1875  				member = members[0]
  1876  				defer ss.Team().RemoveMember(team.Id, u1.Id)
  1877  				defer ss.Team().RemoveMember(team.Id, u2.Id)
  1878  
  1879  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  1880  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  1881  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  1882  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  1883  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  1884  			})
  1885  		}
  1886  	})
  1887  
  1888  	t.Run("insert members correctly (in team with scheme)", func(t *testing.T) {
  1889  		ts := &model.Scheme{
  1890  			Name:        NewTestId(),
  1891  			DisplayName: NewTestId(),
  1892  			Description: NewTestId(),
  1893  			Scope:       model.SCHEME_SCOPE_TEAM,
  1894  		}
  1895  		ts, nErr := ss.Scheme().Save(ts)
  1896  		require.NoError(t, nErr)
  1897  
  1898  		team := &model.Team{
  1899  			DisplayName: "Name",
  1900  			Name:        NewTestId(),
  1901  			Email:       MakeEmail(),
  1902  			Type:        model.TEAM_OPEN,
  1903  			SchemeId:    &ts.Id,
  1904  		}
  1905  
  1906  		team, nErr = ss.Team().Save(team)
  1907  		require.NoError(t, nErr)
  1908  
  1909  		testCases := []struct {
  1910  			Name                  string
  1911  			SchemeGuest           bool
  1912  			SchemeUser            bool
  1913  			SchemeAdmin           bool
  1914  			ExplicitRoles         string
  1915  			ExpectedRoles         string
  1916  			ExpectedExplicitRoles string
  1917  			ExpectedSchemeGuest   bool
  1918  			ExpectedSchemeUser    bool
  1919  			ExpectedSchemeAdmin   bool
  1920  		}{
  1921  			{
  1922  				Name:               "team user implicit",
  1923  				SchemeUser:         true,
  1924  				ExpectedRoles:      ts.DefaultTeamUserRole,
  1925  				ExpectedSchemeUser: true,
  1926  			},
  1927  			{
  1928  				Name:               "team user explicit",
  1929  				ExplicitRoles:      "team_user",
  1930  				ExpectedRoles:      ts.DefaultTeamUserRole,
  1931  				ExpectedSchemeUser: true,
  1932  			},
  1933  			{
  1934  				Name:                "team guest implicit",
  1935  				SchemeGuest:         true,
  1936  				ExpectedRoles:       ts.DefaultTeamGuestRole,
  1937  				ExpectedSchemeGuest: true,
  1938  			},
  1939  			{
  1940  				Name:                "team guest explicit",
  1941  				ExplicitRoles:       "team_guest",
  1942  				ExpectedRoles:       ts.DefaultTeamGuestRole,
  1943  				ExpectedSchemeGuest: true,
  1944  			},
  1945  			{
  1946  				Name:                "team admin implicit",
  1947  				SchemeUser:          true,
  1948  				SchemeAdmin:         true,
  1949  				ExpectedRoles:       ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
  1950  				ExpectedSchemeUser:  true,
  1951  				ExpectedSchemeAdmin: true,
  1952  			},
  1953  			{
  1954  				Name:                "team admin explicit",
  1955  				ExplicitRoles:       "team_user team_admin",
  1956  				ExpectedRoles:       ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
  1957  				ExpectedSchemeUser:  true,
  1958  				ExpectedSchemeAdmin: true,
  1959  			},
  1960  			{
  1961  				Name:                  "team user implicit and explicit custom role",
  1962  				SchemeUser:            true,
  1963  				ExplicitRoles:         "test",
  1964  				ExpectedRoles:         "test " + ts.DefaultTeamUserRole,
  1965  				ExpectedExplicitRoles: "test",
  1966  				ExpectedSchemeUser:    true,
  1967  			},
  1968  			{
  1969  				Name:                  "team user explicit and explicit custom role",
  1970  				ExplicitRoles:         "team_user test",
  1971  				ExpectedRoles:         "test " + ts.DefaultTeamUserRole,
  1972  				ExpectedExplicitRoles: "test",
  1973  				ExpectedSchemeUser:    true,
  1974  			},
  1975  			{
  1976  				Name:                  "team guest implicit and explicit custom role",
  1977  				SchemeGuest:           true,
  1978  				ExplicitRoles:         "test",
  1979  				ExpectedRoles:         "test " + ts.DefaultTeamGuestRole,
  1980  				ExpectedExplicitRoles: "test",
  1981  				ExpectedSchemeGuest:   true,
  1982  			},
  1983  			{
  1984  				Name:                  "team guest explicit and explicit custom role",
  1985  				ExplicitRoles:         "team_guest test",
  1986  				ExpectedRoles:         "test " + ts.DefaultTeamGuestRole,
  1987  				ExpectedExplicitRoles: "test",
  1988  				ExpectedSchemeGuest:   true,
  1989  			},
  1990  			{
  1991  				Name:                  "team admin implicit and explicit custom role",
  1992  				SchemeUser:            true,
  1993  				SchemeAdmin:           true,
  1994  				ExplicitRoles:         "test",
  1995  				ExpectedRoles:         "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
  1996  				ExpectedExplicitRoles: "test",
  1997  				ExpectedSchemeUser:    true,
  1998  				ExpectedSchemeAdmin:   true,
  1999  			},
  2000  			{
  2001  				Name:                  "team admin explicit and explicit custom role",
  2002  				ExplicitRoles:         "team_user team_admin test",
  2003  				ExpectedRoles:         "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
  2004  				ExpectedExplicitRoles: "test",
  2005  				ExpectedSchemeUser:    true,
  2006  				ExpectedSchemeAdmin:   true,
  2007  			},
  2008  			{
  2009  				Name:                  "team member with only explicit custom roles",
  2010  				ExplicitRoles:         "test test2",
  2011  				ExpectedRoles:         "test test2",
  2012  				ExpectedExplicitRoles: "test test2",
  2013  			},
  2014  		}
  2015  
  2016  		for _, tc := range testCases {
  2017  			t.Run(tc.Name, func(t *testing.T) {
  2018  				member := &model.TeamMember{
  2019  					TeamId:        team.Id,
  2020  					UserId:        u1.Id,
  2021  					SchemeGuest:   tc.SchemeGuest,
  2022  					SchemeUser:    tc.SchemeUser,
  2023  					SchemeAdmin:   tc.SchemeAdmin,
  2024  					ExplicitRoles: tc.ExplicitRoles,
  2025  				}
  2026  				otherMember := &model.TeamMember{
  2027  					TeamId:        team.Id,
  2028  					UserId:        u2.Id,
  2029  					SchemeGuest:   tc.SchemeGuest,
  2030  					SchemeUser:    tc.SchemeUser,
  2031  					SchemeAdmin:   tc.SchemeAdmin,
  2032  					ExplicitRoles: tc.ExplicitRoles,
  2033  				}
  2034  				members, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{member, otherMember}, -1)
  2035  				require.NoError(t, nErr)
  2036  				require.Len(t, members, 2)
  2037  				member = members[0]
  2038  				defer ss.Team().RemoveMember(team.Id, u1.Id)
  2039  				defer ss.Team().RemoveMember(team.Id, u2.Id)
  2040  
  2041  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  2042  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  2043  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  2044  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  2045  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  2046  			})
  2047  		}
  2048  	})
  2049  }
  2050  
  2051  func testTeamUpdateMember(t *testing.T, ss store.Store) {
  2052  	u1, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  2053  	require.NoError(t, err)
  2054  
  2055  	t.Run("not valid team member", func(t *testing.T) {
  2056  		member := &model.TeamMember{TeamId: "wrong", UserId: u1.Id}
  2057  		_, nErr := ss.Team().UpdateMember(member)
  2058  		require.Error(t, nErr)
  2059  		var appErr *model.AppError
  2060  		require.True(t, errors.As(nErr, &appErr))
  2061  		require.Equal(t, "model.team_member.is_valid.team_id.app_error", appErr.Id)
  2062  	})
  2063  
  2064  	t.Run("insert member correctly (in team without scheme)", func(t *testing.T) {
  2065  		team := &model.Team{
  2066  			DisplayName: "Name",
  2067  			Name:        NewTestId(),
  2068  			Email:       MakeEmail(),
  2069  			Type:        model.TEAM_OPEN,
  2070  		}
  2071  
  2072  		team, nErr := ss.Team().Save(team)
  2073  		require.NoError(t, nErr)
  2074  
  2075  		member := &model.TeamMember{TeamId: team.Id, UserId: u1.Id}
  2076  		member, nErr = ss.Team().SaveMember(member, -1)
  2077  		require.NoError(t, nErr)
  2078  
  2079  		testCases := []struct {
  2080  			Name                  string
  2081  			SchemeGuest           bool
  2082  			SchemeUser            bool
  2083  			SchemeAdmin           bool
  2084  			ExplicitRoles         string
  2085  			ExpectedRoles         string
  2086  			ExpectedExplicitRoles string
  2087  			ExpectedSchemeGuest   bool
  2088  			ExpectedSchemeUser    bool
  2089  			ExpectedSchemeAdmin   bool
  2090  		}{
  2091  			{
  2092  				Name:               "team user implicit",
  2093  				SchemeUser:         true,
  2094  				ExpectedRoles:      "team_user",
  2095  				ExpectedSchemeUser: true,
  2096  			},
  2097  			{
  2098  				Name:               "team user explicit",
  2099  				ExplicitRoles:      "team_user",
  2100  				ExpectedRoles:      "team_user",
  2101  				ExpectedSchemeUser: true,
  2102  			},
  2103  			{
  2104  				Name:                "team guest implicit",
  2105  				SchemeGuest:         true,
  2106  				ExpectedRoles:       "team_guest",
  2107  				ExpectedSchemeGuest: true,
  2108  			},
  2109  			{
  2110  				Name:                "team guest explicit",
  2111  				ExplicitRoles:       "team_guest",
  2112  				ExpectedRoles:       "team_guest",
  2113  				ExpectedSchemeGuest: true,
  2114  			},
  2115  			{
  2116  				Name:                "team admin implicit",
  2117  				SchemeUser:          true,
  2118  				SchemeAdmin:         true,
  2119  				ExpectedRoles:       "team_user team_admin",
  2120  				ExpectedSchemeUser:  true,
  2121  				ExpectedSchemeAdmin: true,
  2122  			},
  2123  			{
  2124  				Name:                "team admin explicit",
  2125  				ExplicitRoles:       "team_user team_admin",
  2126  				ExpectedRoles:       "team_user team_admin",
  2127  				ExpectedSchemeUser:  true,
  2128  				ExpectedSchemeAdmin: true,
  2129  			},
  2130  			{
  2131  				Name:                  "team user implicit and explicit custom role",
  2132  				SchemeUser:            true,
  2133  				ExplicitRoles:         "test",
  2134  				ExpectedRoles:         "test team_user",
  2135  				ExpectedExplicitRoles: "test",
  2136  				ExpectedSchemeUser:    true,
  2137  			},
  2138  			{
  2139  				Name:                  "team user explicit and explicit custom role",
  2140  				ExplicitRoles:         "team_user test",
  2141  				ExpectedRoles:         "test team_user",
  2142  				ExpectedExplicitRoles: "test",
  2143  				ExpectedSchemeUser:    true,
  2144  			},
  2145  			{
  2146  				Name:                  "team guest implicit and explicit custom role",
  2147  				SchemeGuest:           true,
  2148  				ExplicitRoles:         "test",
  2149  				ExpectedRoles:         "test team_guest",
  2150  				ExpectedExplicitRoles: "test",
  2151  				ExpectedSchemeGuest:   true,
  2152  			},
  2153  			{
  2154  				Name:                  "team guest explicit and explicit custom role",
  2155  				ExplicitRoles:         "team_guest test",
  2156  				ExpectedRoles:         "test team_guest",
  2157  				ExpectedExplicitRoles: "test",
  2158  				ExpectedSchemeGuest:   true,
  2159  			},
  2160  			{
  2161  				Name:                  "team admin implicit and explicit custom role",
  2162  				SchemeUser:            true,
  2163  				SchemeAdmin:           true,
  2164  				ExplicitRoles:         "test",
  2165  				ExpectedRoles:         "test team_user team_admin",
  2166  				ExpectedExplicitRoles: "test",
  2167  				ExpectedSchemeUser:    true,
  2168  				ExpectedSchemeAdmin:   true,
  2169  			},
  2170  			{
  2171  				Name:                  "team admin explicit and explicit custom role",
  2172  				ExplicitRoles:         "team_user team_admin test",
  2173  				ExpectedRoles:         "test team_user team_admin",
  2174  				ExpectedExplicitRoles: "test",
  2175  				ExpectedSchemeUser:    true,
  2176  				ExpectedSchemeAdmin:   true,
  2177  			},
  2178  			{
  2179  				Name:                  "team member with only explicit custom roles",
  2180  				ExplicitRoles:         "test test2",
  2181  				ExpectedRoles:         "test test2",
  2182  				ExpectedExplicitRoles: "test test2",
  2183  			},
  2184  		}
  2185  
  2186  		for _, tc := range testCases {
  2187  			t.Run(tc.Name, func(t *testing.T) {
  2188  				member.SchemeGuest = tc.SchemeGuest
  2189  				member.SchemeUser = tc.SchemeUser
  2190  				member.SchemeAdmin = tc.SchemeAdmin
  2191  				member.ExplicitRoles = tc.ExplicitRoles
  2192  
  2193  				member, nErr = ss.Team().UpdateMember(member)
  2194  				require.NoError(t, nErr)
  2195  
  2196  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  2197  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  2198  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  2199  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  2200  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  2201  			})
  2202  		}
  2203  	})
  2204  
  2205  	t.Run("insert member correctly (in team with scheme)", func(t *testing.T) {
  2206  		ts := &model.Scheme{
  2207  			Name:        NewTestId(),
  2208  			DisplayName: NewTestId(),
  2209  			Description: NewTestId(),
  2210  			Scope:       model.SCHEME_SCOPE_TEAM,
  2211  		}
  2212  		ts, nErr := ss.Scheme().Save(ts)
  2213  		require.NoError(t, nErr)
  2214  
  2215  		team := &model.Team{
  2216  			DisplayName: "Name",
  2217  			Name:        NewTestId(),
  2218  			Email:       MakeEmail(),
  2219  			Type:        model.TEAM_OPEN,
  2220  			SchemeId:    &ts.Id,
  2221  		}
  2222  
  2223  		team, nErr = ss.Team().Save(team)
  2224  		require.NoError(t, nErr)
  2225  
  2226  		member := &model.TeamMember{TeamId: team.Id, UserId: u1.Id}
  2227  		member, nErr = ss.Team().SaveMember(member, -1)
  2228  		require.NoError(t, nErr)
  2229  
  2230  		testCases := []struct {
  2231  			Name                  string
  2232  			SchemeGuest           bool
  2233  			SchemeUser            bool
  2234  			SchemeAdmin           bool
  2235  			ExplicitRoles         string
  2236  			ExpectedRoles         string
  2237  			ExpectedExplicitRoles string
  2238  			ExpectedSchemeGuest   bool
  2239  			ExpectedSchemeUser    bool
  2240  			ExpectedSchemeAdmin   bool
  2241  		}{
  2242  			{
  2243  				Name:               "team user implicit",
  2244  				SchemeUser:         true,
  2245  				ExpectedRoles:      ts.DefaultTeamUserRole,
  2246  				ExpectedSchemeUser: true,
  2247  			},
  2248  			{
  2249  				Name:               "team user explicit",
  2250  				ExplicitRoles:      "team_user",
  2251  				ExpectedRoles:      ts.DefaultTeamUserRole,
  2252  				ExpectedSchemeUser: true,
  2253  			},
  2254  			{
  2255  				Name:                "team guest implicit",
  2256  				SchemeGuest:         true,
  2257  				ExpectedRoles:       ts.DefaultTeamGuestRole,
  2258  				ExpectedSchemeGuest: true,
  2259  			},
  2260  			{
  2261  				Name:                "team guest explicit",
  2262  				ExplicitRoles:       "team_guest",
  2263  				ExpectedRoles:       ts.DefaultTeamGuestRole,
  2264  				ExpectedSchemeGuest: true,
  2265  			},
  2266  			{
  2267  				Name:                "team admin implicit",
  2268  				SchemeUser:          true,
  2269  				SchemeAdmin:         true,
  2270  				ExpectedRoles:       ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
  2271  				ExpectedSchemeUser:  true,
  2272  				ExpectedSchemeAdmin: true,
  2273  			},
  2274  			{
  2275  				Name:                "team admin explicit",
  2276  				ExplicitRoles:       "team_user team_admin",
  2277  				ExpectedRoles:       ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
  2278  				ExpectedSchemeUser:  true,
  2279  				ExpectedSchemeAdmin: true,
  2280  			},
  2281  			{
  2282  				Name:                  "team user implicit and explicit custom role",
  2283  				SchemeUser:            true,
  2284  				ExplicitRoles:         "test",
  2285  				ExpectedRoles:         "test " + ts.DefaultTeamUserRole,
  2286  				ExpectedExplicitRoles: "test",
  2287  				ExpectedSchemeUser:    true,
  2288  			},
  2289  			{
  2290  				Name:                  "team user explicit and explicit custom role",
  2291  				ExplicitRoles:         "team_user test",
  2292  				ExpectedRoles:         "test " + ts.DefaultTeamUserRole,
  2293  				ExpectedExplicitRoles: "test",
  2294  				ExpectedSchemeUser:    true,
  2295  			},
  2296  			{
  2297  				Name:                  "team guest implicit and explicit custom role",
  2298  				SchemeGuest:           true,
  2299  				ExplicitRoles:         "test",
  2300  				ExpectedRoles:         "test " + ts.DefaultTeamGuestRole,
  2301  				ExpectedExplicitRoles: "test",
  2302  				ExpectedSchemeGuest:   true,
  2303  			},
  2304  			{
  2305  				Name:                  "team guest explicit and explicit custom role",
  2306  				ExplicitRoles:         "team_guest test",
  2307  				ExpectedRoles:         "test " + ts.DefaultTeamGuestRole,
  2308  				ExpectedExplicitRoles: "test",
  2309  				ExpectedSchemeGuest:   true,
  2310  			},
  2311  			{
  2312  				Name:                  "team admin implicit and explicit custom role",
  2313  				SchemeUser:            true,
  2314  				SchemeAdmin:           true,
  2315  				ExplicitRoles:         "test",
  2316  				ExpectedRoles:         "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
  2317  				ExpectedExplicitRoles: "test",
  2318  				ExpectedSchemeUser:    true,
  2319  				ExpectedSchemeAdmin:   true,
  2320  			},
  2321  			{
  2322  				Name:                  "team admin explicit and explicit custom role",
  2323  				ExplicitRoles:         "team_user team_admin test",
  2324  				ExpectedRoles:         "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
  2325  				ExpectedExplicitRoles: "test",
  2326  				ExpectedSchemeUser:    true,
  2327  				ExpectedSchemeAdmin:   true,
  2328  			},
  2329  			{
  2330  				Name:                  "team member with only explicit custom roles",
  2331  				ExplicitRoles:         "test test2",
  2332  				ExpectedRoles:         "test test2",
  2333  				ExpectedExplicitRoles: "test test2",
  2334  			},
  2335  		}
  2336  
  2337  		for _, tc := range testCases {
  2338  			t.Run(tc.Name, func(t *testing.T) {
  2339  				member.SchemeGuest = tc.SchemeGuest
  2340  				member.SchemeUser = tc.SchemeUser
  2341  				member.SchemeAdmin = tc.SchemeAdmin
  2342  				member.ExplicitRoles = tc.ExplicitRoles
  2343  
  2344  				member, nErr = ss.Team().UpdateMember(member)
  2345  				require.NoError(t, nErr)
  2346  
  2347  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  2348  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  2349  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  2350  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  2351  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  2352  			})
  2353  		}
  2354  	})
  2355  }
  2356  
  2357  func testTeamUpdateMultipleMembers(t *testing.T, ss store.Store) {
  2358  	u1, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  2359  	require.NoError(t, err)
  2360  	u2, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  2361  	require.NoError(t, err)
  2362  
  2363  	t.Run("any not valid team member", func(t *testing.T) {
  2364  		m1 := &model.TeamMember{TeamId: "wrong", UserId: u1.Id}
  2365  		m2 := &model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}
  2366  		_, nErr := ss.Team().UpdateMultipleMembers([]*model.TeamMember{m1, m2})
  2367  		require.Error(t, nErr)
  2368  		var appErr *model.AppError
  2369  		require.True(t, errors.As(nErr, &appErr))
  2370  		require.Equal(t, "model.team_member.is_valid.team_id.app_error", appErr.Id)
  2371  	})
  2372  
  2373  	t.Run("update members correctly (in team without scheme)", func(t *testing.T) {
  2374  		team := &model.Team{
  2375  			DisplayName: "Name",
  2376  			Name:        NewTestId(),
  2377  			Email:       MakeEmail(),
  2378  			Type:        model.TEAM_OPEN,
  2379  		}
  2380  
  2381  		team, nErr := ss.Team().Save(team)
  2382  		require.NoError(t, nErr)
  2383  
  2384  		member := &model.TeamMember{TeamId: team.Id, UserId: u1.Id}
  2385  		otherMember := &model.TeamMember{TeamId: team.Id, UserId: u2.Id}
  2386  		var members []*model.TeamMember
  2387  		members, nErr = ss.Team().SaveMultipleMembers([]*model.TeamMember{member, otherMember}, -1)
  2388  		require.NoError(t, nErr)
  2389  		require.Len(t, members, 2)
  2390  		member = members[0]
  2391  		otherMember = members[1]
  2392  
  2393  		testCases := []struct {
  2394  			Name                  string
  2395  			SchemeGuest           bool
  2396  			SchemeUser            bool
  2397  			SchemeAdmin           bool
  2398  			ExplicitRoles         string
  2399  			ExpectedRoles         string
  2400  			ExpectedExplicitRoles string
  2401  			ExpectedSchemeGuest   bool
  2402  			ExpectedSchemeUser    bool
  2403  			ExpectedSchemeAdmin   bool
  2404  		}{
  2405  			{
  2406  				Name:               "team user implicit",
  2407  				SchemeUser:         true,
  2408  				ExpectedRoles:      "team_user",
  2409  				ExpectedSchemeUser: true,
  2410  			},
  2411  			{
  2412  				Name:               "team user explicit",
  2413  				ExplicitRoles:      "team_user",
  2414  				ExpectedRoles:      "team_user",
  2415  				ExpectedSchemeUser: true,
  2416  			},
  2417  			{
  2418  				Name:                "team guest implicit",
  2419  				SchemeGuest:         true,
  2420  				ExpectedRoles:       "team_guest",
  2421  				ExpectedSchemeGuest: true,
  2422  			},
  2423  			{
  2424  				Name:                "team guest explicit",
  2425  				ExplicitRoles:       "team_guest",
  2426  				ExpectedRoles:       "team_guest",
  2427  				ExpectedSchemeGuest: true,
  2428  			},
  2429  			{
  2430  				Name:                "team admin implicit",
  2431  				SchemeUser:          true,
  2432  				SchemeAdmin:         true,
  2433  				ExpectedRoles:       "team_user team_admin",
  2434  				ExpectedSchemeUser:  true,
  2435  				ExpectedSchemeAdmin: true,
  2436  			},
  2437  			{
  2438  				Name:                "team admin explicit",
  2439  				ExplicitRoles:       "team_user team_admin",
  2440  				ExpectedRoles:       "team_user team_admin",
  2441  				ExpectedSchemeUser:  true,
  2442  				ExpectedSchemeAdmin: true,
  2443  			},
  2444  			{
  2445  				Name:                  "team user implicit and explicit custom role",
  2446  				SchemeUser:            true,
  2447  				ExplicitRoles:         "test",
  2448  				ExpectedRoles:         "test team_user",
  2449  				ExpectedExplicitRoles: "test",
  2450  				ExpectedSchemeUser:    true,
  2451  			},
  2452  			{
  2453  				Name:                  "team user explicit and explicit custom role",
  2454  				ExplicitRoles:         "team_user test",
  2455  				ExpectedRoles:         "test team_user",
  2456  				ExpectedExplicitRoles: "test",
  2457  				ExpectedSchemeUser:    true,
  2458  			},
  2459  			{
  2460  				Name:                  "team guest implicit and explicit custom role",
  2461  				SchemeGuest:           true,
  2462  				ExplicitRoles:         "test",
  2463  				ExpectedRoles:         "test team_guest",
  2464  				ExpectedExplicitRoles: "test",
  2465  				ExpectedSchemeGuest:   true,
  2466  			},
  2467  			{
  2468  				Name:                  "team guest explicit and explicit custom role",
  2469  				ExplicitRoles:         "team_guest test",
  2470  				ExpectedRoles:         "test team_guest",
  2471  				ExpectedExplicitRoles: "test",
  2472  				ExpectedSchemeGuest:   true,
  2473  			},
  2474  			{
  2475  				Name:                  "team admin implicit and explicit custom role",
  2476  				SchemeUser:            true,
  2477  				SchemeAdmin:           true,
  2478  				ExplicitRoles:         "test",
  2479  				ExpectedRoles:         "test team_user team_admin",
  2480  				ExpectedExplicitRoles: "test",
  2481  				ExpectedSchemeUser:    true,
  2482  				ExpectedSchemeAdmin:   true,
  2483  			},
  2484  			{
  2485  				Name:                  "team admin explicit and explicit custom role",
  2486  				ExplicitRoles:         "team_user team_admin test",
  2487  				ExpectedRoles:         "test team_user team_admin",
  2488  				ExpectedExplicitRoles: "test",
  2489  				ExpectedSchemeUser:    true,
  2490  				ExpectedSchemeAdmin:   true,
  2491  			},
  2492  			{
  2493  				Name:                  "team member with only explicit custom roles",
  2494  				ExplicitRoles:         "test test2",
  2495  				ExpectedRoles:         "test test2",
  2496  				ExpectedExplicitRoles: "test test2",
  2497  			},
  2498  		}
  2499  
  2500  		for _, tc := range testCases {
  2501  			t.Run(tc.Name, func(t *testing.T) {
  2502  				member.SchemeGuest = tc.SchemeGuest
  2503  				member.SchemeUser = tc.SchemeUser
  2504  				member.SchemeAdmin = tc.SchemeAdmin
  2505  				member.ExplicitRoles = tc.ExplicitRoles
  2506  
  2507  				var members []*model.TeamMember
  2508  				members, nErr = ss.Team().UpdateMultipleMembers([]*model.TeamMember{member, otherMember})
  2509  				require.NoError(t, nErr)
  2510  				require.Len(t, members, 2)
  2511  				member = members[0]
  2512  
  2513  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  2514  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  2515  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  2516  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  2517  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  2518  			})
  2519  		}
  2520  	})
  2521  
  2522  	t.Run("insert members correctly (in team with scheme)", func(t *testing.T) {
  2523  		ts := &model.Scheme{
  2524  			Name:        NewTestId(),
  2525  			DisplayName: NewTestId(),
  2526  			Description: NewTestId(),
  2527  			Scope:       model.SCHEME_SCOPE_TEAM,
  2528  		}
  2529  		ts, nErr := ss.Scheme().Save(ts)
  2530  		require.NoError(t, nErr)
  2531  
  2532  		team := &model.Team{
  2533  			DisplayName: "Name",
  2534  			Name:        NewTestId(),
  2535  			Email:       MakeEmail(),
  2536  			Type:        model.TEAM_OPEN,
  2537  			SchemeId:    &ts.Id,
  2538  		}
  2539  
  2540  		team, nErr = ss.Team().Save(team)
  2541  		require.NoError(t, nErr)
  2542  
  2543  		member := &model.TeamMember{TeamId: team.Id, UserId: u1.Id}
  2544  		otherMember := &model.TeamMember{TeamId: team.Id, UserId: u2.Id}
  2545  		members, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{member, otherMember}, -1)
  2546  		require.NoError(t, nErr)
  2547  		require.Len(t, members, 2)
  2548  		member = members[0]
  2549  		otherMember = members[1]
  2550  
  2551  		testCases := []struct {
  2552  			Name                  string
  2553  			SchemeGuest           bool
  2554  			SchemeUser            bool
  2555  			SchemeAdmin           bool
  2556  			ExplicitRoles         string
  2557  			ExpectedRoles         string
  2558  			ExpectedExplicitRoles string
  2559  			ExpectedSchemeGuest   bool
  2560  			ExpectedSchemeUser    bool
  2561  			ExpectedSchemeAdmin   bool
  2562  		}{
  2563  			{
  2564  				Name:               "team user implicit",
  2565  				SchemeUser:         true,
  2566  				ExpectedRoles:      ts.DefaultTeamUserRole,
  2567  				ExpectedSchemeUser: true,
  2568  			},
  2569  			{
  2570  				Name:               "team user explicit",
  2571  				ExplicitRoles:      "team_user",
  2572  				ExpectedRoles:      ts.DefaultTeamUserRole,
  2573  				ExpectedSchemeUser: true,
  2574  			},
  2575  			{
  2576  				Name:                "team guest implicit",
  2577  				SchemeGuest:         true,
  2578  				ExpectedRoles:       ts.DefaultTeamGuestRole,
  2579  				ExpectedSchemeGuest: true,
  2580  			},
  2581  			{
  2582  				Name:                "team guest explicit",
  2583  				ExplicitRoles:       "team_guest",
  2584  				ExpectedRoles:       ts.DefaultTeamGuestRole,
  2585  				ExpectedSchemeGuest: true,
  2586  			},
  2587  			{
  2588  				Name:                "team admin implicit",
  2589  				SchemeUser:          true,
  2590  				SchemeAdmin:         true,
  2591  				ExpectedRoles:       ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
  2592  				ExpectedSchemeUser:  true,
  2593  				ExpectedSchemeAdmin: true,
  2594  			},
  2595  			{
  2596  				Name:                "team admin explicit",
  2597  				ExplicitRoles:       "team_user team_admin",
  2598  				ExpectedRoles:       ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
  2599  				ExpectedSchemeUser:  true,
  2600  				ExpectedSchemeAdmin: true,
  2601  			},
  2602  			{
  2603  				Name:                  "team user implicit and explicit custom role",
  2604  				SchemeUser:            true,
  2605  				ExplicitRoles:         "test",
  2606  				ExpectedRoles:         "test " + ts.DefaultTeamUserRole,
  2607  				ExpectedExplicitRoles: "test",
  2608  				ExpectedSchemeUser:    true,
  2609  			},
  2610  			{
  2611  				Name:                  "team user explicit and explicit custom role",
  2612  				ExplicitRoles:         "team_user test",
  2613  				ExpectedRoles:         "test " + ts.DefaultTeamUserRole,
  2614  				ExpectedExplicitRoles: "test",
  2615  				ExpectedSchemeUser:    true,
  2616  			},
  2617  			{
  2618  				Name:                  "team guest implicit and explicit custom role",
  2619  				SchemeGuest:           true,
  2620  				ExplicitRoles:         "test",
  2621  				ExpectedRoles:         "test " + ts.DefaultTeamGuestRole,
  2622  				ExpectedExplicitRoles: "test",
  2623  				ExpectedSchemeGuest:   true,
  2624  			},
  2625  			{
  2626  				Name:                  "team guest explicit and explicit custom role",
  2627  				ExplicitRoles:         "team_guest test",
  2628  				ExpectedRoles:         "test " + ts.DefaultTeamGuestRole,
  2629  				ExpectedExplicitRoles: "test",
  2630  				ExpectedSchemeGuest:   true,
  2631  			},
  2632  			{
  2633  				Name:                  "team admin implicit and explicit custom role",
  2634  				SchemeUser:            true,
  2635  				SchemeAdmin:           true,
  2636  				ExplicitRoles:         "test",
  2637  				ExpectedRoles:         "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
  2638  				ExpectedExplicitRoles: "test",
  2639  				ExpectedSchemeUser:    true,
  2640  				ExpectedSchemeAdmin:   true,
  2641  			},
  2642  			{
  2643  				Name:                  "team admin explicit and explicit custom role",
  2644  				ExplicitRoles:         "team_user team_admin test",
  2645  				ExpectedRoles:         "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
  2646  				ExpectedExplicitRoles: "test",
  2647  				ExpectedSchemeUser:    true,
  2648  				ExpectedSchemeAdmin:   true,
  2649  			},
  2650  			{
  2651  				Name:                  "team member with only explicit custom roles",
  2652  				ExplicitRoles:         "test test2",
  2653  				ExpectedRoles:         "test test2",
  2654  				ExpectedExplicitRoles: "test test2",
  2655  			},
  2656  		}
  2657  
  2658  		for _, tc := range testCases {
  2659  			t.Run(tc.Name, func(t *testing.T) {
  2660  				member.SchemeGuest = tc.SchemeGuest
  2661  				member.SchemeUser = tc.SchemeUser
  2662  				member.SchemeAdmin = tc.SchemeAdmin
  2663  				member.ExplicitRoles = tc.ExplicitRoles
  2664  
  2665  				members, err := ss.Team().UpdateMultipleMembers([]*model.TeamMember{member, otherMember})
  2666  				require.NoError(t, err)
  2667  				require.Len(t, members, 2)
  2668  				member = members[0]
  2669  
  2670  				assert.Equal(t, tc.ExpectedRoles, member.Roles)
  2671  				assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
  2672  				assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
  2673  				assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
  2674  				assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
  2675  			})
  2676  		}
  2677  	})
  2678  }
  2679  
  2680  func testTeamRemoveMember(t *testing.T, ss store.Store) {
  2681  	u1, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  2682  	require.NoError(t, err)
  2683  	u2, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  2684  	require.NoError(t, err)
  2685  	u3, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  2686  	require.NoError(t, err)
  2687  	u4, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  2688  	require.NoError(t, err)
  2689  	teamID := model.NewId()
  2690  	m1 := &model.TeamMember{TeamId: teamID, UserId: u1.Id}
  2691  	m2 := &model.TeamMember{TeamId: teamID, UserId: u2.Id}
  2692  	m3 := &model.TeamMember{TeamId: teamID, UserId: u3.Id}
  2693  	m4 := &model.TeamMember{TeamId: teamID, UserId: u4.Id}
  2694  	_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4}, -1)
  2695  	require.NoError(t, nErr)
  2696  
  2697  	t.Run("remove member from not existing team", func(t *testing.T) {
  2698  		nErr = ss.Team().RemoveMember("not-existing-team", u1.Id)
  2699  		require.NoError(t, nErr)
  2700  		var membersOtherTeam []*model.TeamMember
  2701  		membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil)
  2702  		require.NoError(t, nErr)
  2703  		require.Len(t, membersOtherTeam, 4)
  2704  	})
  2705  
  2706  	t.Run("remove not existing member from an existing team", func(t *testing.T) {
  2707  		nErr = ss.Team().RemoveMember(teamID, model.NewId())
  2708  		require.NoError(t, nErr)
  2709  		var membersOtherTeam []*model.TeamMember
  2710  		membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil)
  2711  		require.NoError(t, nErr)
  2712  		require.Len(t, membersOtherTeam, 4)
  2713  	})
  2714  
  2715  	t.Run("remove existing member from an existing team", func(t *testing.T) {
  2716  		nErr = ss.Team().RemoveMember(teamID, u1.Id)
  2717  		require.NoError(t, nErr)
  2718  		defer ss.Team().SaveMember(m1, -1)
  2719  		var membersOtherTeam []*model.TeamMember
  2720  		membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil)
  2721  		require.NoError(t, nErr)
  2722  		require.Len(t, membersOtherTeam, 3)
  2723  	})
  2724  }
  2725  
  2726  func testTeamRemoveMembers(t *testing.T, ss store.Store) {
  2727  	u1, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  2728  	require.NoError(t, err)
  2729  	u2, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  2730  	require.NoError(t, err)
  2731  	u3, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  2732  	require.NoError(t, err)
  2733  	u4, err := ss.User().Save(&model.User{Username: model.NewId(), Email: MakeEmail()})
  2734  	require.NoError(t, err)
  2735  	teamID := model.NewId()
  2736  	m1 := &model.TeamMember{TeamId: teamID, UserId: u1.Id}
  2737  	m2 := &model.TeamMember{TeamId: teamID, UserId: u2.Id}
  2738  	m3 := &model.TeamMember{TeamId: teamID, UserId: u3.Id}
  2739  	m4 := &model.TeamMember{TeamId: teamID, UserId: u4.Id}
  2740  	_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4}, -1)
  2741  	require.NoError(t, nErr)
  2742  
  2743  	t.Run("remove members from not existing team", func(t *testing.T) {
  2744  		nErr = ss.Team().RemoveMembers("not-existing-team", []string{u1.Id, u2.Id, u3.Id, u4.Id})
  2745  		require.NoError(t, nErr)
  2746  		var membersOtherTeam []*model.TeamMember
  2747  		membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil)
  2748  		require.NoError(t, nErr)
  2749  		require.Len(t, membersOtherTeam, 4)
  2750  	})
  2751  
  2752  	t.Run("remove not existing members from an existing team", func(t *testing.T) {
  2753  		nErr = ss.Team().RemoveMembers(teamID, []string{model.NewId(), model.NewId()})
  2754  		require.NoError(t, nErr)
  2755  		var membersOtherTeam []*model.TeamMember
  2756  		membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil)
  2757  		require.NoError(t, nErr)
  2758  		require.Len(t, membersOtherTeam, 4)
  2759  	})
  2760  
  2761  	t.Run("remove not existing and not existing members from an existing team", func(t *testing.T) {
  2762  		nErr = ss.Team().RemoveMembers(teamID, []string{u1.Id, u2.Id, model.NewId(), model.NewId()})
  2763  		require.NoError(t, nErr)
  2764  		defer ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2}, -1)
  2765  		var membersOtherTeam []*model.TeamMember
  2766  		membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil)
  2767  		require.NoError(t, nErr)
  2768  		require.Len(t, membersOtherTeam, 2)
  2769  	})
  2770  	t.Run("remove existing members from an existing team", func(t *testing.T) {
  2771  		nErr = ss.Team().RemoveMembers(teamID, []string{u1.Id, u2.Id, u3.Id})
  2772  		require.NoError(t, nErr)
  2773  		defer ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3}, -1)
  2774  		var membersOtherTeam []*model.TeamMember
  2775  		membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil)
  2776  		require.NoError(t, nErr)
  2777  		require.Len(t, membersOtherTeam, 1)
  2778  	})
  2779  }
  2780  
  2781  func testTeamMembersWithPagination(t *testing.T, ss store.Store) {
  2782  	teamId1 := model.NewId()
  2783  	teamId2 := model.NewId()
  2784  
  2785  	m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
  2786  	m2 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
  2787  	m3 := &model.TeamMember{TeamId: teamId2, UserId: model.NewId()}
  2788  
  2789  	_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3}, -1)
  2790  	require.NoError(t, nErr)
  2791  
  2792  	ms, errTeam := ss.Team().GetTeamsForUserWithPagination(m1.UserId, 0, 1)
  2793  	require.NoError(t, errTeam)
  2794  
  2795  	require.Len(t, ms, 1)
  2796  	require.Equal(t, m1.TeamId, ms[0].TeamId)
  2797  
  2798  	e := ss.Team().RemoveMember(teamId1, m1.UserId)
  2799  	require.NoError(t, e)
  2800  
  2801  	ms, err := ss.Team().GetMembers(teamId1, 0, 100, nil)
  2802  	require.NoError(t, err)
  2803  
  2804  	require.Len(t, ms, 1)
  2805  	require.Equal(t, m2.UserId, ms[0].UserId)
  2806  
  2807  	_, nErr = ss.Team().SaveMember(m1, -1)
  2808  	require.NoError(t, nErr)
  2809  
  2810  	err = ss.Team().RemoveAllMembersByTeam(teamId1)
  2811  	require.NoError(t, err)
  2812  
  2813  	uid := model.NewId()
  2814  	m4 := &model.TeamMember{TeamId: teamId1, UserId: uid}
  2815  	m5 := &model.TeamMember{TeamId: teamId2, UserId: uid}
  2816  	_, nErr = ss.Team().SaveMultipleMembers([]*model.TeamMember{m4, m5}, -1)
  2817  	require.NoError(t, nErr)
  2818  
  2819  	result, err := ss.Team().GetTeamsForUserWithPagination(uid, 0, 1)
  2820  	require.NoError(t, err)
  2821  	require.Len(t, result, 1)
  2822  
  2823  	nErr = ss.Team().RemoveAllMembersByUser(uid)
  2824  	require.NoError(t, nErr)
  2825  
  2826  	result, err = ss.Team().GetTeamsForUserWithPagination(uid, 1, 1)
  2827  	require.NoError(t, err)
  2828  	require.Empty(t, result)
  2829  }
  2830  
  2831  func testSaveTeamMemberMaxMembers(t *testing.T, ss store.Store) {
  2832  	maxUsersPerTeam := 5
  2833  
  2834  	team, errSave := ss.Team().Save(&model.Team{
  2835  		DisplayName: "DisplayName",
  2836  		Name:        NewTestId(),
  2837  		Type:        model.TEAM_OPEN,
  2838  	})
  2839  	require.NoError(t, errSave)
  2840  	defer func() {
  2841  		ss.Team().PermanentDelete(team.Id)
  2842  	}()
  2843  
  2844  	userIds := make([]string, maxUsersPerTeam)
  2845  
  2846  	for i := 0; i < maxUsersPerTeam; i++ {
  2847  		user, err := ss.User().Save(&model.User{
  2848  			Username: NewTestId(),
  2849  			Email:    MakeEmail(),
  2850  		})
  2851  		require.NoError(t, err)
  2852  		userIds[i] = user.Id
  2853  
  2854  		defer func(userId string) {
  2855  			ss.User().PermanentDelete(userId)
  2856  		}(userIds[i])
  2857  
  2858  		_, nErr := ss.Team().SaveMember(&model.TeamMember{
  2859  			TeamId: team.Id,
  2860  			UserId: userIds[i],
  2861  		}, maxUsersPerTeam)
  2862  		require.NoError(t, nErr)
  2863  
  2864  		defer func(userId string) {
  2865  			ss.Team().RemoveMember(team.Id, userId)
  2866  		}(userIds[i])
  2867  	}
  2868  
  2869  	totalMemberCount, err := ss.Team().GetTotalMemberCount(team.Id, nil)
  2870  	require.NoError(t, err)
  2871  	require.Equal(t, int(totalMemberCount), maxUsersPerTeam, "should start with 5 team members, had %v instead", totalMemberCount)
  2872  
  2873  	user, nErr := ss.User().Save(&model.User{
  2874  		Username: NewTestId(),
  2875  		Email:    MakeEmail(),
  2876  	})
  2877  	require.NoError(t, nErr)
  2878  	newUserId := user.Id
  2879  	defer func() {
  2880  		ss.User().PermanentDelete(newUserId)
  2881  	}()
  2882  
  2883  	_, nErr = ss.Team().SaveMember(&model.TeamMember{
  2884  		TeamId: team.Id,
  2885  		UserId: newUserId,
  2886  	}, maxUsersPerTeam)
  2887  	require.Error(t, nErr, "shouldn't be able to save member when at maximum members per team")
  2888  
  2889  	totalMemberCount, teamErr := ss.Team().GetTotalMemberCount(team.Id, nil)
  2890  	require.NoError(t, teamErr)
  2891  	require.Equal(t, maxUsersPerTeam, int(totalMemberCount), "should still have 5 team members, had %v instead", totalMemberCount)
  2892  
  2893  	// Leaving the team from the UI sets DeleteAt instead of using TeamStore.RemoveMember
  2894  	_, teamErr = ss.Team().UpdateMember(&model.TeamMember{
  2895  		TeamId:   team.Id,
  2896  		UserId:   userIds[0],
  2897  		DeleteAt: 1234,
  2898  	})
  2899  	require.NoError(t, teamErr)
  2900  
  2901  	totalMemberCount, teamErr = ss.Team().GetTotalMemberCount(team.Id, nil)
  2902  	require.NoError(t, teamErr)
  2903  	require.Equal(t, maxUsersPerTeam-1, int(totalMemberCount), "should now only have 4 team members, had %v instead", totalMemberCount)
  2904  
  2905  	_, nErr = ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: newUserId}, maxUsersPerTeam)
  2906  	require.NoError(t, nErr, "should've been able to save new member after deleting one")
  2907  
  2908  	defer ss.Team().RemoveMember(team.Id, newUserId)
  2909  
  2910  	totalMemberCount, teamErr = ss.Team().GetTotalMemberCount(team.Id, nil)
  2911  	require.NoError(t, teamErr)
  2912  	require.Equal(t, maxUsersPerTeam, int(totalMemberCount), "should have 5 team members again, had %v instead", totalMemberCount)
  2913  
  2914  	// Deactivating a user should make them stop counting against max members
  2915  	user2, nErr := ss.User().Get(context.Background(), userIds[1])
  2916  	require.NoError(t, nErr)
  2917  	user2.DeleteAt = 1234
  2918  	_, nErr = ss.User().Update(user2, true)
  2919  	require.NoError(t, nErr)
  2920  
  2921  	user, nErr = ss.User().Save(&model.User{
  2922  		Username: NewTestId(),
  2923  		Email:    MakeEmail(),
  2924  	})
  2925  	require.NoError(t, nErr)
  2926  	newUserId2 := user.Id
  2927  	_, nErr = ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: newUserId2}, maxUsersPerTeam)
  2928  	require.NoError(t, nErr, "should've been able to save new member after deleting one")
  2929  
  2930  	defer ss.Team().RemoveMember(team.Id, newUserId2)
  2931  }
  2932  
  2933  func testGetTeamMember(t *testing.T, ss store.Store) {
  2934  	teamId1 := model.NewId()
  2935  
  2936  	m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
  2937  	_, nErr := ss.Team().SaveMember(m1, -1)
  2938  	require.NoError(t, nErr)
  2939  
  2940  	var rm1 *model.TeamMember
  2941  	rm1, err := ss.Team().GetMember(context.Background(), m1.TeamId, m1.UserId)
  2942  	require.NoError(t, err)
  2943  
  2944  	require.Equal(t, rm1.TeamId, m1.TeamId, "bad team id")
  2945  
  2946  	require.Equal(t, rm1.UserId, m1.UserId, "bad user id")
  2947  
  2948  	_, err = ss.Team().GetMember(context.Background(), m1.TeamId, "")
  2949  	require.Error(t, err, "empty user id - should have failed")
  2950  
  2951  	_, err = ss.Team().GetMember(context.Background(), "", m1.UserId)
  2952  	require.Error(t, err, "empty team id - should have failed")
  2953  
  2954  	// Test with a custom team scheme.
  2955  	s2 := &model.Scheme{
  2956  		Name:        NewTestId(),
  2957  		DisplayName: NewTestId(),
  2958  		Description: NewTestId(),
  2959  		Scope:       model.SCHEME_SCOPE_TEAM,
  2960  	}
  2961  	s2, nErr = ss.Scheme().Save(s2)
  2962  	require.NoError(t, nErr)
  2963  	t.Log(s2)
  2964  
  2965  	t2, nErr := ss.Team().Save(&model.Team{
  2966  		DisplayName: "DisplayName",
  2967  		Name:        NewTestId(),
  2968  		Type:        model.TEAM_OPEN,
  2969  		SchemeId:    &s2.Id,
  2970  	})
  2971  	require.NoError(t, nErr)
  2972  
  2973  	defer func() {
  2974  		ss.Team().PermanentDelete(t2.Id)
  2975  	}()
  2976  
  2977  	m2 := &model.TeamMember{TeamId: t2.Id, UserId: model.NewId(), SchemeUser: true}
  2978  	_, nErr = ss.Team().SaveMember(m2, -1)
  2979  	require.NoError(t, nErr)
  2980  
  2981  	m3, err := ss.Team().GetMember(context.Background(), m2.TeamId, m2.UserId)
  2982  	require.NoError(t, err)
  2983  	t.Log(m3)
  2984  
  2985  	assert.Equal(t, s2.DefaultTeamUserRole, m3.Roles)
  2986  
  2987  	m4 := &model.TeamMember{TeamId: t2.Id, UserId: model.NewId(), SchemeGuest: true}
  2988  	_, nErr = ss.Team().SaveMember(m4, -1)
  2989  	require.NoError(t, nErr)
  2990  
  2991  	m5, err := ss.Team().GetMember(context.Background(), m4.TeamId, m4.UserId)
  2992  	require.NoError(t, err)
  2993  
  2994  	assert.Equal(t, s2.DefaultTeamGuestRole, m5.Roles)
  2995  }
  2996  
  2997  func testGetTeamMembersByIds(t *testing.T, ss store.Store) {
  2998  	teamId1 := model.NewId()
  2999  
  3000  	m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
  3001  	_, nErr := ss.Team().SaveMember(m1, -1)
  3002  	require.NoError(t, nErr)
  3003  
  3004  	var r []*model.TeamMember
  3005  	r, err := ss.Team().GetMembersByIds(m1.TeamId, []string{m1.UserId}, nil)
  3006  	require.NoError(t, err)
  3007  	rm1 := r[0]
  3008  
  3009  	require.Equal(t, rm1.TeamId, m1.TeamId, "bad team id")
  3010  	require.Equal(t, rm1.UserId, m1.UserId, "bad user id")
  3011  
  3012  	m2 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
  3013  	_, nErr = ss.Team().SaveMember(m2, -1)
  3014  	require.NoError(t, nErr)
  3015  
  3016  	rm, err := ss.Team().GetMembersByIds(m1.TeamId, []string{m1.UserId, m2.UserId, model.NewId()}, nil)
  3017  	require.NoError(t, err)
  3018  
  3019  	require.Len(t, rm, 2, "return wrong number of results")
  3020  
  3021  	_, err = ss.Team().GetMembersByIds(m1.TeamId, []string{}, nil)
  3022  	require.Error(t, err, "empty user ids - should have failed")
  3023  }
  3024  
  3025  func testTeamStoreMemberCount(t *testing.T, ss store.Store) {
  3026  	u1 := &model.User{}
  3027  	u1.Email = MakeEmail()
  3028  	_, err := ss.User().Save(u1)
  3029  	require.NoError(t, err)
  3030  
  3031  	u2 := &model.User{}
  3032  	u2.Email = MakeEmail()
  3033  	u2.DeleteAt = 1
  3034  	_, err = ss.User().Save(u2)
  3035  	require.NoError(t, err)
  3036  
  3037  	teamId1 := model.NewId()
  3038  	m1 := &model.TeamMember{TeamId: teamId1, UserId: u1.Id}
  3039  	_, nErr := ss.Team().SaveMember(m1, -1)
  3040  	require.NoError(t, nErr)
  3041  
  3042  	m2 := &model.TeamMember{TeamId: teamId1, UserId: u2.Id}
  3043  	_, nErr = ss.Team().SaveMember(m2, -1)
  3044  	require.NoError(t, nErr)
  3045  
  3046  	var totalMemberCount int64
  3047  	totalMemberCount, nErr = ss.Team().GetTotalMemberCount(teamId1, nil)
  3048  	require.NoError(t, nErr)
  3049  	require.Equal(t, int(totalMemberCount), 2, "wrong count")
  3050  
  3051  	var result int64
  3052  	result, nErr = ss.Team().GetActiveMemberCount(teamId1, nil)
  3053  	require.NoError(t, nErr)
  3054  	require.Equal(t, 1, int(result), "wrong count")
  3055  
  3056  	m3 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
  3057  	_, nErr = ss.Team().SaveMember(m3, -1)
  3058  	require.NoError(t, nErr)
  3059  
  3060  	totalMemberCount, nErr = ss.Team().GetTotalMemberCount(teamId1, nil)
  3061  	require.NoError(t, nErr)
  3062  	require.Equal(t, 2, int(totalMemberCount), "wrong count")
  3063  
  3064  	result, nErr = ss.Team().GetActiveMemberCount(teamId1, nil)
  3065  	require.NoError(t, nErr)
  3066  	require.Equal(t, 1, int(result), "wrong count")
  3067  }
  3068  
  3069  func testGetChannelUnreadsForAllTeams(t *testing.T, ss store.Store) {
  3070  	teamId1 := model.NewId()
  3071  	teamId2 := model.NewId()
  3072  
  3073  	uid := model.NewId()
  3074  	m1 := &model.TeamMember{TeamId: teamId1, UserId: uid}
  3075  	m2 := &model.TeamMember{TeamId: teamId2, UserId: uid}
  3076  	_, nErr := ss.Team().SaveMember(m1, -1)
  3077  	require.NoError(t, nErr)
  3078  	_, nErr = ss.Team().SaveMember(m2, -1)
  3079  	require.NoError(t, nErr)
  3080  
  3081  	c1 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100}
  3082  	_, nErr = ss.Channel().Save(c1, -1)
  3083  	require.NoError(t, nErr)
  3084  
  3085  	c2 := &model.Channel{TeamId: m2.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100}
  3086  	_, nErr = ss.Channel().Save(c2, -1)
  3087  	require.NoError(t, nErr)
  3088  
  3089  	cm1 := &model.ChannelMember{ChannelId: c1.Id, UserId: m1.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90}
  3090  	_, err := ss.Channel().SaveMember(cm1)
  3091  	require.NoError(t, err)
  3092  	cm2 := &model.ChannelMember{ChannelId: c2.Id, UserId: m2.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90}
  3093  	_, err = ss.Channel().SaveMember(cm2)
  3094  	require.NoError(t, err)
  3095  
  3096  	ms1, nErr := ss.Team().GetChannelUnreadsForAllTeams("", uid)
  3097  	require.NoError(t, nErr)
  3098  	membersMap := make(map[string]bool)
  3099  	for i := range ms1 {
  3100  		id := ms1[i].TeamId
  3101  		if _, ok := membersMap[id]; !ok {
  3102  			membersMap[id] = true
  3103  		}
  3104  	}
  3105  	require.Len(t, membersMap, 2, "Should be the unreads for all the teams")
  3106  
  3107  	require.Equal(t, 10, int(ms1[0].MsgCount), "subtraction failed")
  3108  
  3109  	ms2, nErr := ss.Team().GetChannelUnreadsForAllTeams(teamId1, uid)
  3110  	require.NoError(t, nErr)
  3111  	membersMap = make(map[string]bool)
  3112  	for i := range ms2 {
  3113  		id := ms2[i].TeamId
  3114  		if _, ok := membersMap[id]; !ok {
  3115  			membersMap[id] = true
  3116  		}
  3117  	}
  3118  
  3119  	require.Len(t, membersMap, 1, "Should be the unreads for just one team")
  3120  
  3121  	require.Equal(t, 10, int(ms2[0].MsgCount), "subtraction failed")
  3122  
  3123  	nErr = ss.Team().RemoveAllMembersByUser(uid)
  3124  	require.NoError(t, nErr)
  3125  }
  3126  
  3127  func testGetChannelUnreadsForTeam(t *testing.T, ss store.Store) {
  3128  	teamId1 := model.NewId()
  3129  
  3130  	uid := model.NewId()
  3131  	m1 := &model.TeamMember{TeamId: teamId1, UserId: uid}
  3132  	_, nErr := ss.Team().SaveMember(m1, -1)
  3133  	require.NoError(t, nErr)
  3134  
  3135  	c1 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100}
  3136  	_, nErr = ss.Channel().Save(c1, -1)
  3137  	require.NoError(t, nErr)
  3138  
  3139  	c2 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100}
  3140  	_, nErr = ss.Channel().Save(c2, -1)
  3141  	require.NoError(t, nErr)
  3142  
  3143  	cm1 := &model.ChannelMember{ChannelId: c1.Id, UserId: m1.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90}
  3144  	_, nErr = ss.Channel().SaveMember(cm1)
  3145  	require.NoError(t, nErr)
  3146  	cm2 := &model.ChannelMember{ChannelId: c2.Id, UserId: m1.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90}
  3147  	_, nErr = ss.Channel().SaveMember(cm2)
  3148  	require.NoError(t, nErr)
  3149  
  3150  	ms, err := ss.Team().GetChannelUnreadsForTeam(m1.TeamId, m1.UserId)
  3151  	require.NoError(t, err)
  3152  	require.Len(t, ms, 2, "wrong length")
  3153  
  3154  	require.Equal(t, 10, int(ms[0].MsgCount), "subtraction failed")
  3155  }
  3156  
  3157  func testUpdateLastTeamIconUpdate(t *testing.T, ss store.Store) {
  3158  
  3159  	// team icon initially updated a second ago
  3160  	lastTeamIconUpdateInitial := model.GetMillis() - 1000
  3161  
  3162  	o1 := &model.Team{}
  3163  	o1.DisplayName = "Display Name"
  3164  	o1.Name = "z-z-z" + model.NewId() + "b"
  3165  	o1.Email = MakeEmail()
  3166  	o1.Type = model.TEAM_OPEN
  3167  	o1.LastTeamIconUpdate = lastTeamIconUpdateInitial
  3168  	o1, err := ss.Team().Save(o1)
  3169  	require.NoError(t, err)
  3170  
  3171  	curTime := model.GetMillis()
  3172  
  3173  	err = ss.Team().UpdateLastTeamIconUpdate(o1.Id, curTime)
  3174  	require.NoError(t, err)
  3175  
  3176  	ro1, err := ss.Team().Get(o1.Id)
  3177  	require.NoError(t, err)
  3178  
  3179  	require.Greater(t, ro1.LastTeamIconUpdate, lastTeamIconUpdateInitial, "LastTeamIconUpdate not updated")
  3180  }
  3181  
  3182  func testGetTeamsByScheme(t *testing.T, ss store.Store) {
  3183  	// Create some schemes.
  3184  	s1 := &model.Scheme{
  3185  		DisplayName: NewTestId(),
  3186  		Name:        NewTestId(),
  3187  		Description: NewTestId(),
  3188  		Scope:       model.SCHEME_SCOPE_TEAM,
  3189  	}
  3190  
  3191  	s2 := &model.Scheme{
  3192  		DisplayName: NewTestId(),
  3193  		Name:        NewTestId(),
  3194  		Description: NewTestId(),
  3195  		Scope:       model.SCHEME_SCOPE_TEAM,
  3196  	}
  3197  
  3198  	s1, err := ss.Scheme().Save(s1)
  3199  	require.NoError(t, err)
  3200  	s2, err = ss.Scheme().Save(s2)
  3201  	require.NoError(t, err)
  3202  
  3203  	// Create and save some teams.
  3204  	t1 := &model.Team{
  3205  		Name:        NewTestId(),
  3206  		DisplayName: NewTestId(),
  3207  		Email:       MakeEmail(),
  3208  		Type:        model.TEAM_OPEN,
  3209  		SchemeId:    &s1.Id,
  3210  	}
  3211  
  3212  	t2 := &model.Team{
  3213  		Name:        NewTestId(),
  3214  		DisplayName: NewTestId(),
  3215  		Email:       MakeEmail(),
  3216  		Type:        model.TEAM_OPEN,
  3217  		SchemeId:    &s1.Id,
  3218  	}
  3219  
  3220  	t3 := &model.Team{
  3221  		Name:        NewTestId(),
  3222  		DisplayName: NewTestId(),
  3223  		Email:       MakeEmail(),
  3224  		Type:        model.TEAM_OPEN,
  3225  	}
  3226  
  3227  	_, err = ss.Team().Save(t1)
  3228  	require.NoError(t, err)
  3229  
  3230  	_, err = ss.Team().Save(t2)
  3231  	require.NoError(t, err)
  3232  
  3233  	_, err = ss.Team().Save(t3)
  3234  	require.NoError(t, err)
  3235  
  3236  	// Get the teams by a valid Scheme ID.
  3237  	d, err := ss.Team().GetTeamsByScheme(s1.Id, 0, 100)
  3238  	assert.NoError(t, err)
  3239  	assert.Len(t, d, 2)
  3240  
  3241  	// Get the teams by a valid Scheme ID where there aren't any matching Teams.
  3242  	d, err = ss.Team().GetTeamsByScheme(s2.Id, 0, 100)
  3243  	assert.NoError(t, err)
  3244  	assert.Empty(t, d)
  3245  
  3246  	// Get the teams by an invalid Scheme ID.
  3247  	d, err = ss.Team().GetTeamsByScheme(model.NewId(), 0, 100)
  3248  	assert.NoError(t, err)
  3249  	assert.Empty(t, d)
  3250  }
  3251  
  3252  func testTeamStoreMigrateTeamMembers(t *testing.T, ss store.Store) {
  3253  	s1 := model.NewId()
  3254  	t1 := &model.Team{
  3255  		DisplayName: "Name",
  3256  		Name:        NewTestId(),
  3257  		Email:       MakeEmail(),
  3258  		Type:        model.TEAM_OPEN,
  3259  		InviteId:    model.NewId(),
  3260  		SchemeId:    &s1,
  3261  	}
  3262  	t1, err := ss.Team().Save(t1)
  3263  	require.NoError(t, err)
  3264  
  3265  	tm1 := &model.TeamMember{
  3266  		TeamId:        t1.Id,
  3267  		UserId:        NewTestId(),
  3268  		ExplicitRoles: "team_admin team_user",
  3269  	}
  3270  	tm2 := &model.TeamMember{
  3271  		TeamId:        t1.Id,
  3272  		UserId:        NewTestId(),
  3273  		ExplicitRoles: "team_user",
  3274  	}
  3275  	tm3 := &model.TeamMember{
  3276  		TeamId:        t1.Id,
  3277  		UserId:        NewTestId(),
  3278  		ExplicitRoles: "something_else",
  3279  	}
  3280  
  3281  	memberships, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{tm1, tm2, tm3}, -1)
  3282  	require.NoError(t, nErr)
  3283  	require.Len(t, memberships, 3)
  3284  	tm1 = memberships[0]
  3285  	tm2 = memberships[1]
  3286  	tm3 = memberships[2]
  3287  
  3288  	lastDoneTeamId := strings.Repeat("0", 26)
  3289  	lastDoneUserId := strings.Repeat("0", 26)
  3290  
  3291  	for {
  3292  		res, e := ss.Team().MigrateTeamMembers(lastDoneTeamId, lastDoneUserId)
  3293  		if assert.NoError(t, e) {
  3294  			if res == nil {
  3295  				break
  3296  			}
  3297  			lastDoneTeamId = res["TeamId"]
  3298  			lastDoneUserId = res["UserId"]
  3299  		}
  3300  	}
  3301  
  3302  	tm1b, err := ss.Team().GetMember(context.Background(), tm1.TeamId, tm1.UserId)
  3303  	assert.NoError(t, err)
  3304  	assert.Equal(t, "", tm1b.ExplicitRoles)
  3305  	assert.True(t, tm1b.SchemeUser)
  3306  	assert.True(t, tm1b.SchemeAdmin)
  3307  
  3308  	tm2b, err := ss.Team().GetMember(context.Background(), tm2.TeamId, tm2.UserId)
  3309  	assert.NoError(t, err)
  3310  	assert.Equal(t, "", tm2b.ExplicitRoles)
  3311  	assert.True(t, tm2b.SchemeUser)
  3312  	assert.False(t, tm2b.SchemeAdmin)
  3313  
  3314  	tm3b, err := ss.Team().GetMember(context.Background(), tm3.TeamId, tm3.UserId)
  3315  	assert.NoError(t, err)
  3316  	assert.Equal(t, "something_else", tm3b.ExplicitRoles)
  3317  	assert.False(t, tm3b.SchemeUser)
  3318  	assert.False(t, tm3b.SchemeAdmin)
  3319  }
  3320  
  3321  func testResetAllTeamSchemes(t *testing.T, ss store.Store) {
  3322  	s1 := &model.Scheme{
  3323  		Name:        NewTestId(),
  3324  		DisplayName: NewTestId(),
  3325  		Description: NewTestId(),
  3326  		Scope:       model.SCHEME_SCOPE_TEAM,
  3327  	}
  3328  	s1, err := ss.Scheme().Save(s1)
  3329  	require.NoError(t, err)
  3330  
  3331  	t1 := &model.Team{
  3332  		Name:        NewTestId(),
  3333  		DisplayName: NewTestId(),
  3334  		Email:       MakeEmail(),
  3335  		Type:        model.TEAM_OPEN,
  3336  		SchemeId:    &s1.Id,
  3337  	}
  3338  
  3339  	t2 := &model.Team{
  3340  		Name:        NewTestId(),
  3341  		DisplayName: NewTestId(),
  3342  		Email:       MakeEmail(),
  3343  		Type:        model.TEAM_OPEN,
  3344  		SchemeId:    &s1.Id,
  3345  	}
  3346  
  3347  	t1, err = ss.Team().Save(t1)
  3348  	require.NoError(t, err)
  3349  	t2, err = ss.Team().Save(t2)
  3350  	require.NoError(t, err)
  3351  
  3352  	assert.Equal(t, s1.Id, *t1.SchemeId)
  3353  	assert.Equal(t, s1.Id, *t2.SchemeId)
  3354  
  3355  	res := ss.Team().ResetAllTeamSchemes()
  3356  	assert.NoError(t, res)
  3357  
  3358  	t1, err = ss.Team().Get(t1.Id)
  3359  	require.NoError(t, err)
  3360  
  3361  	t2, err = ss.Team().Get(t2.Id)
  3362  	require.NoError(t, err)
  3363  
  3364  	assert.Equal(t, "", *t1.SchemeId)
  3365  	assert.Equal(t, "", *t2.SchemeId)
  3366  }
  3367  
  3368  func testTeamStoreClearAllCustomRoleAssignments(t *testing.T, ss store.Store) {
  3369  	m1 := &model.TeamMember{
  3370  		TeamId:        model.NewId(),
  3371  		UserId:        model.NewId(),
  3372  		ExplicitRoles: "team_post_all_public team_user team_admin",
  3373  	}
  3374  	m2 := &model.TeamMember{
  3375  		TeamId:        model.NewId(),
  3376  		UserId:        model.NewId(),
  3377  		ExplicitRoles: "team_user custom_role team_admin another_custom_role",
  3378  	}
  3379  	m3 := &model.TeamMember{
  3380  		TeamId:        model.NewId(),
  3381  		UserId:        model.NewId(),
  3382  		ExplicitRoles: "team_user",
  3383  	}
  3384  	m4 := &model.TeamMember{
  3385  		TeamId:        model.NewId(),
  3386  		UserId:        model.NewId(),
  3387  		ExplicitRoles: "custom_only",
  3388  	}
  3389  
  3390  	_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4}, -1)
  3391  	require.NoError(t, nErr)
  3392  
  3393  	require.NoError(t, (ss.Team().ClearAllCustomRoleAssignments()))
  3394  
  3395  	r1, err := ss.Team().GetMember(context.Background(), m1.TeamId, m1.UserId)
  3396  	require.NoError(t, err)
  3397  	assert.Equal(t, m1.ExplicitRoles, r1.Roles)
  3398  
  3399  	r2, err := ss.Team().GetMember(context.Background(), m2.TeamId, m2.UserId)
  3400  	require.NoError(t, err)
  3401  	assert.Equal(t, "team_user team_admin", r2.Roles)
  3402  
  3403  	r3, err := ss.Team().GetMember(context.Background(), m3.TeamId, m3.UserId)
  3404  	require.NoError(t, err)
  3405  	assert.Equal(t, m3.ExplicitRoles, r3.Roles)
  3406  
  3407  	r4, err := ss.Team().GetMember(context.Background(), m4.TeamId, m4.UserId)
  3408  	require.NoError(t, err)
  3409  	assert.Equal(t, "", r4.Roles)
  3410  }
  3411  
  3412  func testTeamStoreAnalyticsGetTeamCountForScheme(t *testing.T, ss store.Store) {
  3413  	s1 := &model.Scheme{
  3414  		DisplayName: NewTestId(),
  3415  		Name:        NewTestId(),
  3416  		Description: NewTestId(),
  3417  		Scope:       model.SCHEME_SCOPE_TEAM,
  3418  	}
  3419  	s1, err := ss.Scheme().Save(s1)
  3420  	require.NoError(t, err)
  3421  
  3422  	count1, err := ss.Team().AnalyticsGetTeamCountForScheme(s1.Id)
  3423  	assert.NoError(t, err)
  3424  	assert.Equal(t, int64(0), count1)
  3425  
  3426  	t1 := &model.Team{
  3427  		Name:        NewTestId(),
  3428  		DisplayName: NewTestId(),
  3429  		Email:       MakeEmail(),
  3430  		Type:        model.TEAM_OPEN,
  3431  		SchemeId:    &s1.Id,
  3432  	}
  3433  	_, err = ss.Team().Save(t1)
  3434  	require.NoError(t, err)
  3435  
  3436  	count2, err := ss.Team().AnalyticsGetTeamCountForScheme(s1.Id)
  3437  	assert.NoError(t, err)
  3438  	assert.Equal(t, int64(1), count2)
  3439  
  3440  	t2 := &model.Team{
  3441  		Name:        NewTestId(),
  3442  		DisplayName: NewTestId(),
  3443  		Email:       MakeEmail(),
  3444  		Type:        model.TEAM_OPEN,
  3445  		SchemeId:    &s1.Id,
  3446  	}
  3447  	_, err = ss.Team().Save(t2)
  3448  	require.NoError(t, err)
  3449  
  3450  	count3, err := ss.Team().AnalyticsGetTeamCountForScheme(s1.Id)
  3451  	assert.NoError(t, err)
  3452  	assert.Equal(t, int64(2), count3)
  3453  
  3454  	t3 := &model.Team{
  3455  		Name:        NewTestId(),
  3456  		DisplayName: NewTestId(),
  3457  		Email:       MakeEmail(),
  3458  		Type:        model.TEAM_OPEN,
  3459  	}
  3460  	_, err = ss.Team().Save(t3)
  3461  	require.NoError(t, err)
  3462  
  3463  	count4, err := ss.Team().AnalyticsGetTeamCountForScheme(s1.Id)
  3464  	assert.NoError(t, err)
  3465  	assert.Equal(t, int64(2), count4)
  3466  
  3467  	t4 := &model.Team{
  3468  		Name:        NewTestId(),
  3469  		DisplayName: NewTestId(),
  3470  		Email:       MakeEmail(),
  3471  		Type:        model.TEAM_OPEN,
  3472  		SchemeId:    &s1.Id,
  3473  		DeleteAt:    model.GetMillis(),
  3474  	}
  3475  	_, err = ss.Team().Save(t4)
  3476  	require.NoError(t, err)
  3477  
  3478  	count5, err := ss.Team().AnalyticsGetTeamCountForScheme(s1.Id)
  3479  	assert.NoError(t, err)
  3480  	assert.Equal(t, int64(2), count5)
  3481  }
  3482  
  3483  func testTeamStoreGetAllForExportAfter(t *testing.T, ss store.Store) {
  3484  	t1 := model.Team{}
  3485  	t1.DisplayName = "Name"
  3486  	t1.Name = NewTestId()
  3487  	t1.Email = MakeEmail()
  3488  	t1.Type = model.TEAM_OPEN
  3489  	_, err := ss.Team().Save(&t1)
  3490  	require.NoError(t, err)
  3491  
  3492  	d1, err := ss.Team().GetAllForExportAfter(10000, strings.Repeat("0", 26))
  3493  	assert.NoError(t, err)
  3494  
  3495  	found := false
  3496  	for _, team := range d1 {
  3497  		if team.Id == t1.Id {
  3498  			found = true
  3499  			assert.Equal(t, t1.Id, team.Id)
  3500  			assert.Nil(t, team.SchemeId)
  3501  			assert.Equal(t, t1.Name, team.Name)
  3502  		}
  3503  	}
  3504  	assert.True(t, found)
  3505  }
  3506  
  3507  func testTeamStoreGetTeamMembersForExport(t *testing.T, ss store.Store) {
  3508  	t1 := model.Team{}
  3509  	t1.DisplayName = "Name"
  3510  	t1.Name = NewTestId()
  3511  	t1.Email = MakeEmail()
  3512  	t1.Type = model.TEAM_OPEN
  3513  	_, err := ss.Team().Save(&t1)
  3514  	require.NoError(t, err)
  3515  
  3516  	u1 := model.User{}
  3517  	u1.Email = MakeEmail()
  3518  	u1.Nickname = NewTestId()
  3519  	_, err = ss.User().Save(&u1)
  3520  	require.NoError(t, err)
  3521  
  3522  	u2 := model.User{}
  3523  	u2.Email = MakeEmail()
  3524  	u2.Nickname = NewTestId()
  3525  	_, err = ss.User().Save(&u2)
  3526  	require.NoError(t, err)
  3527  
  3528  	m1 := &model.TeamMember{TeamId: t1.Id, UserId: u1.Id}
  3529  	m2 := &model.TeamMember{TeamId: t1.Id, UserId: u2.Id}
  3530  	_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2}, -1)
  3531  	require.NoError(t, nErr)
  3532  
  3533  	d1, err := ss.Team().GetTeamMembersForExport(u1.Id)
  3534  	assert.NoError(t, err)
  3535  
  3536  	assert.Len(t, d1, 1)
  3537  
  3538  	tmfe1 := d1[0]
  3539  	assert.Equal(t, t1.Id, tmfe1.TeamId)
  3540  	assert.Equal(t, u1.Id, tmfe1.UserId)
  3541  	assert.Equal(t, t1.Name, tmfe1.TeamName)
  3542  }
  3543  
  3544  func testGroupSyncedTeamCount(t *testing.T, ss store.Store) {
  3545  	team1, err := ss.Team().Save(&model.Team{
  3546  		DisplayName:      NewTestId(),
  3547  		Name:             NewTestId(),
  3548  		Email:            MakeEmail(),
  3549  		Type:             model.TEAM_INVITE,
  3550  		GroupConstrained: model.NewBool(true),
  3551  	})
  3552  	require.NoError(t, err)
  3553  	require.True(t, team1.IsGroupConstrained())
  3554  	defer ss.Team().PermanentDelete(team1.Id)
  3555  
  3556  	team2, err := ss.Team().Save(&model.Team{
  3557  		DisplayName: NewTestId(),
  3558  		Name:        "zz" + model.NewId(),
  3559  		Email:       MakeEmail(),
  3560  		Type:        model.TEAM_INVITE,
  3561  	})
  3562  	require.NoError(t, err)
  3563  	require.False(t, team2.IsGroupConstrained())
  3564  	defer ss.Team().PermanentDelete(team2.Id)
  3565  
  3566  	count, err := ss.Team().GroupSyncedTeamCount()
  3567  	require.NoError(t, err)
  3568  	require.GreaterOrEqual(t, count, int64(1))
  3569  
  3570  	team2.GroupConstrained = model.NewBool(true)
  3571  	team2, err = ss.Team().Update(team2)
  3572  	require.NoError(t, err)
  3573  	require.True(t, team2.IsGroupConstrained())
  3574  
  3575  	countAfter, err := ss.Team().GroupSyncedTeamCount()
  3576  	require.NoError(t, err)
  3577  	require.GreaterOrEqual(t, countAfter, count+1)
  3578  }