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