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