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