github.com/crspeller/mattermost-server@v0.0.0-20190328001957-a200beb3d111/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/crspeller/mattermost-server/model"
    15  	"github.com/crspeller/mattermost-server/store"
    16  )
    17  
    18  func TestTeamStore(t *testing.T, ss store.Store) {
    19  	createDefaultRoles(t, ss)
    20  
    21  	t.Run("Save", func(t *testing.T) { testTeamStoreSave(t, ss) })
    22  	t.Run("Update", func(t *testing.T) { testTeamStoreUpdate(t, ss) })
    23  	t.Run("UpdateDisplayName", func(t *testing.T) { testTeamStoreUpdateDisplayName(t, ss) })
    24  	t.Run("Get", func(t *testing.T) { testTeamStoreGet(t, ss) })
    25  	t.Run("GetByName", func(t *testing.T) { testTeamStoreGetByName(t, ss) })
    26  	t.Run("SearchByName", func(t *testing.T) { testTeamStoreSearchByName(t, ss) })
    27  	t.Run("SearchAll", func(t *testing.T) { testTeamStoreSearchAll(t, ss) })
    28  	t.Run("SearchOpen", func(t *testing.T) { testTeamStoreSearchOpen(t, ss) })
    29  	t.Run("SearchPrivate", func(t *testing.T) { testTeamStoreSearchPrivate(t, ss) })
    30  	t.Run("GetByIniviteId", func(t *testing.T) { testTeamStoreGetByIniviteId(t, ss) })
    31  	t.Run("ByUserId", func(t *testing.T) { testTeamStoreByUserId(t, ss) })
    32  	t.Run("GetAllTeamListing", func(t *testing.T) { testGetAllTeamListing(t, ss) })
    33  	t.Run("GetAllTeamPageListing", func(t *testing.T) { testGetAllTeamPageListing(t, ss) })
    34  	t.Run("GetAllPrivateTeamListing", func(t *testing.T) { testGetAllPrivateTeamListing(t, ss) })
    35  	t.Run("GetAllPrivateTeamPageListing", func(t *testing.T) { testGetAllPrivateTeamPageListing(t, ss) })
    36  	t.Run("Delete", func(t *testing.T) { testDelete(t, ss) })
    37  	t.Run("TeamCount", func(t *testing.T) { testTeamCount(t, ss) })
    38  	t.Run("TeamMembers", func(t *testing.T) { testTeamMembers(t, ss) })
    39  	t.Run("SaveTeamMemberMaxMembers", func(t *testing.T) { testSaveTeamMemberMaxMembers(t, ss) })
    40  	t.Run("GetTeamMember", func(t *testing.T) { testGetTeamMember(t, ss) })
    41  	t.Run("GetTeamMembersByIds", func(t *testing.T) { testGetTeamMembersByIds(t, ss) })
    42  	t.Run("MemberCount", func(t *testing.T) { testTeamStoreMemberCount(t, ss) })
    43  	t.Run("GetChannelUnreadsForAllTeams", func(t *testing.T) { testGetChannelUnreadsForAllTeams(t, ss) })
    44  	t.Run("GetChannelUnreadsForTeam", func(t *testing.T) { testGetChannelUnreadsForTeam(t, ss) })
    45  	t.Run("UpdateLastTeamIconUpdate", func(t *testing.T) { testUpdateLastTeamIconUpdate(t, ss) })
    46  	t.Run("GetTeamsByScheme", func(t *testing.T) { testGetTeamsByScheme(t, ss) })
    47  	t.Run("MigrateTeamMembers", func(t *testing.T) { testTeamStoreMigrateTeamMembers(t, ss) })
    48  	t.Run("ResetAllTeamSchemes", func(t *testing.T) { testResetAllTeamSchemes(t, ss) })
    49  	t.Run("ClearAllCustomRoleAssignments", func(t *testing.T) { testTeamStoreClearAllCustomRoleAssignments(t, ss) })
    50  	t.Run("AnalyticsGetTeamCountForScheme", func(t *testing.T) { testTeamStoreAnalyticsGetTeamCountForScheme(t, ss) })
    51  	t.Run("GetAllForExportAfter", func(t *testing.T) { testTeamStoreGetAllForExportAfter(t, ss) })
    52  	t.Run("GetTeamMembersForExport", func(t *testing.T) { testTeamStoreGetTeamMembersForExport(t, ss) })
    53  	t.Run("GetTeamsForUserWithPagination", func(t *testing.T) { testTeamMembersWithPagination(t, ss) })
    54  }
    55  
    56  func testTeamStoreSave(t *testing.T, ss store.Store) {
    57  	o1 := model.Team{}
    58  	o1.DisplayName = "DisplayName"
    59  	o1.Name = "z-z-z" + model.NewId() + "b"
    60  	o1.Email = MakeEmail()
    61  	o1.Type = model.TEAM_OPEN
    62  
    63  	if err := (<-ss.Team().Save(&o1)).Err; err != nil {
    64  		t.Fatal("couldn't save item", err)
    65  	}
    66  
    67  	if err := (<-ss.Team().Save(&o1)).Err; err == nil {
    68  		t.Fatal("shouldn't be able to update from save")
    69  	}
    70  
    71  	o1.Id = ""
    72  	if err := (<-ss.Team().Save(&o1)).Err; err == nil {
    73  		t.Fatal("should be unique domain")
    74  	}
    75  }
    76  
    77  func testTeamStoreUpdate(t *testing.T, ss store.Store) {
    78  	o1 := model.Team{}
    79  	o1.DisplayName = "DisplayName"
    80  	o1.Name = "z-z-z" + model.NewId() + "b"
    81  	o1.Email = MakeEmail()
    82  	o1.Type = model.TEAM_OPEN
    83  	if err := (<-ss.Team().Save(&o1)).Err; err != nil {
    84  		t.Fatal(err)
    85  	}
    86  
    87  	time.Sleep(100 * time.Millisecond)
    88  
    89  	if err := (<-ss.Team().Update(&o1)).Err; err != nil {
    90  		t.Fatal(err)
    91  	}
    92  
    93  	o1.Id = "missing"
    94  	if err := (<-ss.Team().Update(&o1)).Err; err == nil {
    95  		t.Fatal("Update should have failed because of missing key")
    96  	}
    97  
    98  	o1.Id = model.NewId()
    99  	if err := (<-ss.Team().Update(&o1)).Err; err == nil {
   100  		t.Fatal("Update should have faile because id change")
   101  	}
   102  }
   103  
   104  func testTeamStoreUpdateDisplayName(t *testing.T, ss store.Store) {
   105  	o1 := &model.Team{}
   106  	o1.DisplayName = "Display Name"
   107  	o1.Name = "z-z-z" + model.NewId() + "b"
   108  	o1.Email = MakeEmail()
   109  	o1.Type = model.TEAM_OPEN
   110  	o1 = (<-ss.Team().Save(o1)).Data.(*model.Team)
   111  
   112  	newDisplayName := "NewDisplayName"
   113  
   114  	if err := (<-ss.Team().UpdateDisplayName(newDisplayName, o1.Id)).Err; err != nil {
   115  		t.Fatal(err)
   116  	}
   117  
   118  	ro1 := (<-ss.Team().Get(o1.Id)).Data.(*model.Team)
   119  	if ro1.DisplayName != newDisplayName {
   120  		t.Fatal("DisplayName not updated")
   121  	}
   122  }
   123  
   124  func testTeamStoreGet(t *testing.T, ss store.Store) {
   125  	o1 := model.Team{}
   126  	o1.DisplayName = "DisplayName"
   127  	o1.Name = "z-z-z" + model.NewId() + "b"
   128  	o1.Email = MakeEmail()
   129  	o1.Type = model.TEAM_OPEN
   130  	store.Must(ss.Team().Save(&o1))
   131  
   132  	if r1 := <-ss.Team().Get(o1.Id); r1.Err != nil {
   133  		t.Fatal(r1.Err)
   134  	} else {
   135  		if r1.Data.(*model.Team).ToJson() != o1.ToJson() {
   136  			t.Fatal("invalid returned team")
   137  		}
   138  	}
   139  
   140  	if err := (<-ss.Team().Get("")).Err; err == nil {
   141  		t.Fatal("Missing id should have failed")
   142  	}
   143  }
   144  
   145  func testTeamStoreGetByName(t *testing.T, ss store.Store) {
   146  	o1 := model.Team{}
   147  	o1.DisplayName = "DisplayName"
   148  	o1.Name = "z-z-z" + model.NewId() + "b"
   149  	o1.Email = MakeEmail()
   150  	o1.Type = model.TEAM_OPEN
   151  
   152  	if err := (<-ss.Team().Save(&o1)).Err; err != nil {
   153  		t.Fatal(err)
   154  	}
   155  
   156  	if r1 := <-ss.Team().GetByName(o1.Name); r1.Err != nil {
   157  		t.Fatal(r1.Err)
   158  	} else {
   159  		if r1.Data.(*model.Team).ToJson() != o1.ToJson() {
   160  			t.Fatal("invalid returned team")
   161  		}
   162  	}
   163  
   164  	if err := (<-ss.Team().GetByName("")).Err; err == nil {
   165  		t.Fatal("Missing id should have failed")
   166  	}
   167  }
   168  
   169  func testTeamStoreSearchByName(t *testing.T, ss store.Store) {
   170  	o1 := model.Team{}
   171  	o1.DisplayName = "DisplayName"
   172  	var name = "zzz" + model.NewId()
   173  	o1.Name = name + "b"
   174  	o1.Email = MakeEmail()
   175  	o1.Type = model.TEAM_OPEN
   176  
   177  	if err := (<-ss.Team().Save(&o1)).Err; err != nil {
   178  		t.Fatal(err)
   179  	}
   180  
   181  	if r1 := <-ss.Team().SearchByName(name); r1.Err != nil {
   182  		t.Fatal(r1.Err)
   183  	} else {
   184  		if r1.Data.([]*model.Team)[0].ToJson() != o1.ToJson() {
   185  			t.Fatal("invalid returned team")
   186  		}
   187  	}
   188  }
   189  
   190  func testTeamStoreSearchAll(t *testing.T, ss store.Store) {
   191  	o := model.Team{}
   192  	o.DisplayName = "ADisplayName" + model.NewId()
   193  	o.Name = "zzzzzz-" + model.NewId() + "a"
   194  	o.Email = MakeEmail()
   195  	o.Type = model.TEAM_OPEN
   196  	o.AllowOpenInvite = true
   197  
   198  	require.Nil(t, (<-ss.Team().Save(&o)).Err)
   199  
   200  	p := model.Team{}
   201  	p.DisplayName = "ADisplayName" + model.NewId()
   202  	p.Name = "zzzzzz-" + model.NewId() + "a"
   203  	p.Email = MakeEmail()
   204  	p.Type = model.TEAM_OPEN
   205  	p.AllowOpenInvite = false
   206  
   207  	require.Nil(t, (<-ss.Team().Save(&p)).Err)
   208  
   209  	testCases := []struct {
   210  		Name            string
   211  		Term            string
   212  		ExpectedLenth   int
   213  		ExpectedFirstId string
   214  	}{
   215  		{
   216  			"Search for open team name",
   217  			o.Name,
   218  			1,
   219  			o.Id,
   220  		},
   221  		{
   222  			"Search for open team displayName",
   223  			o.DisplayName,
   224  			1,
   225  			o.Id,
   226  		},
   227  		{
   228  			"Search for open team without results",
   229  			"junk",
   230  			0,
   231  			"",
   232  		},
   233  		{
   234  			"Search for private team",
   235  			p.DisplayName,
   236  			1,
   237  			p.Id,
   238  		},
   239  		{
   240  			"Search for both teams",
   241  			"zzzzzz",
   242  			2,
   243  			"",
   244  		},
   245  	}
   246  
   247  	for _, tc := range testCases {
   248  		t.Run(tc.Name, func(t *testing.T) {
   249  			r1 := <-ss.Team().SearchAll(tc.Term)
   250  			require.Nil(t, r1.Err)
   251  			results := r1.Data.([]*model.Team)
   252  			require.Equal(t, tc.ExpectedLenth, len(results))
   253  			if tc.ExpectedFirstId != "" {
   254  				assert.Equal(t, tc.ExpectedFirstId, results[0].Id)
   255  			}
   256  		})
   257  	}
   258  }
   259  
   260  func testTeamStoreSearchOpen(t *testing.T, ss store.Store) {
   261  	o := model.Team{}
   262  	o.DisplayName = "ADisplayName" + model.NewId()
   263  	o.Name = "zz" + model.NewId() + "a"
   264  	o.Email = MakeEmail()
   265  	o.Type = model.TEAM_OPEN
   266  	o.AllowOpenInvite = true
   267  
   268  	require.Nil(t, (<-ss.Team().Save(&o)).Err)
   269  
   270  	p := model.Team{}
   271  	p.DisplayName = "ADisplayName" + model.NewId()
   272  	p.Name = "zz" + model.NewId() + "a"
   273  	p.Email = MakeEmail()
   274  	p.Type = model.TEAM_OPEN
   275  	p.AllowOpenInvite = false
   276  
   277  	require.Nil(t, (<-ss.Team().Save(&p)).Err)
   278  
   279  	testCases := []struct {
   280  		Name            string
   281  		Term            string
   282  		ExpectedLenth   int
   283  		ExpectedFirstId string
   284  	}{
   285  		{
   286  			"Search for open team name",
   287  			o.Name,
   288  			1,
   289  			o.Id,
   290  		},
   291  		{
   292  			"Search for open team displayName",
   293  			o.DisplayName,
   294  			1,
   295  			o.Id,
   296  		},
   297  		{
   298  			"Search for open team without results",
   299  			"junk",
   300  			0,
   301  			"",
   302  		},
   303  		{
   304  			"Search for a private team (expected no results)",
   305  			p.DisplayName,
   306  			0,
   307  			"",
   308  		},
   309  	}
   310  
   311  	for _, tc := range testCases {
   312  		t.Run(tc.Name, func(t *testing.T) {
   313  			r1 := <-ss.Team().SearchOpen(tc.Term)
   314  			require.Nil(t, r1.Err)
   315  			results := r1.Data.([]*model.Team)
   316  			require.Equal(t, tc.ExpectedLenth, len(results))
   317  			if tc.ExpectedFirstId != "" {
   318  				assert.Equal(t, tc.ExpectedFirstId, results[0].Id)
   319  			}
   320  		})
   321  	}
   322  }
   323  
   324  func testTeamStoreSearchPrivate(t *testing.T, ss store.Store) {
   325  	o := model.Team{}
   326  	o.DisplayName = "ADisplayName" + model.NewId()
   327  	o.Name = "zz" + model.NewId() + "a"
   328  	o.Email = MakeEmail()
   329  	o.Type = model.TEAM_OPEN
   330  	o.AllowOpenInvite = true
   331  
   332  	require.Nil(t, (<-ss.Team().Save(&o)).Err)
   333  
   334  	p := model.Team{}
   335  	p.DisplayName = "ADisplayName" + model.NewId()
   336  	p.Name = "zz" + model.NewId() + "a"
   337  	p.Email = MakeEmail()
   338  	p.Type = model.TEAM_OPEN
   339  	p.AllowOpenInvite = false
   340  
   341  	require.Nil(t, (<-ss.Team().Save(&p)).Err)
   342  
   343  	testCases := []struct {
   344  		Name            string
   345  		Term            string
   346  		ExpectedLenth   int
   347  		ExpectedFirstId string
   348  	}{
   349  		{
   350  			"Search for private team name",
   351  			p.Name,
   352  			1,
   353  			p.Id,
   354  		},
   355  		{
   356  			"Search for private team displayName",
   357  			p.DisplayName,
   358  			1,
   359  			p.Id,
   360  		},
   361  		{
   362  			"Search for private team without results",
   363  			"junk",
   364  			0,
   365  			"",
   366  		},
   367  		{
   368  			"Search for a open team (expected no results)",
   369  			o.DisplayName,
   370  			0,
   371  			"",
   372  		},
   373  	}
   374  
   375  	for _, tc := range testCases {
   376  		t.Run(tc.Name, func(t *testing.T) {
   377  			r1 := <-ss.Team().SearchPrivate(tc.Term)
   378  			require.Nil(t, r1.Err)
   379  			results := r1.Data.([]*model.Team)
   380  			require.Equal(t, tc.ExpectedLenth, len(results))
   381  			if tc.ExpectedFirstId != "" {
   382  				assert.Equal(t, tc.ExpectedFirstId, results[0].Id)
   383  			}
   384  		})
   385  	}
   386  }
   387  
   388  func testTeamStoreGetByIniviteId(t *testing.T, ss store.Store) {
   389  	o1 := model.Team{}
   390  	o1.DisplayName = "DisplayName"
   391  	o1.Name = "z-z-z" + model.NewId() + "b"
   392  	o1.Email = MakeEmail()
   393  	o1.Type = model.TEAM_OPEN
   394  	o1.InviteId = model.NewId()
   395  
   396  	if err := (<-ss.Team().Save(&o1)).Err; err != nil {
   397  		t.Fatal(err)
   398  	}
   399  
   400  	o2 := model.Team{}
   401  	o2.DisplayName = "DisplayName"
   402  	o2.Name = "zz" + model.NewId() + "b"
   403  	o2.Email = MakeEmail()
   404  	o2.Type = model.TEAM_OPEN
   405  
   406  	if err := (<-ss.Team().Save(&o2)).Err; err != nil {
   407  		t.Fatal(err)
   408  	}
   409  
   410  	if r1 := <-ss.Team().GetByInviteId(o1.InviteId); r1.Err != nil {
   411  		t.Fatal(r1.Err)
   412  	} else {
   413  		if r1.Data.(*model.Team).ToJson() != o1.ToJson() {
   414  			t.Fatal("invalid returned team")
   415  		}
   416  	}
   417  
   418  	o2.InviteId = ""
   419  	<-ss.Team().Update(&o2)
   420  
   421  	if r1 := <-ss.Team().GetByInviteId(o2.Id); r1.Err != nil {
   422  		t.Fatal(r1.Err)
   423  	} else {
   424  		if r1.Data.(*model.Team).Id != o2.Id {
   425  			t.Fatal("invalid returned team")
   426  		}
   427  	}
   428  
   429  	if err := (<-ss.Team().GetByInviteId("")).Err; err == nil {
   430  		t.Fatal("Missing id should have failed")
   431  	}
   432  }
   433  
   434  func testTeamStoreByUserId(t *testing.T, ss store.Store) {
   435  	o1 := &model.Team{}
   436  	o1.DisplayName = "DisplayName"
   437  	o1.Name = "z-z-z" + model.NewId() + "b"
   438  	o1.Email = MakeEmail()
   439  	o1.Type = model.TEAM_OPEN
   440  	o1.InviteId = model.NewId()
   441  	o1 = store.Must(ss.Team().Save(o1)).(*model.Team)
   442  
   443  	m1 := &model.TeamMember{TeamId: o1.Id, UserId: model.NewId()}
   444  	store.Must(ss.Team().SaveMember(m1, -1))
   445  
   446  	if r1 := <-ss.Team().GetTeamsByUserId(m1.UserId); r1.Err != nil {
   447  		t.Fatal(r1.Err)
   448  	} else {
   449  		teams := r1.Data.([]*model.Team)
   450  		if len(teams) == 0 {
   451  			t.Fatal("Should return a team")
   452  		}
   453  
   454  		if teams[0].Id != o1.Id {
   455  			t.Fatal("should be a member")
   456  		}
   457  
   458  	}
   459  }
   460  
   461  func testGetAllTeamListing(t *testing.T, ss store.Store) {
   462  	o1 := model.Team{}
   463  	o1.DisplayName = "DisplayName"
   464  	o1.Name = "z-z-z" + model.NewId() + "b"
   465  	o1.Email = MakeEmail()
   466  	o1.Type = model.TEAM_OPEN
   467  	o1.AllowOpenInvite = true
   468  	store.Must(ss.Team().Save(&o1))
   469  
   470  	o2 := model.Team{}
   471  	o2.DisplayName = "DisplayName"
   472  	o2.Name = "zz" + model.NewId() + "b"
   473  	o2.Email = MakeEmail()
   474  	o2.Type = model.TEAM_OPEN
   475  	store.Must(ss.Team().Save(&o2))
   476  
   477  	o3 := model.Team{}
   478  	o3.DisplayName = "DisplayName"
   479  	o3.Name = "z-z-z" + model.NewId() + "b"
   480  	o3.Email = MakeEmail()
   481  	o3.Type = model.TEAM_INVITE
   482  	o3.AllowOpenInvite = true
   483  	store.Must(ss.Team().Save(&o3))
   484  
   485  	o4 := model.Team{}
   486  	o4.DisplayName = "DisplayName"
   487  	o4.Name = "zz" + model.NewId() + "b"
   488  	o4.Email = MakeEmail()
   489  	o4.Type = model.TEAM_INVITE
   490  	store.Must(ss.Team().Save(&o4))
   491  
   492  	if r1 := <-ss.Team().GetAllTeamListing(); r1.Err != nil {
   493  		t.Fatal(r1.Err)
   494  	} else {
   495  		teams := r1.Data.([]*model.Team)
   496  
   497  		for _, team := range teams {
   498  			if !team.AllowOpenInvite {
   499  				t.Fatal("should have returned team with AllowOpenInvite as true")
   500  			}
   501  		}
   502  
   503  		if len(teams) == 0 {
   504  			t.Fatal("failed team listing")
   505  		}
   506  	}
   507  }
   508  
   509  func testGetAllTeamPageListing(t *testing.T, ss store.Store) {
   510  	o1 := model.Team{}
   511  	o1.DisplayName = "DisplayName"
   512  	o1.Name = "z-z-z" + model.NewId() + "b"
   513  	o1.Email = MakeEmail()
   514  	o1.Type = model.TEAM_OPEN
   515  	o1.AllowOpenInvite = true
   516  	store.Must(ss.Team().Save(&o1))
   517  
   518  	o2 := model.Team{}
   519  	o2.DisplayName = "DisplayName"
   520  	o2.Name = "zz" + model.NewId() + "b"
   521  	o2.Email = MakeEmail()
   522  	o2.Type = model.TEAM_OPEN
   523  	o2.AllowOpenInvite = false
   524  	store.Must(ss.Team().Save(&o2))
   525  
   526  	o3 := model.Team{}
   527  	o3.DisplayName = "DisplayName"
   528  	o3.Name = "z-z-z" + model.NewId() + "b"
   529  	o3.Email = MakeEmail()
   530  	o3.Type = model.TEAM_INVITE
   531  	o3.AllowOpenInvite = true
   532  	store.Must(ss.Team().Save(&o3))
   533  
   534  	o4 := model.Team{}
   535  	o4.DisplayName = "DisplayName"
   536  	o4.Name = "zz" + model.NewId() + "b"
   537  	o4.Email = MakeEmail()
   538  	o4.Type = model.TEAM_INVITE
   539  	o4.AllowOpenInvite = false
   540  	store.Must(ss.Team().Save(&o4))
   541  
   542  	if r1 := <-ss.Team().GetAllTeamPageListing(0, 10); r1.Err != nil {
   543  		t.Fatal(r1.Err)
   544  	} else {
   545  		teams := r1.Data.([]*model.Team)
   546  
   547  		for _, team := range teams {
   548  			if !team.AllowOpenInvite {
   549  				t.Fatal("should have returned team with AllowOpenInvite as true")
   550  			}
   551  		}
   552  
   553  		if len(teams) > 10 {
   554  			t.Fatal("should have returned max of 10 teams")
   555  		}
   556  	}
   557  
   558  	o5 := model.Team{}
   559  	o5.DisplayName = "DisplayName"
   560  	o5.Name = "z-z-z" + model.NewId() + "b"
   561  	o5.Email = MakeEmail()
   562  	o5.Type = model.TEAM_OPEN
   563  	o5.AllowOpenInvite = true
   564  	store.Must(ss.Team().Save(&o5))
   565  
   566  	if r1 := <-ss.Team().GetAllTeamPageListing(0, 4); r1.Err != nil {
   567  		t.Fatal(r1.Err)
   568  	} else {
   569  		teams := r1.Data.([]*model.Team)
   570  
   571  		for _, team := range teams {
   572  			if !team.AllowOpenInvite {
   573  				t.Fatal("should have returned team with AllowOpenInvite as true")
   574  			}
   575  		}
   576  
   577  		if len(teams) > 4 {
   578  			t.Fatal("should have returned max of 4 teams")
   579  		}
   580  	}
   581  
   582  	if r1 := <-ss.Team().GetAllTeamPageListing(1, 1); r1.Err != nil {
   583  		t.Fatal(r1.Err)
   584  	} else {
   585  		teams := r1.Data.([]*model.Team)
   586  
   587  		for _, team := range teams {
   588  			if !team.AllowOpenInvite {
   589  				t.Fatal("should have returned team with AllowOpenInvite as true")
   590  			}
   591  		}
   592  
   593  		if len(teams) > 1 {
   594  			t.Fatal("should have returned max of 1 team")
   595  		}
   596  	}
   597  }
   598  
   599  func testGetAllPrivateTeamListing(t *testing.T, ss store.Store) {
   600  	o1 := model.Team{}
   601  	o1.DisplayName = "DisplayName"
   602  	o1.Name = "z-z-z" + model.NewId() + "b"
   603  	o1.Email = MakeEmail()
   604  	o1.Type = model.TEAM_OPEN
   605  	o1.AllowOpenInvite = true
   606  	store.Must(ss.Team().Save(&o1))
   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  	store.Must(ss.Team().Save(&o2))
   614  
   615  	o3 := model.Team{}
   616  	o3.DisplayName = "DisplayName"
   617  	o3.Name = "z-z-z" + model.NewId() + "b"
   618  	o3.Email = MakeEmail()
   619  	o3.Type = model.TEAM_INVITE
   620  	o3.AllowOpenInvite = true
   621  	store.Must(ss.Team().Save(&o3))
   622  
   623  	o4 := model.Team{}
   624  	o4.DisplayName = "DisplayName"
   625  	o4.Name = "zz" + model.NewId() + "b"
   626  	o4.Email = MakeEmail()
   627  	o4.Type = model.TEAM_INVITE
   628  	store.Must(ss.Team().Save(&o4))
   629  
   630  	if r1 := <-ss.Team().GetAllPrivateTeamListing(); r1.Err != nil {
   631  		t.Fatal(r1.Err)
   632  	} else {
   633  		teams := r1.Data.([]*model.Team)
   634  
   635  		for _, team := range teams {
   636  			if team.AllowOpenInvite {
   637  				t.Fatal("should have returned team with AllowOpenInvite as false")
   638  			}
   639  		}
   640  
   641  		if len(teams) == 0 {
   642  			t.Fatal("failed team listing")
   643  		}
   644  	}
   645  }
   646  
   647  func testGetAllPrivateTeamPageListing(t *testing.T, ss store.Store) {
   648  	o1 := model.Team{}
   649  	o1.DisplayName = "DisplayName"
   650  	o1.Name = "z-z-z" + model.NewId() + "b"
   651  	o1.Email = MakeEmail()
   652  	o1.Type = model.TEAM_OPEN
   653  	o1.AllowOpenInvite = true
   654  	store.Must(ss.Team().Save(&o1))
   655  
   656  	o2 := model.Team{}
   657  	o2.DisplayName = "DisplayName"
   658  	o2.Name = "zz" + model.NewId() + "b"
   659  	o2.Email = MakeEmail()
   660  	o2.Type = model.TEAM_OPEN
   661  	o2.AllowOpenInvite = false
   662  	store.Must(ss.Team().Save(&o2))
   663  
   664  	o3 := model.Team{}
   665  	o3.DisplayName = "DisplayName"
   666  	o3.Name = "z-z-z" + model.NewId() + "b"
   667  	o3.Email = MakeEmail()
   668  	o3.Type = model.TEAM_INVITE
   669  	o3.AllowOpenInvite = true
   670  	store.Must(ss.Team().Save(&o3))
   671  
   672  	o4 := model.Team{}
   673  	o4.DisplayName = "DisplayName"
   674  	o4.Name = "zz" + model.NewId() + "b"
   675  	o4.Email = MakeEmail()
   676  	o4.Type = model.TEAM_INVITE
   677  	o4.AllowOpenInvite = false
   678  	store.Must(ss.Team().Save(&o4))
   679  
   680  	if r1 := <-ss.Team().GetAllPrivateTeamPageListing(0, 10); r1.Err != nil {
   681  		t.Fatal(r1.Err)
   682  	} else {
   683  		teams := r1.Data.([]*model.Team)
   684  
   685  		for _, team := range teams {
   686  			if team.AllowOpenInvite {
   687  				t.Fatal("should have returned team with AllowOpenInvite as false")
   688  			}
   689  		}
   690  
   691  		if len(teams) > 10 {
   692  			t.Fatal("should have returned max of 10 teams")
   693  		}
   694  	}
   695  
   696  	o5 := model.Team{}
   697  	o5.DisplayName = "DisplayName"
   698  	o5.Name = "z-z-z" + model.NewId() + "b"
   699  	o5.Email = MakeEmail()
   700  	o5.Type = model.TEAM_OPEN
   701  	o5.AllowOpenInvite = true
   702  	store.Must(ss.Team().Save(&o5))
   703  
   704  	if r1 := <-ss.Team().GetAllPrivateTeamPageListing(0, 4); r1.Err != nil {
   705  		t.Fatal(r1.Err)
   706  	} else {
   707  		teams := r1.Data.([]*model.Team)
   708  
   709  		for _, team := range teams {
   710  			if team.AllowOpenInvite {
   711  				t.Fatal("should have returned team with AllowOpenInvite as false")
   712  			}
   713  		}
   714  
   715  		if len(teams) > 4 {
   716  			t.Fatal("should have returned max of 4 teams")
   717  		}
   718  	}
   719  
   720  	if r1 := <-ss.Team().GetAllPrivateTeamPageListing(1, 1); r1.Err != nil {
   721  		t.Fatal(r1.Err)
   722  	} else {
   723  		teams := r1.Data.([]*model.Team)
   724  
   725  		for _, team := range teams {
   726  			if team.AllowOpenInvite {
   727  				t.Fatal("should have returned team with AllowOpenInvite as false")
   728  			}
   729  		}
   730  
   731  		if len(teams) > 1 {
   732  			t.Fatal("should have returned max of 1 team")
   733  		}
   734  	}
   735  }
   736  
   737  func testDelete(t *testing.T, ss store.Store) {
   738  	o1 := model.Team{}
   739  	o1.DisplayName = "DisplayName"
   740  	o1.Name = "z-z-z" + model.NewId() + "b"
   741  	o1.Email = MakeEmail()
   742  	o1.Type = model.TEAM_OPEN
   743  	o1.AllowOpenInvite = true
   744  	store.Must(ss.Team().Save(&o1))
   745  
   746  	o2 := model.Team{}
   747  	o2.DisplayName = "DisplayName"
   748  	o2.Name = "zz" + model.NewId() + "b"
   749  	o2.Email = MakeEmail()
   750  	o2.Type = model.TEAM_OPEN
   751  	store.Must(ss.Team().Save(&o2))
   752  
   753  	if r1 := <-ss.Team().PermanentDelete(o1.Id); r1.Err != nil {
   754  		t.Fatal(r1.Err)
   755  	}
   756  }
   757  
   758  func testTeamCount(t *testing.T, ss store.Store) {
   759  	o1 := model.Team{}
   760  	o1.DisplayName = "DisplayName"
   761  	o1.Name = "z-z-z" + model.NewId() + "b"
   762  	o1.Email = MakeEmail()
   763  	o1.Type = model.TEAM_OPEN
   764  	o1.AllowOpenInvite = true
   765  	store.Must(ss.Team().Save(&o1))
   766  
   767  	if r1 := <-ss.Team().AnalyticsTeamCount(); r1.Err != nil {
   768  		t.Fatal(r1.Err)
   769  	} else {
   770  		if r1.Data.(int64) == 0 {
   771  			t.Fatal("should be at least 1 team")
   772  		}
   773  	}
   774  }
   775  
   776  func testTeamMembers(t *testing.T, ss store.Store) {
   777  	teamId1 := model.NewId()
   778  	teamId2 := model.NewId()
   779  
   780  	m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
   781  	m2 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
   782  	m3 := &model.TeamMember{TeamId: teamId2, UserId: model.NewId()}
   783  
   784  	if r1 := <-ss.Team().SaveMember(m1, -1); r1.Err != nil {
   785  		t.Fatal(r1.Err)
   786  	}
   787  
   788  	store.Must(ss.Team().SaveMember(m2, -1))
   789  	store.Must(ss.Team().SaveMember(m3, -1))
   790  
   791  	if r1 := <-ss.Team().GetMembers(teamId1, 0, 100); r1.Err != nil {
   792  		t.Fatal(r1.Err)
   793  	} else {
   794  		ms := r1.Data.([]*model.TeamMember)
   795  		require.Len(t, ms, 2)
   796  	}
   797  
   798  	if r1 := <-ss.Team().GetMembers(teamId2, 0, 100); r1.Err != nil {
   799  		t.Fatal(r1.Err)
   800  	} else {
   801  		ms := r1.Data.([]*model.TeamMember)
   802  
   803  		require.Len(t, ms, 1)
   804  		require.Equal(t, m3.UserId, ms[0].UserId)
   805  	}
   806  
   807  	if r1 := <-ss.Team().GetTeamsForUser(m1.UserId); r1.Err != nil {
   808  		t.Fatal(r1.Err)
   809  	} else {
   810  		ms := r1.Data.([]*model.TeamMember)
   811  
   812  		require.Len(t, ms, 1)
   813  		require.Equal(t, m1.TeamId, ms[0].TeamId)
   814  	}
   815  
   816  	if r1 := <-ss.Team().RemoveMember(teamId1, m1.UserId); r1.Err != nil {
   817  		t.Fatal(r1.Err)
   818  	}
   819  
   820  	if r1 := <-ss.Team().GetMembers(teamId1, 0, 100); r1.Err != nil {
   821  		t.Fatal(r1.Err)
   822  	} else {
   823  		ms := r1.Data.([]*model.TeamMember)
   824  
   825  		require.Len(t, ms, 1)
   826  		require.Equal(t, m2.UserId, ms[0].UserId)
   827  	}
   828  
   829  	store.Must(ss.Team().SaveMember(m1, -1))
   830  
   831  	if r1 := <-ss.Team().RemoveAllMembersByTeam(teamId1); r1.Err != nil {
   832  		t.Fatal(r1.Err)
   833  	}
   834  
   835  	if r1 := <-ss.Team().GetMembers(teamId1, 0, 100); r1.Err != nil {
   836  		t.Fatal(r1.Err)
   837  	} else {
   838  		ms := r1.Data.([]*model.TeamMember)
   839  
   840  		require.Len(t, ms, 0)
   841  	}
   842  
   843  	uid := model.NewId()
   844  	m4 := &model.TeamMember{TeamId: teamId1, UserId: uid}
   845  	m5 := &model.TeamMember{TeamId: teamId2, UserId: uid}
   846  	store.Must(ss.Team().SaveMember(m4, -1))
   847  	store.Must(ss.Team().SaveMember(m5, -1))
   848  
   849  	if r1 := <-ss.Team().GetTeamsForUser(uid); r1.Err != nil {
   850  		t.Fatal(r1.Err)
   851  	} else {
   852  		ms := r1.Data.([]*model.TeamMember)
   853  
   854  		require.Len(t, ms, 2)
   855  	}
   856  
   857  	if r1 := <-ss.Team().RemoveAllMembersByUser(uid); r1.Err != nil {
   858  		t.Fatal(r1.Err)
   859  	}
   860  
   861  	if r1 := <-ss.Team().GetTeamsForUser(m1.UserId); r1.Err != nil {
   862  		t.Fatal(r1.Err)
   863  	} else {
   864  		ms := r1.Data.([]*model.TeamMember)
   865  
   866  		require.Len(t, ms, 0)
   867  	}
   868  }
   869  
   870  func testTeamMembersWithPagination(t *testing.T, ss store.Store) {
   871  	teamId1 := model.NewId()
   872  	teamId2 := model.NewId()
   873  
   874  	m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
   875  	m2 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
   876  	m3 := &model.TeamMember{TeamId: teamId2, UserId: model.NewId()}
   877  
   878  	r1 := <-ss.Team().SaveMember(m1, -1)
   879  	require.Nil(t, r1.Err)
   880  
   881  	store.Must(ss.Team().SaveMember(m2, -1))
   882  	store.Must(ss.Team().SaveMember(m3, -1))
   883  
   884  	r1 = <-ss.Team().GetTeamsForUserWithPagination(m1.UserId, 0, 1)
   885  	require.Nil(t, r1.Err)
   886  	ms := r1.Data.([]*model.TeamMember)
   887  
   888  	require.Len(t, ms, 1)
   889  	require.Equal(t, m1.TeamId, ms[0].TeamId)
   890  
   891  	r1 = <-ss.Team().RemoveMember(teamId1, m1.UserId)
   892  	require.Nil(t, r1.Err)
   893  
   894  	r1 = <-ss.Team().GetMembers(teamId1, 0, 100)
   895  	require.Nil(t, r1.Err)
   896  
   897  	ms = r1.Data.([]*model.TeamMember)
   898  	require.Len(t, ms, 1)
   899  	require.Equal(t, m2.UserId, ms[0].UserId)
   900  
   901  	store.Must(ss.Team().SaveMember(m1, -1))
   902  
   903  	r1 = <-ss.Team().RemoveAllMembersByTeam(teamId1)
   904  	require.Nil(t, r1.Err)
   905  
   906  	uid := model.NewId()
   907  	m4 := &model.TeamMember{TeamId: teamId1, UserId: uid}
   908  	m5 := &model.TeamMember{TeamId: teamId2, UserId: uid}
   909  	store.Must(ss.Team().SaveMember(m4, -1))
   910  	store.Must(ss.Team().SaveMember(m5, -1))
   911  
   912  	r1 = <-ss.Team().GetTeamsForUserWithPagination(uid, 0, 1)
   913  	require.Nil(t, r1.Err)
   914  	ms = r1.Data.([]*model.TeamMember)
   915  	require.Len(t, ms, 1)
   916  
   917  	r1 = <-ss.Team().RemoveAllMembersByUser(uid)
   918  	require.Nil(t, r1.Err)
   919  
   920  	r1 = <-ss.Team().GetTeamsForUserWithPagination(uid, 1, 1)
   921  	require.Nil(t, r1.Err)
   922  	ms = r1.Data.([]*model.TeamMember)
   923  	require.Len(t, ms, 0)
   924  }
   925  
   926  func testSaveTeamMemberMaxMembers(t *testing.T, ss store.Store) {
   927  	maxUsersPerTeam := 5
   928  
   929  	team := store.Must(ss.Team().Save(&model.Team{
   930  		DisplayName: "DisplayName",
   931  		Name:        "z-z-z" + model.NewId() + "b",
   932  		Type:        model.TEAM_OPEN,
   933  	})).(*model.Team)
   934  	defer func() {
   935  		<-ss.Team().PermanentDelete(team.Id)
   936  	}()
   937  
   938  	userIds := make([]string, maxUsersPerTeam)
   939  
   940  	for i := 0; i < maxUsersPerTeam; i++ {
   941  		userIds[i] = store.Must(ss.User().Save(&model.User{
   942  			Username: model.NewId(),
   943  			Email:    MakeEmail(),
   944  		})).(*model.User).Id
   945  
   946  		defer func(userId string) {
   947  			<-ss.User().PermanentDelete(userId)
   948  		}(userIds[i])
   949  
   950  		store.Must(ss.Team().SaveMember(&model.TeamMember{
   951  			TeamId: team.Id,
   952  			UserId: userIds[i],
   953  		}, maxUsersPerTeam))
   954  
   955  		defer func(userId string) {
   956  			<-ss.Team().RemoveMember(team.Id, userId)
   957  		}(userIds[i])
   958  	}
   959  
   960  	if result := <-ss.Team().GetTotalMemberCount(team.Id); result.Err != nil {
   961  		t.Fatal(result.Err)
   962  	} else if count := result.Data.(int64); int(count) != maxUsersPerTeam {
   963  		t.Fatalf("should start with 5 team members, had %v instead", count)
   964  	}
   965  
   966  	newUserId := store.Must(ss.User().Save(&model.User{
   967  		Username: model.NewId(),
   968  		Email:    MakeEmail(),
   969  	})).(*model.User).Id
   970  	defer func() {
   971  		<-ss.User().PermanentDelete(newUserId)
   972  	}()
   973  
   974  	if result := <-ss.Team().SaveMember(&model.TeamMember{
   975  		TeamId: team.Id,
   976  		UserId: newUserId,
   977  	}, maxUsersPerTeam); result.Err == nil {
   978  		t.Fatal("shouldn't be able to save member when at maximum members per team")
   979  	}
   980  
   981  	if result := <-ss.Team().GetTotalMemberCount(team.Id); result.Err != nil {
   982  		t.Fatal(result.Err)
   983  	} else if count := result.Data.(int64); int(count) != maxUsersPerTeam {
   984  		t.Fatalf("should still have 5 team members, had %v instead", count)
   985  	}
   986  
   987  	// Leaving the team from the UI sets DeleteAt instead of using TeamStore.RemoveMember
   988  	store.Must(ss.Team().UpdateMember(&model.TeamMember{
   989  		TeamId:   team.Id,
   990  		UserId:   userIds[0],
   991  		DeleteAt: 1234,
   992  	}))
   993  
   994  	if result := <-ss.Team().GetTotalMemberCount(team.Id); result.Err != nil {
   995  		t.Fatal(result.Err)
   996  	} else if count := result.Data.(int64); int(count) != maxUsersPerTeam-1 {
   997  		t.Fatalf("should now only have 4 team members, had %v instead", count)
   998  	}
   999  
  1000  	if result := <-ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: newUserId}, maxUsersPerTeam); result.Err != nil {
  1001  		t.Fatal("should've been able to save new member after deleting one", result.Err)
  1002  	} else {
  1003  		defer func(userId string) {
  1004  			<-ss.Team().RemoveMember(team.Id, userId)
  1005  		}(newUserId)
  1006  	}
  1007  
  1008  	if result := <-ss.Team().GetTotalMemberCount(team.Id); result.Err != nil {
  1009  		t.Fatal(result.Err)
  1010  	} else if count := result.Data.(int64); int(count) != maxUsersPerTeam {
  1011  		t.Fatalf("should have 5 team members again, had %v instead", count)
  1012  	}
  1013  
  1014  	// Deactivating a user should make them stop counting against max members
  1015  	user2 := store.Must(ss.User().Get(userIds[1])).(*model.User)
  1016  	user2.DeleteAt = 1234
  1017  	store.Must(ss.User().Update(user2, true))
  1018  
  1019  	newUserId2 := store.Must(ss.User().Save(&model.User{
  1020  		Username: model.NewId(),
  1021  		Email:    MakeEmail(),
  1022  	})).(*model.User).Id
  1023  	if result := <-ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: newUserId2}, maxUsersPerTeam); result.Err != nil {
  1024  		t.Fatal("should've been able to save new member after deleting one", result.Err)
  1025  	} else {
  1026  		defer func(userId string) {
  1027  			<-ss.Team().RemoveMember(team.Id, userId)
  1028  		}(newUserId2)
  1029  	}
  1030  }
  1031  
  1032  func testGetTeamMember(t *testing.T, ss store.Store) {
  1033  	teamId1 := model.NewId()
  1034  
  1035  	m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
  1036  	store.Must(ss.Team().SaveMember(m1, -1))
  1037  
  1038  	if r := <-ss.Team().GetMember(m1.TeamId, m1.UserId); r.Err != nil {
  1039  		t.Fatal(r.Err)
  1040  	} else {
  1041  		rm1 := r.Data.(*model.TeamMember)
  1042  
  1043  		if rm1.TeamId != m1.TeamId {
  1044  			t.Fatal("bad team id")
  1045  		}
  1046  
  1047  		if rm1.UserId != m1.UserId {
  1048  			t.Fatal("bad user id")
  1049  		}
  1050  	}
  1051  
  1052  	if r := <-ss.Team().GetMember(m1.TeamId, ""); r.Err == nil {
  1053  		t.Fatal("empty user id - should have failed")
  1054  	}
  1055  
  1056  	if r := <-ss.Team().GetMember("", m1.UserId); r.Err == nil {
  1057  		t.Fatal("empty team id - should have failed")
  1058  	}
  1059  
  1060  	// Test with a custom team scheme.
  1061  	s2 := &model.Scheme{
  1062  		Name:        model.NewId(),
  1063  		DisplayName: model.NewId(),
  1064  		Description: model.NewId(),
  1065  		Scope:       model.SCHEME_SCOPE_TEAM,
  1066  	}
  1067  	s2 = (<-ss.Scheme().Save(s2)).Data.(*model.Scheme)
  1068  	t.Log(s2)
  1069  
  1070  	t2 := store.Must(ss.Team().Save(&model.Team{
  1071  		DisplayName: "DisplayName",
  1072  		Name:        "z-z-z" + model.NewId() + "b",
  1073  		Type:        model.TEAM_OPEN,
  1074  		SchemeId:    &s2.Id,
  1075  	})).(*model.Team)
  1076  
  1077  	defer func() {
  1078  		<-ss.Team().PermanentDelete(t2.Id)
  1079  	}()
  1080  
  1081  	m2 := &model.TeamMember{TeamId: t2.Id, UserId: model.NewId(), SchemeUser: true}
  1082  	store.Must(ss.Team().SaveMember(m2, -1))
  1083  
  1084  	r2 := <-ss.Team().GetMember(m2.TeamId, m2.UserId)
  1085  	require.Nil(t, r2.Err)
  1086  	m3 := r2.Data.(*model.TeamMember)
  1087  	t.Log(m3)
  1088  
  1089  	assert.Equal(t, s2.DefaultTeamUserRole, m3.Roles)
  1090  }
  1091  
  1092  func testGetTeamMembersByIds(t *testing.T, ss store.Store) {
  1093  	teamId1 := model.NewId()
  1094  
  1095  	m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
  1096  	store.Must(ss.Team().SaveMember(m1, -1))
  1097  
  1098  	if r := <-ss.Team().GetMembersByIds(m1.TeamId, []string{m1.UserId}); r.Err != nil {
  1099  		t.Fatal(r.Err)
  1100  	} else {
  1101  		rm1 := r.Data.([]*model.TeamMember)[0]
  1102  
  1103  		if rm1.TeamId != m1.TeamId {
  1104  			t.Fatal("bad team id")
  1105  		}
  1106  
  1107  		if rm1.UserId != m1.UserId {
  1108  			t.Fatal("bad user id")
  1109  		}
  1110  	}
  1111  
  1112  	m2 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
  1113  	store.Must(ss.Team().SaveMember(m2, -1))
  1114  
  1115  	if r := <-ss.Team().GetMembersByIds(m1.TeamId, []string{m1.UserId, m2.UserId, model.NewId()}); r.Err != nil {
  1116  		t.Fatal(r.Err)
  1117  	} else {
  1118  		rm := r.Data.([]*model.TeamMember)
  1119  
  1120  		if len(rm) != 2 {
  1121  			t.Fatal("return wrong number of results")
  1122  		}
  1123  	}
  1124  
  1125  	if r := <-ss.Team().GetMembersByIds(m1.TeamId, []string{}); r.Err == nil {
  1126  		t.Fatal("empty user ids - should have failed")
  1127  	}
  1128  }
  1129  
  1130  func testTeamStoreMemberCount(t *testing.T, ss store.Store) {
  1131  	u1 := &model.User{}
  1132  	u1.Email = MakeEmail()
  1133  	store.Must(ss.User().Save(u1))
  1134  
  1135  	u2 := &model.User{}
  1136  	u2.Email = MakeEmail()
  1137  	u2.DeleteAt = 1
  1138  	store.Must(ss.User().Save(u2))
  1139  
  1140  	teamId1 := model.NewId()
  1141  	m1 := &model.TeamMember{TeamId: teamId1, UserId: u1.Id}
  1142  	store.Must(ss.Team().SaveMember(m1, -1))
  1143  
  1144  	m2 := &model.TeamMember{TeamId: teamId1, UserId: u2.Id}
  1145  	store.Must(ss.Team().SaveMember(m2, -1))
  1146  
  1147  	if result := <-ss.Team().GetTotalMemberCount(teamId1); result.Err != nil {
  1148  		t.Fatal(result.Err)
  1149  	} else {
  1150  		if result.Data.(int64) != 2 {
  1151  			t.Fatal("wrong count")
  1152  		}
  1153  	}
  1154  
  1155  	if result := <-ss.Team().GetActiveMemberCount(teamId1); result.Err != nil {
  1156  		t.Fatal(result.Err)
  1157  	} else {
  1158  		if result.Data.(int64) != 1 {
  1159  			t.Fatal("wrong count")
  1160  		}
  1161  	}
  1162  
  1163  	m3 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
  1164  	store.Must(ss.Team().SaveMember(m3, -1))
  1165  
  1166  	if result := <-ss.Team().GetTotalMemberCount(teamId1); result.Err != nil {
  1167  		t.Fatal(result.Err)
  1168  	} else {
  1169  		if result.Data.(int64) != 2 {
  1170  			t.Fatal("wrong count")
  1171  		}
  1172  	}
  1173  
  1174  	if result := <-ss.Team().GetActiveMemberCount(teamId1); result.Err != nil {
  1175  		t.Fatal(result.Err)
  1176  	} else {
  1177  		if result.Data.(int64) != 1 {
  1178  			t.Fatal("wrong count")
  1179  		}
  1180  	}
  1181  }
  1182  
  1183  func testGetChannelUnreadsForAllTeams(t *testing.T, ss store.Store) {
  1184  	teamId1 := model.NewId()
  1185  	teamId2 := model.NewId()
  1186  
  1187  	uid := model.NewId()
  1188  	m1 := &model.TeamMember{TeamId: teamId1, UserId: uid}
  1189  	m2 := &model.TeamMember{TeamId: teamId2, UserId: uid}
  1190  	store.Must(ss.Team().SaveMember(m1, -1))
  1191  	store.Must(ss.Team().SaveMember(m2, -1))
  1192  
  1193  	c1 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100}
  1194  	store.Must(ss.Channel().Save(c1, -1))
  1195  	c2 := &model.Channel{TeamId: m2.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100}
  1196  	store.Must(ss.Channel().Save(c2, -1))
  1197  
  1198  	cm1 := &model.ChannelMember{ChannelId: c1.Id, UserId: m1.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90}
  1199  	store.Must(ss.Channel().SaveMember(cm1))
  1200  	cm2 := &model.ChannelMember{ChannelId: c2.Id, UserId: m2.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90}
  1201  	store.Must(ss.Channel().SaveMember(cm2))
  1202  
  1203  	if r1 := <-ss.Team().GetChannelUnreadsForAllTeams("", uid); r1.Err != nil {
  1204  		t.Fatal(r1.Err)
  1205  	} else {
  1206  		ms := r1.Data.([]*model.ChannelUnread)
  1207  		membersMap := make(map[string]bool)
  1208  		for i := range ms {
  1209  			id := ms[i].TeamId
  1210  			if _, ok := membersMap[id]; !ok {
  1211  				membersMap[id] = true
  1212  			}
  1213  		}
  1214  		if len(membersMap) != 2 {
  1215  			t.Fatal("Should be the unreads for all the teams")
  1216  		}
  1217  
  1218  		if ms[0].MsgCount != 10 {
  1219  			t.Fatal("subtraction failed")
  1220  		}
  1221  	}
  1222  
  1223  	if r2 := <-ss.Team().GetChannelUnreadsForAllTeams(teamId1, uid); r2.Err != nil {
  1224  		t.Fatal(r2.Err)
  1225  	} else {
  1226  		ms := r2.Data.([]*model.ChannelUnread)
  1227  		membersMap := make(map[string]bool)
  1228  		for i := range ms {
  1229  			id := ms[i].TeamId
  1230  			if _, ok := membersMap[id]; !ok {
  1231  				membersMap[id] = true
  1232  			}
  1233  		}
  1234  
  1235  		if len(membersMap) != 1 {
  1236  			t.Fatal("Should be the unreads for just one team")
  1237  		}
  1238  
  1239  		if ms[0].MsgCount != 10 {
  1240  			t.Fatal("subtraction failed")
  1241  		}
  1242  	}
  1243  
  1244  	if r1 := <-ss.Team().RemoveAllMembersByUser(uid); r1.Err != nil {
  1245  		t.Fatal(r1.Err)
  1246  	}
  1247  }
  1248  
  1249  func testGetChannelUnreadsForTeam(t *testing.T, ss store.Store) {
  1250  	teamId1 := model.NewId()
  1251  
  1252  	uid := model.NewId()
  1253  	m1 := &model.TeamMember{TeamId: teamId1, UserId: uid}
  1254  	store.Must(ss.Team().SaveMember(m1, -1))
  1255  
  1256  	c1 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100}
  1257  	store.Must(ss.Channel().Save(c1, -1))
  1258  	c2 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100}
  1259  	store.Must(ss.Channel().Save(c2, -1))
  1260  
  1261  	cm1 := &model.ChannelMember{ChannelId: c1.Id, UserId: m1.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90}
  1262  	store.Must(ss.Channel().SaveMember(cm1))
  1263  	cm2 := &model.ChannelMember{ChannelId: c2.Id, UserId: m1.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90}
  1264  	store.Must(ss.Channel().SaveMember(cm2))
  1265  
  1266  	if r1 := <-ss.Team().GetChannelUnreadsForTeam(m1.TeamId, m1.UserId); r1.Err != nil {
  1267  		t.Fatal(r1.Err)
  1268  	} else {
  1269  		ms := r1.Data.([]*model.ChannelUnread)
  1270  		if len(ms) != 2 {
  1271  			t.Fatal("wrong length")
  1272  		}
  1273  
  1274  		if ms[0].MsgCount != 10 {
  1275  			t.Fatal("subtraction failed")
  1276  		}
  1277  	}
  1278  }
  1279  
  1280  func testUpdateLastTeamIconUpdate(t *testing.T, ss store.Store) {
  1281  
  1282  	// team icon initially updated a second ago
  1283  	lastTeamIconUpdateInitial := model.GetMillis() - 1000
  1284  
  1285  	o1 := &model.Team{}
  1286  	o1.DisplayName = "Display Name"
  1287  	o1.Name = "z-z-z" + model.NewId() + "b"
  1288  	o1.Email = MakeEmail()
  1289  	o1.Type = model.TEAM_OPEN
  1290  	o1.LastTeamIconUpdate = lastTeamIconUpdateInitial
  1291  	o1 = (<-ss.Team().Save(o1)).Data.(*model.Team)
  1292  
  1293  	curTime := model.GetMillis()
  1294  
  1295  	if err := (<-ss.Team().UpdateLastTeamIconUpdate(o1.Id, curTime)).Err; err != nil {
  1296  		t.Fatal(err)
  1297  	}
  1298  
  1299  	ro1 := (<-ss.Team().Get(o1.Id)).Data.(*model.Team)
  1300  	if ro1.LastTeamIconUpdate <= lastTeamIconUpdateInitial {
  1301  		t.Fatal("LastTeamIconUpdate not updated")
  1302  	}
  1303  }
  1304  
  1305  func testGetTeamsByScheme(t *testing.T, ss store.Store) {
  1306  	// Create some schemes.
  1307  	s1 := &model.Scheme{
  1308  		DisplayName: model.NewId(),
  1309  		Name:        model.NewId(),
  1310  		Description: model.NewId(),
  1311  		Scope:       model.SCHEME_SCOPE_TEAM,
  1312  	}
  1313  
  1314  	s2 := &model.Scheme{
  1315  		DisplayName: model.NewId(),
  1316  		Name:        model.NewId(),
  1317  		Description: model.NewId(),
  1318  		Scope:       model.SCHEME_SCOPE_TEAM,
  1319  	}
  1320  
  1321  	s1 = (<-ss.Scheme().Save(s1)).Data.(*model.Scheme)
  1322  	s2 = (<-ss.Scheme().Save(s2)).Data.(*model.Scheme)
  1323  
  1324  	// Create and save some teams.
  1325  	t1 := &model.Team{
  1326  		Name:        model.NewId(),
  1327  		DisplayName: model.NewId(),
  1328  		Email:       MakeEmail(),
  1329  		Type:        model.TEAM_OPEN,
  1330  		SchemeId:    &s1.Id,
  1331  	}
  1332  
  1333  	t2 := &model.Team{
  1334  		Name:        model.NewId(),
  1335  		DisplayName: model.NewId(),
  1336  		Email:       MakeEmail(),
  1337  		Type:        model.TEAM_OPEN,
  1338  		SchemeId:    &s1.Id,
  1339  	}
  1340  
  1341  	t3 := &model.Team{
  1342  		Name:        model.NewId(),
  1343  		DisplayName: model.NewId(),
  1344  		Email:       MakeEmail(),
  1345  		Type:        model.TEAM_OPEN,
  1346  	}
  1347  
  1348  	_ = (<-ss.Team().Save(t1)).Data.(*model.Team)
  1349  	_ = (<-ss.Team().Save(t2)).Data.(*model.Team)
  1350  	_ = (<-ss.Team().Save(t3)).Data.(*model.Team)
  1351  
  1352  	// Get the teams by a valid Scheme ID.
  1353  	res1 := <-ss.Team().GetTeamsByScheme(s1.Id, 0, 100)
  1354  	assert.Nil(t, res1.Err)
  1355  	d1 := res1.Data.([]*model.Team)
  1356  	assert.Len(t, d1, 2)
  1357  
  1358  	// Get the teams by a valid Scheme ID where there aren't any matching Teams.
  1359  	res2 := <-ss.Team().GetTeamsByScheme(s2.Id, 0, 100)
  1360  	assert.Nil(t, res2.Err)
  1361  	d2 := res2.Data.([]*model.Team)
  1362  	assert.Len(t, d2, 0)
  1363  
  1364  	// Get the teams by an invalid Scheme ID.
  1365  	res3 := <-ss.Team().GetTeamsByScheme(model.NewId(), 0, 100)
  1366  	assert.Nil(t, res3.Err)
  1367  	d3 := res3.Data.([]*model.Team)
  1368  	assert.Len(t, d3, 0)
  1369  }
  1370  
  1371  func testTeamStoreMigrateTeamMembers(t *testing.T, ss store.Store) {
  1372  	s1 := model.NewId()
  1373  	t1 := &model.Team{
  1374  		DisplayName: "Name",
  1375  		Name:        "z-z-z" + model.NewId() + "b",
  1376  		Email:       MakeEmail(),
  1377  		Type:        model.TEAM_OPEN,
  1378  		InviteId:    model.NewId(),
  1379  		SchemeId:    &s1,
  1380  	}
  1381  	t1 = store.Must(ss.Team().Save(t1)).(*model.Team)
  1382  
  1383  	tm1 := &model.TeamMember{
  1384  		TeamId:        t1.Id,
  1385  		UserId:        model.NewId(),
  1386  		ExplicitRoles: "team_admin team_user",
  1387  	}
  1388  	tm2 := &model.TeamMember{
  1389  		TeamId:        t1.Id,
  1390  		UserId:        model.NewId(),
  1391  		ExplicitRoles: "team_user",
  1392  	}
  1393  	tm3 := &model.TeamMember{
  1394  		TeamId:        t1.Id,
  1395  		UserId:        model.NewId(),
  1396  		ExplicitRoles: "something_else",
  1397  	}
  1398  
  1399  	tm1 = (<-ss.Team().SaveMember(tm1, -1)).Data.(*model.TeamMember)
  1400  	tm2 = (<-ss.Team().SaveMember(tm2, -1)).Data.(*model.TeamMember)
  1401  	tm3 = (<-ss.Team().SaveMember(tm3, -1)).Data.(*model.TeamMember)
  1402  
  1403  	lastDoneTeamId := strings.Repeat("0", 26)
  1404  	lastDoneUserId := strings.Repeat("0", 26)
  1405  
  1406  	for {
  1407  		res := <-ss.Team().MigrateTeamMembers(lastDoneTeamId, lastDoneUserId)
  1408  		if assert.Nil(t, res.Err) {
  1409  			if res.Data == nil {
  1410  				break
  1411  			}
  1412  			data := res.Data.(map[string]string)
  1413  			lastDoneTeamId = data["TeamId"]
  1414  			lastDoneUserId = data["UserId"]
  1415  		}
  1416  	}
  1417  
  1418  	res1 := <-ss.Team().GetMember(tm1.TeamId, tm1.UserId)
  1419  	assert.Nil(t, res1.Err)
  1420  	tm1b := res1.Data.(*model.TeamMember)
  1421  	assert.Equal(t, "", tm1b.ExplicitRoles)
  1422  	assert.True(t, tm1b.SchemeUser)
  1423  	assert.True(t, tm1b.SchemeAdmin)
  1424  
  1425  	res2 := <-ss.Team().GetMember(tm2.TeamId, tm2.UserId)
  1426  	assert.Nil(t, res2.Err)
  1427  	tm2b := res2.Data.(*model.TeamMember)
  1428  	assert.Equal(t, "", tm2b.ExplicitRoles)
  1429  	assert.True(t, tm2b.SchemeUser)
  1430  	assert.False(t, tm2b.SchemeAdmin)
  1431  
  1432  	res3 := <-ss.Team().GetMember(tm3.TeamId, tm3.UserId)
  1433  	assert.Nil(t, res3.Err)
  1434  	tm3b := res3.Data.(*model.TeamMember)
  1435  	assert.Equal(t, "something_else", tm3b.ExplicitRoles)
  1436  	assert.False(t, tm3b.SchemeUser)
  1437  	assert.False(t, tm3b.SchemeAdmin)
  1438  }
  1439  
  1440  func testResetAllTeamSchemes(t *testing.T, ss store.Store) {
  1441  	s1 := &model.Scheme{
  1442  		Name:        model.NewId(),
  1443  		DisplayName: model.NewId(),
  1444  		Description: model.NewId(),
  1445  		Scope:       model.SCHEME_SCOPE_TEAM,
  1446  	}
  1447  	s1 = (<-ss.Scheme().Save(s1)).Data.(*model.Scheme)
  1448  
  1449  	t1 := &model.Team{
  1450  		Name:        model.NewId(),
  1451  		DisplayName: model.NewId(),
  1452  		Email:       MakeEmail(),
  1453  		Type:        model.TEAM_OPEN,
  1454  		SchemeId:    &s1.Id,
  1455  	}
  1456  
  1457  	t2 := &model.Team{
  1458  		Name:        model.NewId(),
  1459  		DisplayName: model.NewId(),
  1460  		Email:       MakeEmail(),
  1461  		Type:        model.TEAM_OPEN,
  1462  		SchemeId:    &s1.Id,
  1463  	}
  1464  
  1465  	t1 = (<-ss.Team().Save(t1)).Data.(*model.Team)
  1466  	t2 = (<-ss.Team().Save(t2)).Data.(*model.Team)
  1467  
  1468  	assert.Equal(t, s1.Id, *t1.SchemeId)
  1469  	assert.Equal(t, s1.Id, *t2.SchemeId)
  1470  
  1471  	res := <-ss.Team().ResetAllTeamSchemes()
  1472  	assert.Nil(t, res.Err)
  1473  
  1474  	t1 = (<-ss.Team().Get(t1.Id)).Data.(*model.Team)
  1475  	t2 = (<-ss.Team().Get(t2.Id)).Data.(*model.Team)
  1476  
  1477  	assert.Equal(t, "", *t1.SchemeId)
  1478  	assert.Equal(t, "", *t2.SchemeId)
  1479  }
  1480  
  1481  func testTeamStoreClearAllCustomRoleAssignments(t *testing.T, ss store.Store) {
  1482  	m1 := &model.TeamMember{
  1483  		TeamId:        model.NewId(),
  1484  		UserId:        model.NewId(),
  1485  		ExplicitRoles: "team_user team_admin team_post_all_public",
  1486  	}
  1487  	m2 := &model.TeamMember{
  1488  		TeamId:        model.NewId(),
  1489  		UserId:        model.NewId(),
  1490  		ExplicitRoles: "team_user custom_role team_admin another_custom_role",
  1491  	}
  1492  	m3 := &model.TeamMember{
  1493  		TeamId:        model.NewId(),
  1494  		UserId:        model.NewId(),
  1495  		ExplicitRoles: "team_user",
  1496  	}
  1497  	m4 := &model.TeamMember{
  1498  		TeamId:        model.NewId(),
  1499  		UserId:        model.NewId(),
  1500  		ExplicitRoles: "custom_only",
  1501  	}
  1502  
  1503  	store.Must(ss.Team().SaveMember(m1, -1))
  1504  	store.Must(ss.Team().SaveMember(m2, -1))
  1505  	store.Must(ss.Team().SaveMember(m3, -1))
  1506  	store.Must(ss.Team().SaveMember(m4, -1))
  1507  
  1508  	require.Nil(t, (<-ss.Team().ClearAllCustomRoleAssignments()).Err)
  1509  
  1510  	r1 := <-ss.Team().GetMember(m1.TeamId, m1.UserId)
  1511  	require.Nil(t, r1.Err)
  1512  	assert.Equal(t, m1.ExplicitRoles, r1.Data.(*model.TeamMember).Roles)
  1513  
  1514  	r2 := <-ss.Team().GetMember(m2.TeamId, m2.UserId)
  1515  	require.Nil(t, r2.Err)
  1516  	assert.Equal(t, "team_user team_admin", r2.Data.(*model.TeamMember).Roles)
  1517  
  1518  	r3 := <-ss.Team().GetMember(m3.TeamId, m3.UserId)
  1519  	require.Nil(t, r3.Err)
  1520  	assert.Equal(t, m3.ExplicitRoles, r3.Data.(*model.TeamMember).Roles)
  1521  
  1522  	r4 := <-ss.Team().GetMember(m4.TeamId, m4.UserId)
  1523  	require.Nil(t, r4.Err)
  1524  	assert.Equal(t, "", r4.Data.(*model.TeamMember).Roles)
  1525  }
  1526  
  1527  func testTeamStoreAnalyticsGetTeamCountForScheme(t *testing.T, ss store.Store) {
  1528  	s1 := &model.Scheme{
  1529  		DisplayName: model.NewId(),
  1530  		Name:        model.NewId(),
  1531  		Description: model.NewId(),
  1532  		Scope:       model.SCHEME_SCOPE_TEAM,
  1533  	}
  1534  	s1 = (<-ss.Scheme().Save(s1)).Data.(*model.Scheme)
  1535  
  1536  	count1 := (<-ss.Team().AnalyticsGetTeamCountForScheme(s1.Id)).Data.(int64)
  1537  	assert.Equal(t, int64(0), count1)
  1538  
  1539  	t1 := &model.Team{
  1540  		Name:        model.NewId(),
  1541  		DisplayName: model.NewId(),
  1542  		Email:       MakeEmail(),
  1543  		Type:        model.TEAM_OPEN,
  1544  		SchemeId:    &s1.Id,
  1545  	}
  1546  	_ = (<-ss.Team().Save(t1)).Data.(*model.Team)
  1547  
  1548  	count2 := (<-ss.Team().AnalyticsGetTeamCountForScheme(s1.Id)).Data.(int64)
  1549  	assert.Equal(t, int64(1), count2)
  1550  
  1551  	t2 := &model.Team{
  1552  		Name:        model.NewId(),
  1553  		DisplayName: model.NewId(),
  1554  		Email:       MakeEmail(),
  1555  		Type:        model.TEAM_OPEN,
  1556  		SchemeId:    &s1.Id,
  1557  	}
  1558  	_ = (<-ss.Team().Save(t2)).Data.(*model.Team)
  1559  
  1560  	count3 := (<-ss.Team().AnalyticsGetTeamCountForScheme(s1.Id)).Data.(int64)
  1561  	assert.Equal(t, int64(2), count3)
  1562  
  1563  	t3 := &model.Team{
  1564  		Name:        model.NewId(),
  1565  		DisplayName: model.NewId(),
  1566  		Email:       MakeEmail(),
  1567  		Type:        model.TEAM_OPEN,
  1568  	}
  1569  	_ = (<-ss.Team().Save(t3)).Data.(*model.Team)
  1570  
  1571  	count4 := (<-ss.Team().AnalyticsGetTeamCountForScheme(s1.Id)).Data.(int64)
  1572  	assert.Equal(t, int64(2), count4)
  1573  
  1574  	t4 := &model.Team{
  1575  		Name:        model.NewId(),
  1576  		DisplayName: model.NewId(),
  1577  		Email:       MakeEmail(),
  1578  		Type:        model.TEAM_OPEN,
  1579  		SchemeId:    &s1.Id,
  1580  		DeleteAt:    model.GetMillis(),
  1581  	}
  1582  	_ = (<-ss.Team().Save(t4)).Data.(*model.Team)
  1583  
  1584  	count5 := (<-ss.Team().AnalyticsGetTeamCountForScheme(s1.Id)).Data.(int64)
  1585  	assert.Equal(t, int64(2), count5)
  1586  }
  1587  
  1588  func testTeamStoreGetAllForExportAfter(t *testing.T, ss store.Store) {
  1589  	t1 := model.Team{}
  1590  	t1.DisplayName = "Name"
  1591  	t1.Name = model.NewId()
  1592  	t1.Email = MakeEmail()
  1593  	t1.Type = model.TEAM_OPEN
  1594  	store.Must(ss.Team().Save(&t1))
  1595  
  1596  	r1 := <-ss.Team().GetAllForExportAfter(10000, strings.Repeat("0", 26))
  1597  	assert.Nil(t, r1.Err)
  1598  	d1 := r1.Data.([]*model.TeamForExport)
  1599  
  1600  	found := false
  1601  	for _, team := range d1 {
  1602  		if team.Id == t1.Id {
  1603  			found = true
  1604  			assert.Equal(t, t1.Id, team.Id)
  1605  			assert.Nil(t, team.SchemeId)
  1606  			assert.Equal(t, t1.Name, team.Name)
  1607  		}
  1608  	}
  1609  	assert.True(t, found)
  1610  }
  1611  
  1612  func testTeamStoreGetTeamMembersForExport(t *testing.T, ss store.Store) {
  1613  	t1 := model.Team{}
  1614  	t1.DisplayName = "Name"
  1615  	t1.Name = model.NewId()
  1616  	t1.Email = MakeEmail()
  1617  	t1.Type = model.TEAM_OPEN
  1618  	store.Must(ss.Team().Save(&t1))
  1619  
  1620  	u1 := model.User{}
  1621  	u1.Email = MakeEmail()
  1622  	u1.Nickname = model.NewId()
  1623  	store.Must(ss.User().Save(&u1))
  1624  
  1625  	u2 := model.User{}
  1626  	u2.Email = MakeEmail()
  1627  	u2.Nickname = model.NewId()
  1628  	store.Must(ss.User().Save(&u2))
  1629  
  1630  	m1 := &model.TeamMember{TeamId: t1.Id, UserId: u1.Id}
  1631  	store.Must(ss.Team().SaveMember(m1, -1))
  1632  
  1633  	m2 := &model.TeamMember{TeamId: t1.Id, UserId: u2.Id}
  1634  	store.Must(ss.Team().SaveMember(m2, -1))
  1635  
  1636  	r1 := <-ss.Team().GetTeamMembersForExport(u1.Id)
  1637  	assert.Nil(t, r1.Err)
  1638  
  1639  	d1 := r1.Data.([]*model.TeamMemberForExport)
  1640  	assert.Len(t, d1, 1)
  1641  
  1642  	tmfe1 := d1[0]
  1643  	assert.Equal(t, t1.Id, tmfe1.TeamId)
  1644  	assert.Equal(t, u1.Id, tmfe1.UserId)
  1645  	assert.Equal(t, t1.Name, tmfe1.TeamName)
  1646  }