github.com/wgh-/mattermost-server@v4.8.0-rc2+incompatible/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  	"testing"
     8  	"time"
     9  
    10  	"github.com/mattermost/mattermost-server/model"
    11  	"github.com/mattermost/mattermost-server/store"
    12  )
    13  
    14  func TestTeamStore(t *testing.T, ss store.Store) {
    15  	t.Run("Save", func(t *testing.T) { testTeamStoreSave(t, ss) })
    16  	t.Run("Update", func(t *testing.T) { testTeamStoreUpdate(t, ss) })
    17  	t.Run("UpdateDisplayName", func(t *testing.T) { testTeamStoreUpdateDisplayName(t, ss) })
    18  	t.Run("Get", func(t *testing.T) { testTeamStoreGet(t, ss) })
    19  	t.Run("GetByName", func(t *testing.T) { testTeamStoreGetByName(t, ss) })
    20  	t.Run("SearchByName", func(t *testing.T) { testTeamStoreSearchByName(t, ss) })
    21  	t.Run("SearchAll", func(t *testing.T) { testTeamStoreSearchAll(t, ss) })
    22  	t.Run("SearchOpen", func(t *testing.T) { testTeamStoreSearchOpen(t, ss) })
    23  	t.Run("GetByIniviteId", func(t *testing.T) { testTeamStoreGetByIniviteId(t, ss) })
    24  	t.Run("ByUserId", func(t *testing.T) { testTeamStoreByUserId(t, ss) })
    25  	t.Run("GetAllTeamListing", func(t *testing.T) { testGetAllTeamListing(t, ss) })
    26  	t.Run("GetAllTeamPageListing", func(t *testing.T) { testGetAllTeamPageListing(t, ss) })
    27  	t.Run("Delete", func(t *testing.T) { testDelete(t, ss) })
    28  	t.Run("TeamCount", func(t *testing.T) { testTeamCount(t, ss) })
    29  	t.Run("TeamMembers", func(t *testing.T) { testTeamMembers(t, ss) })
    30  	t.Run("SaveTeamMemberMaxMembers", func(t *testing.T) { testSaveTeamMemberMaxMembers(t, ss) })
    31  	t.Run("GetTeamMember", func(t *testing.T) { testGetTeamMember(t, ss) })
    32  	t.Run("GetTeamMembersByIds", func(t *testing.T) { testGetTeamMembersByIds(t, ss) })
    33  	t.Run("MemberCount", func(t *testing.T) { testTeamStoreMemberCount(t, ss) })
    34  	t.Run("GetChannelUnreadsForAllTeams", func(t *testing.T) { testGetChannelUnreadsForAllTeams(t, ss) })
    35  	t.Run("GetChannelUnreadsForTeam", func(t *testing.T) { testGetChannelUnreadsForTeam(t, ss) })
    36  }
    37  
    38  func testTeamStoreSave(t *testing.T, ss store.Store) {
    39  	o1 := model.Team{}
    40  	o1.DisplayName = "DisplayName"
    41  	o1.Name = "z-z-z" + model.NewId() + "b"
    42  	o1.Email = model.NewId() + "@nowhere.com"
    43  	o1.Type = model.TEAM_OPEN
    44  
    45  	if err := (<-ss.Team().Save(&o1)).Err; err != nil {
    46  		t.Fatal("couldn't save item", err)
    47  	}
    48  
    49  	if err := (<-ss.Team().Save(&o1)).Err; err == nil {
    50  		t.Fatal("shouldn't be able to update from save")
    51  	}
    52  
    53  	o1.Id = ""
    54  	if err := (<-ss.Team().Save(&o1)).Err; err == nil {
    55  		t.Fatal("should be unique domain")
    56  	}
    57  }
    58  
    59  func testTeamStoreUpdate(t *testing.T, ss store.Store) {
    60  	o1 := model.Team{}
    61  	o1.DisplayName = "DisplayName"
    62  	o1.Name = "z-z-z" + model.NewId() + "b"
    63  	o1.Email = model.NewId() + "@nowhere.com"
    64  	o1.Type = model.TEAM_OPEN
    65  	if err := (<-ss.Team().Save(&o1)).Err; err != nil {
    66  		t.Fatal(err)
    67  	}
    68  
    69  	time.Sleep(100 * time.Millisecond)
    70  
    71  	if err := (<-ss.Team().Update(&o1)).Err; err != nil {
    72  		t.Fatal(err)
    73  	}
    74  
    75  	o1.Id = "missing"
    76  	if err := (<-ss.Team().Update(&o1)).Err; err == nil {
    77  		t.Fatal("Update should have failed because of missing key")
    78  	}
    79  
    80  	o1.Id = model.NewId()
    81  	if err := (<-ss.Team().Update(&o1)).Err; err == nil {
    82  		t.Fatal("Update should have faile because id change")
    83  	}
    84  }
    85  
    86  func testTeamStoreUpdateDisplayName(t *testing.T, ss store.Store) {
    87  	o1 := &model.Team{}
    88  	o1.DisplayName = "Display Name"
    89  	o1.Name = "z-z-z" + model.NewId() + "b"
    90  	o1.Email = model.NewId() + "@nowhere.com"
    91  	o1.Type = model.TEAM_OPEN
    92  	o1 = (<-ss.Team().Save(o1)).Data.(*model.Team)
    93  
    94  	newDisplayName := "NewDisplayName"
    95  
    96  	if err := (<-ss.Team().UpdateDisplayName(newDisplayName, o1.Id)).Err; err != nil {
    97  		t.Fatal(err)
    98  	}
    99  
   100  	ro1 := (<-ss.Team().Get(o1.Id)).Data.(*model.Team)
   101  	if ro1.DisplayName != newDisplayName {
   102  		t.Fatal("DisplayName not updated")
   103  	}
   104  }
   105  
   106  func testTeamStoreGet(t *testing.T, ss store.Store) {
   107  	o1 := model.Team{}
   108  	o1.DisplayName = "DisplayName"
   109  	o1.Name = "z-z-z" + model.NewId() + "b"
   110  	o1.Email = model.NewId() + "@nowhere.com"
   111  	o1.Type = model.TEAM_OPEN
   112  	store.Must(ss.Team().Save(&o1))
   113  
   114  	if r1 := <-ss.Team().Get(o1.Id); r1.Err != nil {
   115  		t.Fatal(r1.Err)
   116  	} else {
   117  		if r1.Data.(*model.Team).ToJson() != o1.ToJson() {
   118  			t.Fatal("invalid returned team")
   119  		}
   120  	}
   121  
   122  	if err := (<-ss.Team().Get("")).Err; err == nil {
   123  		t.Fatal("Missing id should have failed")
   124  	}
   125  }
   126  
   127  func testTeamStoreGetByName(t *testing.T, ss store.Store) {
   128  	o1 := model.Team{}
   129  	o1.DisplayName = "DisplayName"
   130  	o1.Name = "z-z-z" + model.NewId() + "b"
   131  	o1.Email = model.NewId() + "@nowhere.com"
   132  	o1.Type = model.TEAM_OPEN
   133  
   134  	if err := (<-ss.Team().Save(&o1)).Err; err != nil {
   135  		t.Fatal(err)
   136  	}
   137  
   138  	if r1 := <-ss.Team().GetByName(o1.Name); r1.Err != nil {
   139  		t.Fatal(r1.Err)
   140  	} else {
   141  		if r1.Data.(*model.Team).ToJson() != o1.ToJson() {
   142  			t.Fatal("invalid returned team")
   143  		}
   144  	}
   145  
   146  	if err := (<-ss.Team().GetByName("")).Err; err == nil {
   147  		t.Fatal("Missing id should have failed")
   148  	}
   149  }
   150  
   151  func testTeamStoreSearchByName(t *testing.T, ss store.Store) {
   152  	o1 := model.Team{}
   153  	o1.DisplayName = "DisplayName"
   154  	var name = "zzz" + model.NewId()
   155  	o1.Name = name + "b"
   156  	o1.Email = model.NewId() + "@nowhere.com"
   157  	o1.Type = model.TEAM_OPEN
   158  
   159  	if err := (<-ss.Team().Save(&o1)).Err; err != nil {
   160  		t.Fatal(err)
   161  	}
   162  
   163  	if r1 := <-ss.Team().SearchByName(name); r1.Err != nil {
   164  		t.Fatal(r1.Err)
   165  	} else {
   166  		if r1.Data.([]*model.Team)[0].ToJson() != o1.ToJson() {
   167  			t.Fatal("invalid returned team")
   168  		}
   169  	}
   170  }
   171  
   172  func testTeamStoreSearchAll(t *testing.T, ss store.Store) {
   173  	o1 := model.Team{}
   174  	o1.DisplayName = "ADisplayName" + model.NewId()
   175  	o1.Name = "zz" + model.NewId() + "a"
   176  	o1.Email = model.NewId() + "@nowhere.com"
   177  	o1.Type = model.TEAM_OPEN
   178  
   179  	if err := (<-ss.Team().Save(&o1)).Err; err != nil {
   180  		t.Fatal(err)
   181  	}
   182  
   183  	p2 := model.Team{}
   184  	p2.DisplayName = "BDisplayName" + model.NewId()
   185  	p2.Name = "b" + model.NewId() + "b"
   186  	p2.Email = model.NewId() + "@nowhere.com"
   187  	p2.Type = model.TEAM_INVITE
   188  
   189  	if err := (<-ss.Team().Save(&p2)).Err; err != nil {
   190  		t.Fatal(err)
   191  	}
   192  
   193  	r1 := <-ss.Team().SearchAll(o1.Name)
   194  	if r1.Err != nil {
   195  		t.Fatal(r1.Err)
   196  	}
   197  	if len(r1.Data.([]*model.Team)) != 1 {
   198  		t.Fatal("should have returned 1 team")
   199  	}
   200  	if r1.Data.([]*model.Team)[0].ToJson() != o1.ToJson() {
   201  		t.Fatal("invalid returned team")
   202  	}
   203  
   204  	r1 = <-ss.Team().SearchAll(p2.DisplayName)
   205  	if r1.Err != nil {
   206  		t.Fatal(r1.Err)
   207  	}
   208  	if len(r1.Data.([]*model.Team)) != 1 {
   209  		t.Fatal("should have returned 1 team")
   210  	}
   211  	if r1.Data.([]*model.Team)[0].ToJson() != p2.ToJson() {
   212  		t.Fatal("invalid returned team")
   213  	}
   214  
   215  	r1 = <-ss.Team().SearchAll("junk")
   216  	if r1.Err != nil {
   217  		t.Fatal(r1.Err)
   218  	}
   219  	if len(r1.Data.([]*model.Team)) != 0 {
   220  		t.Fatal("should have not returned a team")
   221  	}
   222  }
   223  
   224  func testTeamStoreSearchOpen(t *testing.T, ss store.Store) {
   225  	o1 := model.Team{}
   226  	o1.DisplayName = "ADisplayName" + model.NewId()
   227  	o1.Name = "zz" + model.NewId() + "a"
   228  	o1.Email = model.NewId() + "@nowhere.com"
   229  	o1.Type = model.TEAM_OPEN
   230  	o1.AllowOpenInvite = true
   231  
   232  	if err := (<-ss.Team().Save(&o1)).Err; err != nil {
   233  		t.Fatal(err)
   234  	}
   235  
   236  	o2 := model.Team{}
   237  	o2.DisplayName = "ADisplayName" + model.NewId()
   238  	o2.Name = "zz" + model.NewId() + "a"
   239  	o2.Email = model.NewId() + "@nowhere.com"
   240  	o2.Type = model.TEAM_OPEN
   241  	o2.AllowOpenInvite = false
   242  
   243  	if err := (<-ss.Team().Save(&o2)).Err; err != nil {
   244  		t.Fatal(err)
   245  	}
   246  
   247  	p2 := model.Team{}
   248  	p2.DisplayName = "BDisplayName" + model.NewId()
   249  	p2.Name = "b" + model.NewId() + "b"
   250  	p2.Email = model.NewId() + "@nowhere.com"
   251  	p2.Type = model.TEAM_INVITE
   252  	p2.AllowOpenInvite = true
   253  
   254  	if err := (<-ss.Team().Save(&p2)).Err; err != nil {
   255  		t.Fatal(err)
   256  	}
   257  
   258  	r1 := <-ss.Team().SearchOpen(o1.Name)
   259  	if r1.Err != nil {
   260  		t.Fatal(r1.Err)
   261  	}
   262  	if len(r1.Data.([]*model.Team)) != 1 {
   263  		t.Fatal("should have returned 1 team")
   264  	}
   265  	if r1.Data.([]*model.Team)[0].ToJson() != o1.ToJson() {
   266  		t.Fatal("invalid returned team")
   267  	}
   268  
   269  	r1 = <-ss.Team().SearchOpen(o1.DisplayName)
   270  	if r1.Err != nil {
   271  		t.Fatal(r1.Err)
   272  	}
   273  	if len(r1.Data.([]*model.Team)) != 1 {
   274  		t.Fatal("should have returned 1 team")
   275  	}
   276  	if r1.Data.([]*model.Team)[0].ToJson() != o1.ToJson() {
   277  		t.Fatal("invalid returned team")
   278  	}
   279  
   280  	r1 = <-ss.Team().SearchOpen(p2.Name)
   281  	if r1.Err != nil {
   282  		t.Fatal(r1.Err)
   283  	}
   284  	if len(r1.Data.([]*model.Team)) != 0 {
   285  		t.Fatal("should have not returned a team")
   286  	}
   287  
   288  	r1 = <-ss.Team().SearchOpen(p2.DisplayName)
   289  	if r1.Err != nil {
   290  		t.Fatal(r1.Err)
   291  	}
   292  	if len(r1.Data.([]*model.Team)) != 0 {
   293  		t.Fatal("should have not returned a team")
   294  	}
   295  
   296  	r1 = <-ss.Team().SearchOpen("junk")
   297  	if r1.Err != nil {
   298  		t.Fatal(r1.Err)
   299  	}
   300  	if len(r1.Data.([]*model.Team)) != 0 {
   301  		t.Fatal("should have not returned a team")
   302  	}
   303  
   304  	r1 = <-ss.Team().SearchOpen(o2.DisplayName)
   305  	if r1.Err != nil {
   306  		t.Fatal(r1.Err)
   307  	}
   308  	if len(r1.Data.([]*model.Team)) != 0 {
   309  		t.Fatal("should have not returned a team")
   310  	}
   311  }
   312  
   313  func testTeamStoreGetByIniviteId(t *testing.T, ss store.Store) {
   314  	o1 := model.Team{}
   315  	o1.DisplayName = "DisplayName"
   316  	o1.Name = "z-z-z" + model.NewId() + "b"
   317  	o1.Email = model.NewId() + "@nowhere.com"
   318  	o1.Type = model.TEAM_OPEN
   319  	o1.InviteId = model.NewId()
   320  
   321  	if err := (<-ss.Team().Save(&o1)).Err; err != nil {
   322  		t.Fatal(err)
   323  	}
   324  
   325  	o2 := model.Team{}
   326  	o2.DisplayName = "DisplayName"
   327  	o2.Name = "zz" + model.NewId() + "b"
   328  	o2.Email = model.NewId() + "@nowhere.com"
   329  	o2.Type = model.TEAM_OPEN
   330  
   331  	if err := (<-ss.Team().Save(&o2)).Err; err != nil {
   332  		t.Fatal(err)
   333  	}
   334  
   335  	if r1 := <-ss.Team().GetByInviteId(o1.InviteId); r1.Err != nil {
   336  		t.Fatal(r1.Err)
   337  	} else {
   338  		if r1.Data.(*model.Team).ToJson() != o1.ToJson() {
   339  			t.Fatal("invalid returned team")
   340  		}
   341  	}
   342  
   343  	o2.InviteId = ""
   344  	<-ss.Team().Update(&o2)
   345  
   346  	if r1 := <-ss.Team().GetByInviteId(o2.Id); r1.Err != nil {
   347  		t.Fatal(r1.Err)
   348  	} else {
   349  		if r1.Data.(*model.Team).Id != o2.Id {
   350  			t.Fatal("invalid returned team")
   351  		}
   352  	}
   353  
   354  	if err := (<-ss.Team().GetByInviteId("")).Err; err == nil {
   355  		t.Fatal("Missing id should have failed")
   356  	}
   357  }
   358  
   359  func testTeamStoreByUserId(t *testing.T, ss store.Store) {
   360  	o1 := &model.Team{}
   361  	o1.DisplayName = "DisplayName"
   362  	o1.Name = "z-z-z" + model.NewId() + "b"
   363  	o1.Email = model.NewId() + "@nowhere.com"
   364  	o1.Type = model.TEAM_OPEN
   365  	o1.InviteId = model.NewId()
   366  	o1 = store.Must(ss.Team().Save(o1)).(*model.Team)
   367  
   368  	m1 := &model.TeamMember{TeamId: o1.Id, UserId: model.NewId()}
   369  	store.Must(ss.Team().SaveMember(m1, -1))
   370  
   371  	if r1 := <-ss.Team().GetTeamsByUserId(m1.UserId); r1.Err != nil {
   372  		t.Fatal(r1.Err)
   373  	} else {
   374  		teams := r1.Data.([]*model.Team)
   375  		if len(teams) == 0 {
   376  			t.Fatal("Should return a team")
   377  		}
   378  
   379  		if teams[0].Id != o1.Id {
   380  			t.Fatal("should be a member")
   381  		}
   382  
   383  	}
   384  }
   385  
   386  func testGetAllTeamListing(t *testing.T, ss store.Store) {
   387  	o1 := model.Team{}
   388  	o1.DisplayName = "DisplayName"
   389  	o1.Name = "z-z-z" + model.NewId() + "b"
   390  	o1.Email = model.NewId() + "@nowhere.com"
   391  	o1.Type = model.TEAM_OPEN
   392  	o1.AllowOpenInvite = true
   393  	store.Must(ss.Team().Save(&o1))
   394  
   395  	o2 := model.Team{}
   396  	o2.DisplayName = "DisplayName"
   397  	o2.Name = "zz" + model.NewId() + "b"
   398  	o2.Email = model.NewId() + "@nowhere.com"
   399  	o2.Type = model.TEAM_OPEN
   400  	store.Must(ss.Team().Save(&o2))
   401  
   402  	o3 := model.Team{}
   403  	o3.DisplayName = "DisplayName"
   404  	o3.Name = "z-z-z" + model.NewId() + "b"
   405  	o3.Email = model.NewId() + "@nowhere.com"
   406  	o3.Type = model.TEAM_INVITE
   407  	o3.AllowOpenInvite = true
   408  	store.Must(ss.Team().Save(&o3))
   409  
   410  	o4 := model.Team{}
   411  	o4.DisplayName = "DisplayName"
   412  	o4.Name = "zz" + model.NewId() + "b"
   413  	o4.Email = model.NewId() + "@nowhere.com"
   414  	o4.Type = model.TEAM_INVITE
   415  	store.Must(ss.Team().Save(&o4))
   416  
   417  	if r1 := <-ss.Team().GetAllTeamListing(); r1.Err != nil {
   418  		t.Fatal(r1.Err)
   419  	} else {
   420  		teams := r1.Data.([]*model.Team)
   421  
   422  		for _, team := range teams {
   423  			if !team.AllowOpenInvite {
   424  				t.Fatal("should have returned team with AllowOpenInvite as true")
   425  			}
   426  		}
   427  
   428  		if len(teams) == 0 {
   429  			t.Fatal("failed team listing")
   430  		}
   431  	}
   432  }
   433  
   434  func testGetAllTeamPageListing(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 = model.NewId() + "@nowhere.com"
   439  	o1.Type = model.TEAM_OPEN
   440  	o1.AllowOpenInvite = true
   441  	store.Must(ss.Team().Save(&o1))
   442  
   443  	o2 := model.Team{}
   444  	o2.DisplayName = "DisplayName"
   445  	o2.Name = "zz" + model.NewId() + "b"
   446  	o2.Email = model.NewId() + "@nowhere.com"
   447  	o2.Type = model.TEAM_OPEN
   448  	o2.AllowOpenInvite = false
   449  	store.Must(ss.Team().Save(&o2))
   450  
   451  	o3 := model.Team{}
   452  	o3.DisplayName = "DisplayName"
   453  	o3.Name = "z-z-z" + model.NewId() + "b"
   454  	o3.Email = model.NewId() + "@nowhere.com"
   455  	o3.Type = model.TEAM_INVITE
   456  	o3.AllowOpenInvite = true
   457  	store.Must(ss.Team().Save(&o3))
   458  
   459  	o4 := model.Team{}
   460  	o4.DisplayName = "DisplayName"
   461  	o4.Name = "zz" + model.NewId() + "b"
   462  	o4.Email = model.NewId() + "@nowhere.com"
   463  	o4.Type = model.TEAM_INVITE
   464  	o4.AllowOpenInvite = false
   465  	store.Must(ss.Team().Save(&o4))
   466  
   467  	if r1 := <-ss.Team().GetAllTeamPageListing(0, 10); r1.Err != nil {
   468  		t.Fatal(r1.Err)
   469  	} else {
   470  		teams := r1.Data.([]*model.Team)
   471  
   472  		for _, team := range teams {
   473  			if !team.AllowOpenInvite {
   474  				t.Fatal("should have returned team with AllowOpenInvite as true")
   475  			}
   476  		}
   477  
   478  		if len(teams) > 10 {
   479  			t.Fatal("should have returned max of 10 teams")
   480  		}
   481  	}
   482  
   483  	o5 := model.Team{}
   484  	o5.DisplayName = "DisplayName"
   485  	o5.Name = "z-z-z" + model.NewId() + "b"
   486  	o5.Email = model.NewId() + "@nowhere.com"
   487  	o5.Type = model.TEAM_OPEN
   488  	o5.AllowOpenInvite = true
   489  	store.Must(ss.Team().Save(&o5))
   490  
   491  	if r1 := <-ss.Team().GetAllTeamPageListing(0, 4); r1.Err != nil {
   492  		t.Fatal(r1.Err)
   493  	} else {
   494  		teams := r1.Data.([]*model.Team)
   495  
   496  		for _, team := range teams {
   497  			if !team.AllowOpenInvite {
   498  				t.Fatal("should have returned team with AllowOpenInvite as true")
   499  			}
   500  		}
   501  
   502  		if len(teams) > 4 {
   503  			t.Fatal("should have returned max of 4 teams")
   504  		}
   505  	}
   506  
   507  	if r1 := <-ss.Team().GetAllTeamPageListing(1, 1); r1.Err != nil {
   508  		t.Fatal(r1.Err)
   509  	} else {
   510  		teams := r1.Data.([]*model.Team)
   511  
   512  		for _, team := range teams {
   513  			if !team.AllowOpenInvite {
   514  				t.Fatal("should have returned team with AllowOpenInvite as true")
   515  			}
   516  		}
   517  
   518  		if len(teams) > 1 {
   519  			t.Fatal("should have returned max of 1 team")
   520  		}
   521  	}
   522  }
   523  
   524  func testDelete(t *testing.T, ss store.Store) {
   525  	o1 := model.Team{}
   526  	o1.DisplayName = "DisplayName"
   527  	o1.Name = "z-z-z" + model.NewId() + "b"
   528  	o1.Email = model.NewId() + "@nowhere.com"
   529  	o1.Type = model.TEAM_OPEN
   530  	o1.AllowOpenInvite = true
   531  	store.Must(ss.Team().Save(&o1))
   532  
   533  	o2 := model.Team{}
   534  	o2.DisplayName = "DisplayName"
   535  	o2.Name = "zz" + model.NewId() + "b"
   536  	o2.Email = model.NewId() + "@nowhere.com"
   537  	o2.Type = model.TEAM_OPEN
   538  	store.Must(ss.Team().Save(&o2))
   539  
   540  	if r1 := <-ss.Team().PermanentDelete(o1.Id); r1.Err != nil {
   541  		t.Fatal(r1.Err)
   542  	}
   543  }
   544  
   545  func testTeamCount(t *testing.T, ss store.Store) {
   546  	o1 := model.Team{}
   547  	o1.DisplayName = "DisplayName"
   548  	o1.Name = "z-z-z" + model.NewId() + "b"
   549  	o1.Email = model.NewId() + "@nowhere.com"
   550  	o1.Type = model.TEAM_OPEN
   551  	o1.AllowOpenInvite = true
   552  	store.Must(ss.Team().Save(&o1))
   553  
   554  	if r1 := <-ss.Team().AnalyticsTeamCount(); r1.Err != nil {
   555  		t.Fatal(r1.Err)
   556  	} else {
   557  		if r1.Data.(int64) == 0 {
   558  			t.Fatal("should be at least 1 team")
   559  		}
   560  	}
   561  }
   562  
   563  func testTeamMembers(t *testing.T, ss store.Store) {
   564  	teamId1 := model.NewId()
   565  	teamId2 := model.NewId()
   566  
   567  	m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
   568  	m2 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
   569  	m3 := &model.TeamMember{TeamId: teamId2, UserId: model.NewId()}
   570  
   571  	if r1 := <-ss.Team().SaveMember(m1, -1); r1.Err != nil {
   572  		t.Fatal(r1.Err)
   573  	}
   574  
   575  	store.Must(ss.Team().SaveMember(m2, -1))
   576  	store.Must(ss.Team().SaveMember(m3, -1))
   577  
   578  	if r1 := <-ss.Team().GetMembers(teamId1, 0, 100); r1.Err != nil {
   579  		t.Fatal(r1.Err)
   580  	} else {
   581  		ms := r1.Data.([]*model.TeamMember)
   582  
   583  		if len(ms) != 2 {
   584  			t.Fatal()
   585  		}
   586  	}
   587  
   588  	if r1 := <-ss.Team().GetMembers(teamId2, 0, 100); r1.Err != nil {
   589  		t.Fatal(r1.Err)
   590  	} else {
   591  		ms := r1.Data.([]*model.TeamMember)
   592  
   593  		if len(ms) != 1 {
   594  			t.Fatal()
   595  		}
   596  
   597  		if ms[0].UserId != m3.UserId {
   598  			t.Fatal()
   599  
   600  		}
   601  	}
   602  
   603  	if r1 := <-ss.Team().GetTeamsForUser(m1.UserId); r1.Err != nil {
   604  		t.Fatal(r1.Err)
   605  	} else {
   606  		ms := r1.Data.([]*model.TeamMember)
   607  
   608  		if len(ms) != 1 {
   609  			t.Fatal()
   610  		}
   611  
   612  		if ms[0].TeamId != m1.TeamId {
   613  			t.Fatal()
   614  
   615  		}
   616  	}
   617  
   618  	if r1 := <-ss.Team().RemoveMember(teamId1, m1.UserId); r1.Err != nil {
   619  		t.Fatal(r1.Err)
   620  	}
   621  
   622  	if r1 := <-ss.Team().GetMembers(teamId1, 0, 100); r1.Err != nil {
   623  		t.Fatal(r1.Err)
   624  	} else {
   625  		ms := r1.Data.([]*model.TeamMember)
   626  
   627  		if len(ms) != 1 {
   628  			t.Fatal()
   629  		}
   630  
   631  		if ms[0].UserId != m2.UserId {
   632  			t.Fatal()
   633  
   634  		}
   635  	}
   636  
   637  	store.Must(ss.Team().SaveMember(m1, -1))
   638  
   639  	if r1 := <-ss.Team().RemoveAllMembersByTeam(teamId1); r1.Err != nil {
   640  		t.Fatal(r1.Err)
   641  	}
   642  
   643  	if r1 := <-ss.Team().GetMembers(teamId1, 0, 100); r1.Err != nil {
   644  		t.Fatal(r1.Err)
   645  	} else {
   646  		ms := r1.Data.([]*model.TeamMember)
   647  
   648  		if len(ms) != 0 {
   649  			t.Fatal()
   650  		}
   651  	}
   652  
   653  	uid := model.NewId()
   654  	m4 := &model.TeamMember{TeamId: teamId1, UserId: uid}
   655  	m5 := &model.TeamMember{TeamId: teamId2, UserId: uid}
   656  	store.Must(ss.Team().SaveMember(m4, -1))
   657  	store.Must(ss.Team().SaveMember(m5, -1))
   658  
   659  	if r1 := <-ss.Team().GetTeamsForUser(uid); r1.Err != nil {
   660  		t.Fatal(r1.Err)
   661  	} else {
   662  		ms := r1.Data.([]*model.TeamMember)
   663  
   664  		if len(ms) != 2 {
   665  			t.Fatal()
   666  		}
   667  	}
   668  
   669  	if r1 := <-ss.Team().RemoveAllMembersByUser(uid); r1.Err != nil {
   670  		t.Fatal(r1.Err)
   671  	}
   672  
   673  	if r1 := <-ss.Team().GetTeamsForUser(m1.UserId); r1.Err != nil {
   674  		t.Fatal(r1.Err)
   675  	} else {
   676  		ms := r1.Data.([]*model.TeamMember)
   677  
   678  		if len(ms) != 0 {
   679  			t.Fatal()
   680  		}
   681  	}
   682  }
   683  
   684  func testSaveTeamMemberMaxMembers(t *testing.T, ss store.Store) {
   685  	maxUsersPerTeam := 5
   686  
   687  	team := store.Must(ss.Team().Save(&model.Team{
   688  		DisplayName: "DisplayName",
   689  		Name:        "z-z-z" + model.NewId() + "b",
   690  		Type:        model.TEAM_OPEN,
   691  	})).(*model.Team)
   692  	defer func() {
   693  		<-ss.Team().PermanentDelete(team.Id)
   694  	}()
   695  
   696  	userIds := make([]string, maxUsersPerTeam)
   697  
   698  	for i := 0; i < maxUsersPerTeam; i++ {
   699  		userIds[i] = store.Must(ss.User().Save(&model.User{
   700  			Username: model.NewId(),
   701  			Email:    model.NewId(),
   702  		})).(*model.User).Id
   703  
   704  		defer func(userId string) {
   705  			<-ss.User().PermanentDelete(userId)
   706  		}(userIds[i])
   707  
   708  		store.Must(ss.Team().SaveMember(&model.TeamMember{
   709  			TeamId: team.Id,
   710  			UserId: userIds[i],
   711  		}, maxUsersPerTeam))
   712  
   713  		defer func(userId string) {
   714  			<-ss.Team().RemoveMember(team.Id, userId)
   715  		}(userIds[i])
   716  	}
   717  
   718  	if result := <-ss.Team().GetTotalMemberCount(team.Id); result.Err != nil {
   719  		t.Fatal(result.Err)
   720  	} else if count := result.Data.(int64); int(count) != maxUsersPerTeam {
   721  		t.Fatalf("should start with 5 team members, had %v instead", count)
   722  	}
   723  
   724  	newUserId := store.Must(ss.User().Save(&model.User{
   725  		Username: model.NewId(),
   726  		Email:    model.NewId(),
   727  	})).(*model.User).Id
   728  	defer func() {
   729  		<-ss.User().PermanentDelete(newUserId)
   730  	}()
   731  
   732  	if result := <-ss.Team().SaveMember(&model.TeamMember{
   733  		TeamId: team.Id,
   734  		UserId: newUserId,
   735  	}, maxUsersPerTeam); result.Err == nil {
   736  		t.Fatal("shouldn't be able to save member when at maximum members per team")
   737  	}
   738  
   739  	if result := <-ss.Team().GetTotalMemberCount(team.Id); result.Err != nil {
   740  		t.Fatal(result.Err)
   741  	} else if count := result.Data.(int64); int(count) != maxUsersPerTeam {
   742  		t.Fatalf("should still have 5 team members, had %v instead", count)
   743  	}
   744  
   745  	// Leaving the team from the UI sets DeleteAt instead of using TeamStore.RemoveMember
   746  	store.Must(ss.Team().UpdateMember(&model.TeamMember{
   747  		TeamId:   team.Id,
   748  		UserId:   userIds[0],
   749  		DeleteAt: 1234,
   750  	}))
   751  
   752  	if result := <-ss.Team().GetTotalMemberCount(team.Id); result.Err != nil {
   753  		t.Fatal(result.Err)
   754  	} else if count := result.Data.(int64); int(count) != maxUsersPerTeam-1 {
   755  		t.Fatalf("should now only have 4 team members, had %v instead", count)
   756  	}
   757  
   758  	if result := <-ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: newUserId}, maxUsersPerTeam); result.Err != nil {
   759  		t.Fatal("should've been able to save new member after deleting one", result.Err)
   760  	} else {
   761  		defer func(userId string) {
   762  			<-ss.Team().RemoveMember(team.Id, userId)
   763  		}(newUserId)
   764  	}
   765  
   766  	if result := <-ss.Team().GetTotalMemberCount(team.Id); result.Err != nil {
   767  		t.Fatal(result.Err)
   768  	} else if count := result.Data.(int64); int(count) != maxUsersPerTeam {
   769  		t.Fatalf("should have 5 team members again, had %v instead", count)
   770  	}
   771  
   772  	// Deactivating a user should make them stop counting against max members
   773  	user2 := store.Must(ss.User().Get(userIds[1])).(*model.User)
   774  	user2.DeleteAt = 1234
   775  	store.Must(ss.User().Update(user2, true))
   776  
   777  	newUserId2 := store.Must(ss.User().Save(&model.User{
   778  		Username: model.NewId(),
   779  		Email:    model.NewId(),
   780  	})).(*model.User).Id
   781  	if result := <-ss.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: newUserId2}, maxUsersPerTeam); result.Err != nil {
   782  		t.Fatal("should've been able to save new member after deleting one", result.Err)
   783  	} else {
   784  		defer func(userId string) {
   785  			<-ss.Team().RemoveMember(team.Id, userId)
   786  		}(newUserId2)
   787  	}
   788  }
   789  
   790  func testGetTeamMember(t *testing.T, ss store.Store) {
   791  	teamId1 := model.NewId()
   792  
   793  	m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
   794  	store.Must(ss.Team().SaveMember(m1, -1))
   795  
   796  	if r := <-ss.Team().GetMember(m1.TeamId, m1.UserId); r.Err != nil {
   797  		t.Fatal(r.Err)
   798  	} else {
   799  		rm1 := r.Data.(*model.TeamMember)
   800  
   801  		if rm1.TeamId != m1.TeamId {
   802  			t.Fatal("bad team id")
   803  		}
   804  
   805  		if rm1.UserId != m1.UserId {
   806  			t.Fatal("bad user id")
   807  		}
   808  	}
   809  
   810  	if r := <-ss.Team().GetMember(m1.TeamId, ""); r.Err == nil {
   811  		t.Fatal("empty user id - should have failed")
   812  	}
   813  
   814  	if r := <-ss.Team().GetMember("", m1.UserId); r.Err == nil {
   815  		t.Fatal("empty team id - should have failed")
   816  	}
   817  }
   818  
   819  func testGetTeamMembersByIds(t *testing.T, ss store.Store) {
   820  	teamId1 := model.NewId()
   821  
   822  	m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
   823  	store.Must(ss.Team().SaveMember(m1, -1))
   824  
   825  	if r := <-ss.Team().GetMembersByIds(m1.TeamId, []string{m1.UserId}); r.Err != nil {
   826  		t.Fatal(r.Err)
   827  	} else {
   828  		rm1 := r.Data.([]*model.TeamMember)[0]
   829  
   830  		if rm1.TeamId != m1.TeamId {
   831  			t.Fatal("bad team id")
   832  		}
   833  
   834  		if rm1.UserId != m1.UserId {
   835  			t.Fatal("bad user id")
   836  		}
   837  	}
   838  
   839  	m2 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
   840  	store.Must(ss.Team().SaveMember(m2, -1))
   841  
   842  	if r := <-ss.Team().GetMembersByIds(m1.TeamId, []string{m1.UserId, m2.UserId, model.NewId()}); r.Err != nil {
   843  		t.Fatal(r.Err)
   844  	} else {
   845  		rm := r.Data.([]*model.TeamMember)
   846  
   847  		if len(rm) != 2 {
   848  			t.Fatal("return wrong number of results")
   849  		}
   850  	}
   851  
   852  	if r := <-ss.Team().GetMembersByIds(m1.TeamId, []string{}); r.Err == nil {
   853  		t.Fatal("empty user ids - should have failed")
   854  	}
   855  }
   856  
   857  func testTeamStoreMemberCount(t *testing.T, ss store.Store) {
   858  	u1 := &model.User{}
   859  	u1.Email = model.NewId()
   860  	store.Must(ss.User().Save(u1))
   861  
   862  	u2 := &model.User{}
   863  	u2.Email = model.NewId()
   864  	u2.DeleteAt = 1
   865  	store.Must(ss.User().Save(u2))
   866  
   867  	teamId1 := model.NewId()
   868  	m1 := &model.TeamMember{TeamId: teamId1, UserId: u1.Id}
   869  	store.Must(ss.Team().SaveMember(m1, -1))
   870  
   871  	m2 := &model.TeamMember{TeamId: teamId1, UserId: u2.Id}
   872  	store.Must(ss.Team().SaveMember(m2, -1))
   873  
   874  	if result := <-ss.Team().GetTotalMemberCount(teamId1); result.Err != nil {
   875  		t.Fatal(result.Err)
   876  	} else {
   877  		if result.Data.(int64) != 2 {
   878  			t.Fatal("wrong count")
   879  		}
   880  	}
   881  
   882  	if result := <-ss.Team().GetActiveMemberCount(teamId1); result.Err != nil {
   883  		t.Fatal(result.Err)
   884  	} else {
   885  		if result.Data.(int64) != 1 {
   886  			t.Fatal("wrong count")
   887  		}
   888  	}
   889  
   890  	m3 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
   891  	store.Must(ss.Team().SaveMember(m3, -1))
   892  
   893  	if result := <-ss.Team().GetTotalMemberCount(teamId1); result.Err != nil {
   894  		t.Fatal(result.Err)
   895  	} else {
   896  		if result.Data.(int64) != 2 {
   897  			t.Fatal("wrong count")
   898  		}
   899  	}
   900  
   901  	if result := <-ss.Team().GetActiveMemberCount(teamId1); result.Err != nil {
   902  		t.Fatal(result.Err)
   903  	} else {
   904  		if result.Data.(int64) != 1 {
   905  			t.Fatal("wrong count")
   906  		}
   907  	}
   908  }
   909  
   910  func testGetChannelUnreadsForAllTeams(t *testing.T, ss store.Store) {
   911  	teamId1 := model.NewId()
   912  	teamId2 := model.NewId()
   913  
   914  	uid := model.NewId()
   915  	m1 := &model.TeamMember{TeamId: teamId1, UserId: uid}
   916  	m2 := &model.TeamMember{TeamId: teamId2, UserId: uid}
   917  	store.Must(ss.Team().SaveMember(m1, -1))
   918  	store.Must(ss.Team().SaveMember(m2, -1))
   919  
   920  	c1 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100}
   921  	store.Must(ss.Channel().Save(c1, -1))
   922  	c2 := &model.Channel{TeamId: m2.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100}
   923  	store.Must(ss.Channel().Save(c2, -1))
   924  
   925  	cm1 := &model.ChannelMember{ChannelId: c1.Id, UserId: m1.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90}
   926  	store.Must(ss.Channel().SaveMember(cm1))
   927  	cm2 := &model.ChannelMember{ChannelId: c2.Id, UserId: m2.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90}
   928  	store.Must(ss.Channel().SaveMember(cm2))
   929  
   930  	if r1 := <-ss.Team().GetChannelUnreadsForAllTeams("", uid); r1.Err != nil {
   931  		t.Fatal(r1.Err)
   932  	} else {
   933  		ms := r1.Data.([]*model.ChannelUnread)
   934  		membersMap := make(map[string]bool)
   935  		for i := range ms {
   936  			id := ms[i].TeamId
   937  			if _, ok := membersMap[id]; !ok {
   938  				membersMap[id] = true
   939  			}
   940  		}
   941  		if len(membersMap) != 2 {
   942  			t.Fatal("Should be the unreads for all the teams")
   943  		}
   944  
   945  		if ms[0].MsgCount != 10 {
   946  			t.Fatal("subtraction failed")
   947  		}
   948  	}
   949  
   950  	if r2 := <-ss.Team().GetChannelUnreadsForAllTeams(teamId1, uid); r2.Err != nil {
   951  		t.Fatal(r2.Err)
   952  	} else {
   953  		ms := r2.Data.([]*model.ChannelUnread)
   954  		membersMap := make(map[string]bool)
   955  		for i := range ms {
   956  			id := ms[i].TeamId
   957  			if _, ok := membersMap[id]; !ok {
   958  				membersMap[id] = true
   959  			}
   960  		}
   961  
   962  		if len(membersMap) != 1 {
   963  			t.Fatal("Should be the unreads for just one team")
   964  		}
   965  
   966  		if ms[0].MsgCount != 10 {
   967  			t.Fatal("subtraction failed")
   968  		}
   969  	}
   970  
   971  	if r1 := <-ss.Team().RemoveAllMembersByUser(uid); r1.Err != nil {
   972  		t.Fatal(r1.Err)
   973  	}
   974  }
   975  
   976  func testGetChannelUnreadsForTeam(t *testing.T, ss store.Store) {
   977  	teamId1 := model.NewId()
   978  
   979  	uid := model.NewId()
   980  	m1 := &model.TeamMember{TeamId: teamId1, UserId: uid}
   981  	store.Must(ss.Team().SaveMember(m1, -1))
   982  
   983  	c1 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100}
   984  	store.Must(ss.Channel().Save(c1, -1))
   985  	c2 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.CHANNEL_OPEN, TotalMsgCount: 100}
   986  	store.Must(ss.Channel().Save(c2, -1))
   987  
   988  	cm1 := &model.ChannelMember{ChannelId: c1.Id, UserId: m1.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90}
   989  	store.Must(ss.Channel().SaveMember(cm1))
   990  	cm2 := &model.ChannelMember{ChannelId: c2.Id, UserId: m1.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90}
   991  	store.Must(ss.Channel().SaveMember(cm2))
   992  
   993  	if r1 := <-ss.Team().GetChannelUnreadsForTeam(m1.TeamId, m1.UserId); r1.Err != nil {
   994  		t.Fatal(r1.Err)
   995  	} else {
   996  		ms := r1.Data.([]*model.ChannelUnread)
   997  		if len(ms) != 2 {
   998  			t.Fatal("wrong length")
   999  		}
  1000  
  1001  		if ms[0].MsgCount != 10 {
  1002  			t.Fatal("subtraction failed")
  1003  		}
  1004  	}
  1005  }