github.com/xzl8028/xenia-server@v0.0.0-20190809101854-18450a97da63/store/storetest/team_store.go (about)

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