summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarrison Healey <harrisonmhealey@gmail.com>2017-06-06 14:39:31 -0400
committerJoram Wilander <jwawilander@gmail.com>2017-06-06 14:39:31 -0400
commit4d7b3b5687afe8e1bc069bce21f399b2f8bd6187 (patch)
tree95c7f2e9a329022e41f4d492b1f5a9542c99c114
parent3dc625a8bdafd34f924a08938fedf13b271af24e (diff)
downloadchat-4d7b3b5687afe8e1bc069bce21f399b2f8bd6187.tar.gz
chat-4d7b3b5687afe8e1bc069bce21f399b2f8bd6187.tar.bz2
chat-4d7b3b5687afe8e1bc069bce21f399b2f8bd6187.zip
PLT-6752/PLT-6755 Fixed users removed from a team counting against max team members (#6578)
* PLT-6752 Fixed users removed from a team counting against max team members * Updated unit tests for max team members * Fixed being able to have MaxUserPerTeam+1 users in a team
-rw-r--r--store/sql_team_store.go11
-rw-r--r--store/sql_team_store_test.go96
-rw-r--r--store/sql_user_store_test.go2
3 files changed, 106 insertions, 3 deletions
diff --git a/store/sql_team_store.go b/store/sql_team_store.go
index e6df0b656..ae06ec743 100644
--- a/store/sql_team_store.go
+++ b/store/sql_team_store.go
@@ -489,12 +489,19 @@ func (s SqlTeamStore) SaveMember(member *model.TeamMember) StoreChannel {
return
}
- if count, err := s.GetMaster().SelectInt("SELECT COUNT(0) FROM TeamMembers WHERE TeamId = :TeamId", map[string]interface{}{"TeamId": member.TeamId}); err != nil {
+ if count, err := s.GetMaster().SelectInt(
+ `SELECT
+ COUNT(0)
+ FROM
+ TeamMembers
+ WHERE
+ TeamId = :TeamId
+ AND DeleteAt = 0`, map[string]interface{}{"TeamId": member.TeamId}); err != nil {
result.Err = model.NewLocAppError("SqlUserStore.Save", "store.sql_user.save.member_count.app_error", nil, "teamId="+member.TeamId+", "+err.Error())
storeChannel <- result
close(storeChannel)
return
- } else if int(count) > utils.Cfg.TeamSettings.MaxUsersPerTeam {
+ } else if int(count) >= utils.Cfg.TeamSettings.MaxUsersPerTeam {
result.Err = model.NewLocAppError("SqlUserStore.Save", "store.sql_user.save.max_accounts.app_error", nil, "teamId="+member.TeamId)
storeChannel <- result
close(storeChannel)
diff --git a/store/sql_team_store_test.go b/store/sql_team_store_test.go
index ea3d406d3..f49124b09 100644
--- a/store/sql_team_store_test.go
+++ b/store/sql_team_store_test.go
@@ -8,6 +8,7 @@ import (
"time"
"github.com/mattermost/platform/model"
+ "github.com/mattermost/platform/utils"
)
func TestTeamStoreSave(t *testing.T) {
@@ -552,6 +553,101 @@ func TestTeamMembers(t *testing.T) {
}
}
+func TestSaveTeamMemberMaxMembers(t *testing.T) {
+ Setup()
+
+ MaxUsersPerTeam := utils.Cfg.TeamSettings.MaxUsersPerTeam
+ defer func() {
+ utils.Cfg.TeamSettings.MaxUsersPerTeam = MaxUsersPerTeam
+ }()
+ utils.Cfg.TeamSettings.MaxUsersPerTeam = 5
+
+ team := Must(store.Team().Save(&model.Team{
+ DisplayName: "DisplayName",
+ Name: "z-z-z" + model.NewId() + "b",
+ Type: model.TEAM_OPEN,
+ })).(*model.Team)
+ defer func() {
+ <-store.Team().PermanentDelete(team.Id)
+ }()
+
+ userIds := make([]string, utils.Cfg.TeamSettings.MaxUsersPerTeam)
+
+ for i := 0; i < utils.Cfg.TeamSettings.MaxUsersPerTeam; i++ {
+ userIds[i] = Must(store.User().Save(&model.User{
+ Username: model.NewId(),
+ Email: model.NewId(),
+ })).(*model.User).Id
+
+ defer func(userId string) {
+ <-store.User().PermanentDelete(userId)
+ }(userIds[i])
+
+ Must(store.Team().SaveMember(&model.TeamMember{
+ TeamId: team.Id,
+ UserId: userIds[i],
+ }))
+
+ defer func(userId string) {
+ <-store.Team().RemoveMember(team.Id, userId)
+ }(userIds[i])
+ }
+
+ if result := <-store.Team().GetTotalMemberCount(team.Id); result.Err != nil {
+ t.Fatal(result.Err)
+ } else if count := result.Data.(int64); int(count) != utils.Cfg.TeamSettings.MaxUsersPerTeam {
+ t.Fatalf("should start with 5 team members, had %v instead", count)
+ }
+
+ newUserId := Must(store.User().Save(&model.User{
+ Username: model.NewId(),
+ Email: model.NewId(),
+ })).(*model.User).Id
+ defer func() {
+ <-store.User().PermanentDelete(newUserId)
+ }()
+
+ if result := <-store.Team().SaveMember(&model.TeamMember{
+ TeamId: team.Id,
+ UserId: newUserId,
+ }); result.Err == nil {
+ t.Fatal("shouldn't be able to save member when at maximum members per team")
+ }
+
+ if result := <-store.Team().GetTotalMemberCount(team.Id); result.Err != nil {
+ t.Fatal(result.Err)
+ } else if count := result.Data.(int64); int(count) != utils.Cfg.TeamSettings.MaxUsersPerTeam {
+ t.Fatalf("should still have 5 team members, had %v instead", count)
+ }
+
+ // Leaving the team from the UI sets DeleteAt instead of using TeamStore.RemoveMember
+ Must(store.Team().UpdateMember(&model.TeamMember{
+ TeamId: team.Id,
+ UserId: userIds[0],
+ DeleteAt: 1234,
+ }))
+
+ if result := <-store.Team().GetTotalMemberCount(team.Id); result.Err != nil {
+ t.Fatal(result.Err)
+ } else if count := result.Data.(int64); int(count) != utils.Cfg.TeamSettings.MaxUsersPerTeam-1 {
+ t.Fatalf("should now only have 4 team members, had %v instead", count)
+ }
+
+ if result := <-store.Team().SaveMember(&model.TeamMember{TeamId: team.Id, UserId: newUserId}); result.Err != nil {
+ t.Fatal("should've been able to save new member after deleting one", result.Err)
+ } else {
+ defer func(userId string) {
+ <-store.Team().RemoveMember(team.Id, userId)
+ }(newUserId)
+ }
+
+ if result := <-store.Team().GetTotalMemberCount(team.Id); result.Err != nil {
+ t.Fatal(result.Err)
+ } else if count := result.Data.(int64); int(count) != utils.Cfg.TeamSettings.MaxUsersPerTeam {
+ t.Fatalf("should still have 5 team members again, had %v instead", count)
+ }
+}
+
func TestGetTeamMember(t *testing.T) {
Setup()
diff --git a/store/sql_user_store_test.go b/store/sql_user_store_test.go
index 367dc46dc..66bafda4e 100644
--- a/store/sql_user_store_test.go
+++ b/store/sql_user_store_test.go
@@ -46,7 +46,7 @@ func TestUserStoreSave(t *testing.T) {
t.Fatal("should be unique username")
}
- for i := 0; i < 50; i++ {
+ for i := 0; i < 49; i++ {
u1.Id = ""
u1.Email = model.NewId()
u1.Username = model.NewId()