mattermost-community-enterp.../channels/store/storetest/team_store.go
Claude ec1f89217a Merge: Complete Mattermost Server with Community Enterprise
Full Mattermost server source with integrated Community Enterprise features.
Includes vendor directory for offline/air-gapped builds.

Structure:
- enterprise-impl/: Enterprise feature implementations
- enterprise-community/: Init files that register implementations
- enterprise/: Bridge imports (community_imports.go)
- vendor/: All dependencies for offline builds

Build (online):
  go build ./cmd/mattermost

Build (offline/air-gapped):
  go build -mod=vendor ./cmd/mattermost

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-17 23:59:07 +09:00

3821 lines
116 KiB
Go

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
package storetest
import (
"context"
"errors"
"strings"
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/mattermost/mattermost/server/public/model"
"github.com/mattermost/mattermost/server/public/shared/request"
"github.com/mattermost/mattermost/server/v8/channels/store"
)
func cleanupTeamStore(t *testing.T, rctx request.CTX, ss store.Store) {
allTeams, err := ss.Team().GetAll()
for _, team := range allTeams {
ss.Team().PermanentDelete(team.Id)
}
assert.NoError(t, err)
}
func TestTeamStore(t *testing.T, rctx request.CTX, ss store.Store) {
createDefaultRoles(ss)
t.Run("Save", func(t *testing.T) { testTeamStoreSave(t, rctx, ss) })
t.Run("Update", func(t *testing.T) { testTeamStoreUpdate(t, rctx, ss) })
t.Run("Get", func(t *testing.T) { testTeamStoreGet(t, rctx, ss) })
t.Run("GetMany", func(t *testing.T) { testTeamStoreGetMany(t, rctx, ss) })
t.Run("GetByName", func(t *testing.T) { testTeamStoreGetByName(t, rctx, ss) })
t.Run("GetByNames", func(t *testing.T) { testTeamStoreGetByNames(t, rctx, ss) })
t.Run("SearchAll", func(t *testing.T) { testTeamStoreSearchAll(t, rctx, ss) })
t.Run("SearchOpen", func(t *testing.T) { testTeamStoreSearchOpen(t, rctx, ss) })
t.Run("SearchPrivate", func(t *testing.T) { testTeamStoreSearchPrivate(t, rctx, ss) })
t.Run("GetByInviteId", func(t *testing.T) { testTeamStoreGetByInviteId(t, rctx, ss) })
t.Run("ByUserId", func(t *testing.T) { testTeamStoreByUserId(t, rctx, ss) })
t.Run("GetAllTeamListing", func(t *testing.T) { testGetAllTeamListing(t, rctx, ss) })
t.Run("GetAllTeamPage", func(t *testing.T) { testTeamStoreGetAllPage(t, rctx, ss) })
t.Run("GetAllTeamPageListing", func(t *testing.T) { testGetAllTeamPageListing(t, rctx, ss) })
t.Run("GetAllPrivateTeamListing", func(t *testing.T) { testGetAllPrivateTeamListing(t, rctx, ss) })
t.Run("GetAllPrivateTeamPageListing", func(t *testing.T) { testGetAllPrivateTeamPageListing(t, rctx, ss) })
t.Run("GetAllPublicTeamPageListing", func(t *testing.T) { testGetAllPublicTeamPageListing(t, rctx, ss) })
t.Run("Delete", func(t *testing.T) { testDelete(t, rctx, ss) })
t.Run("TeamCount", func(t *testing.T) { testTeamCount(t, rctx, ss) })
t.Run("TeamPublicCount", func(t *testing.T) { testPublicTeamCount(t, rctx, ss) })
t.Run("TeamPrivateCount", func(t *testing.T) { testPrivateTeamCount(t, rctx, ss) })
t.Run("TeamMembers", func(t *testing.T) { testTeamMembers(t, rctx, ss) })
t.Run("TestGetMembers", func(t *testing.T) { testGetMembers(t, rctx, ss) })
t.Run("SaveMember", func(t *testing.T) { testTeamSaveMember(t, rctx, ss) })
t.Run("SaveMultipleMembers", func(t *testing.T) { testTeamSaveMultipleMembers(t, rctx, ss) })
t.Run("UpdateMember", func(t *testing.T) { testTeamUpdateMember(t, rctx, ss) })
t.Run("UpdateMultipleMembers", func(t *testing.T) { testTeamUpdateMultipleMembers(t, rctx, ss) })
t.Run("RemoveMember", func(t *testing.T) { testTeamRemoveMember(t, rctx, ss) })
t.Run("RemoveMembers", func(t *testing.T) { testTeamRemoveMembers(t, rctx, ss) })
t.Run("SaveTeamMemberMaxMembers", func(t *testing.T) { testSaveTeamMemberMaxMembers(t, rctx, ss) })
t.Run("GetTeamMember", func(t *testing.T) { testGetTeamMember(t, rctx, ss) })
t.Run("GetTeamMembersByIds", func(t *testing.T) { testGetTeamMembersByIds(t, rctx, ss) })
t.Run("MemberCount", func(t *testing.T) { testTeamStoreMemberCount(t, rctx, ss) })
t.Run("GetChannelUnreadsForAllTeams", func(t *testing.T) { testGetChannelUnreadsForAllTeams(t, rctx, ss) })
t.Run("GetChannelUnreadsForTeam", func(t *testing.T) { testGetChannelUnreadsForTeam(t, rctx, ss) })
t.Run("UpdateLastTeamIconUpdate", func(t *testing.T) { testUpdateLastTeamIconUpdate(t, rctx, ss) })
t.Run("GetTeamsByScheme", func(t *testing.T) { testGetTeamsByScheme(t, rctx, ss) })
t.Run("MigrateTeamMembers", func(t *testing.T) { testTeamStoreMigrateTeamMembers(t, rctx, ss) })
t.Run("ResetAllTeamSchemes", func(t *testing.T) { testResetAllTeamSchemes(t, rctx, ss) })
t.Run("ClearAllCustomRoleAssignments", func(t *testing.T) { testTeamStoreClearAllCustomRoleAssignments(t, rctx, ss) })
t.Run("AnalyticsGetTeamCountForScheme", func(t *testing.T) { testTeamStoreAnalyticsGetTeamCountForScheme(t, rctx, ss) })
t.Run("GetAllForExportAfter", func(t *testing.T) { testTeamStoreGetAllForExportAfter(t, rctx, ss) })
t.Run("GetTeamMembersForExport", func(t *testing.T) { testTeamStoreGetTeamMembersForExport(t, rctx, ss) })
t.Run("GetTeamsForUserWithPagination", func(t *testing.T) { testTeamMembersWithPagination(t, rctx, ss) })
t.Run("GroupSyncedTeamCount", func(t *testing.T) { testGroupSyncedTeamCount(t, rctx, ss) })
t.Run("GetCommonTeamIDsForMultipleUsers", func(t *testing.T) { testGetCommonTeamIDsForMultipleUsers(t, rctx, ss) })
}
func testTeamStoreSave(t *testing.T, rctx request.CTX, ss store.Store) {
o1 := model.Team{}
o1.DisplayName = "DisplayName"
o1.Name = NewTestID()
o1.Email = MakeEmail()
o1.Type = model.TeamOpen
_, err := ss.Team().Save(&o1)
require.NoError(t, err, "couldn't save item")
_, err = ss.Team().Save(&o1)
require.Error(t, err, "shouldn't be able to update from save")
o1.Id = ""
_, err = ss.Team().Save(&o1)
require.Error(t, err, "should be unique domain")
}
func testTeamStoreUpdate(t *testing.T, rctx request.CTX, ss store.Store) {
o1 := model.Team{}
o1.DisplayName = "DisplayName"
o1.Name = NewTestID()
o1.Email = MakeEmail()
o1.Type = model.TeamOpen
_, err := ss.Team().Save(&o1)
require.NoError(t, err)
time.Sleep(100 * time.Millisecond)
_, err = ss.Team().Update(&o1)
require.NoError(t, err)
o1.Id = "missing"
_, err = ss.Team().Update(&o1)
require.Error(t, err, "Update should have failed because of missing key")
o1.Id = model.NewId()
_, err = ss.Team().Update(&o1)
require.Error(t, err, "Update should have faile because id change")
}
func testTeamStoreGet(t *testing.T, rctx request.CTX, ss store.Store) {
o1 := model.Team{}
o1.DisplayName = "DisplayName"
o1.Name = NewTestID()
o1.Email = MakeEmail()
o1.Type = model.TeamOpen
_, err := ss.Team().Save(&o1)
require.NoError(t, err)
r1, err := ss.Team().Get(o1.Id)
require.NoError(t, err)
require.Equal(t, r1, &o1)
_, err = ss.Team().Get("")
require.Error(t, err, "Missing id should have failed")
}
func testTeamStoreGetMany(t *testing.T, rctx request.CTX, ss store.Store) {
o1, err := ss.Team().Save(&model.Team{
DisplayName: "DisplayName",
Name: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
})
require.NoError(t, err)
o2, err := ss.Team().Save(&model.Team{
DisplayName: "DisplayName2",
Name: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
})
require.NoError(t, err)
res, err := ss.Team().GetMany([]string{o1.Id, o2.Id})
require.NoError(t, err)
assert.Len(t, res, 2)
res, err = ss.Team().GetMany([]string{o1.Id, "notexists"})
require.NoError(t, err)
assert.Len(t, res, 1)
_, err = ss.Team().GetMany([]string{"whereisit", "notexists"})
require.Error(t, err)
var nfErr *store.ErrNotFound
assert.True(t, errors.As(err, &nfErr))
}
func testTeamStoreGetByNames(t *testing.T, rctx request.CTX, ss store.Store) {
o1 := model.Team{}
o1.DisplayName = "DisplayName"
o1.Name = NewTestID()
o1.Email = MakeEmail()
o1.Type = model.TeamOpen
_, err := ss.Team().Save(&o1)
require.NoError(t, err)
o2 := model.Team{}
o2.DisplayName = "DisplayName2"
o2.Name = NewTestID()
o2.Email = MakeEmail()
o2.Type = model.TeamOpen
_, err = ss.Team().Save(&o2)
require.NoError(t, err)
t.Run("Get empty list", func(t *testing.T) {
var teams []*model.Team
teams, err = ss.Team().GetByNames([]string{})
require.NoError(t, err)
require.Empty(t, teams)
})
t.Run("Get existing teams", func(t *testing.T) {
var teams []*model.Team
teams, err = ss.Team().GetByNames([]string{o1.Name, o2.Name})
require.NoError(t, err)
teamsIds := []string{}
for _, team := range teams {
teamsIds = append(teamsIds, team.Id)
}
assert.Contains(t, teamsIds, o1.Id, "invalid returned team")
assert.Contains(t, teamsIds, o2.Id, "invalid returned team")
})
t.Run("Get existing team and one invalid team name", func(t *testing.T) {
_, err = ss.Team().GetByNames([]string{o1.Name, ""})
require.Error(t, err)
})
t.Run("Get existing team and not existing team", func(t *testing.T) {
_, err = ss.Team().GetByNames([]string{o1.Name, "not-existing-team-name"})
require.Error(t, err)
})
t.Run("Get not existing teams", func(t *testing.T) {
_, err = ss.Team().GetByNames([]string{"not-existing-team-name", "not-existing-team-name-2"})
require.Error(t, err)
})
}
func testTeamStoreGetByName(t *testing.T, rctx request.CTX, ss store.Store) {
o1 := model.Team{}
o1.DisplayName = "DisplayName"
o1.Name = NewTestID()
o1.Email = MakeEmail()
o1.Type = model.TeamOpen
_, err := ss.Team().Save(&o1)
require.NoError(t, err)
t.Run("Get existing team", func(t *testing.T) {
var team *model.Team
team, err = ss.Team().GetByName(o1.Name)
require.NoError(t, err)
require.Equal(t, *team, o1, "invalid returned team")
})
t.Run("Get invalid team name", func(t *testing.T) {
_, err = ss.Team().GetByName("")
require.Error(t, err, "Missing id should have failed")
})
t.Run("Get not existing team", func(t *testing.T) {
_, err = ss.Team().GetByName("not-existing-team-name")
require.Error(t, err, "Missing id should have failed")
})
}
func testTeamStoreSearchAll(t *testing.T, rctx request.CTX, ss store.Store) {
cleanupTeamStore(t, rctx, ss)
o := model.Team{}
o.DisplayName = "ADisplayName" + NewTestID()
o.Name = "searchterm-" + NewTestID()
o.Email = MakeEmail()
o.Type = model.TeamOpen
o.AllowOpenInvite = true
_, err := ss.Team().Save(&o)
require.NoError(t, err)
p := model.Team{}
p.DisplayName = "BDisplayName" + NewTestID()
p.Name = "searchterm-" + NewTestID()
p.Email = MakeEmail()
p.Type = model.TeamOpen
p.AllowOpenInvite = false
_, err = ss.Team().Save(&p)
require.NoError(t, err)
g := model.Team{}
g.DisplayName = "CDisplayName" + NewTestID()
g.Name = "searchterm-" + NewTestID()
g.Email = MakeEmail()
g.Type = model.TeamOpen
g.AllowOpenInvite = false
g.GroupConstrained = model.NewPointer(true)
_, err = ss.Team().Save(&g)
require.NoError(t, err)
q := &model.Team{}
q.DisplayName = "CHOCOLATE"
q.Name = "ilovecake"
q.Email = MakeEmail()
q.Type = model.TeamOpen
q.AllowOpenInvite = false
q, err = ss.Team().Save(q)
require.NoError(t, err)
_, err = ss.RetentionPolicy().Save(&model.RetentionPolicyWithTeamAndChannelIDs{
RetentionPolicy: model.RetentionPolicy{
DisplayName: "Policy 1",
PostDurationDays: model.NewPointer(int64(20)),
},
TeamIDs: []string{q.Id},
})
require.NoError(t, err)
testCases := []struct {
Name string
Opts *model.TeamSearch
ExpectedLenth int
ExpectedTeamIds []string
}{
{
"Search chocolate by display name",
&model.TeamSearch{Term: "ocola"},
1,
[]string{q.Id},
},
{
"Search chocolate by display name",
&model.TeamSearch{Term: "choc"},
1,
[]string{q.Id},
},
{
"Search chocolate by display name",
&model.TeamSearch{Term: "late"},
1,
[]string{q.Id},
},
{
"Search chocolate by name",
&model.TeamSearch{Term: "ilov"},
1,
[]string{q.Id},
},
{
"Search chocolate by name",
&model.TeamSearch{Term: "ecake"},
1,
[]string{q.Id},
},
{
"Search for open team name",
&model.TeamSearch{Term: o.Name},
1,
[]string{o.Id},
},
{
"Search for open team displayName",
&model.TeamSearch{Term: o.DisplayName},
1,
[]string{o.Id},
},
{
"Search for open team without results",
&model.TeamSearch{Term: "nonexistent"},
0,
[]string{},
},
{
"Search for private team",
&model.TeamSearch{Term: p.DisplayName},
1,
[]string{p.Id},
},
{
"Search for all 3 searchterm teams",
&model.TeamSearch{Term: "searchterm"},
3,
[]string{o.Id, p.Id, g.Id},
},
{
"Search for all 3 teams filter by allow open invite",
&model.TeamSearch{Term: "searchterm", AllowOpenInvite: model.NewPointer(true)},
1,
[]string{o.Id},
},
{
"Search for all 3 teams filter by allow open invite = false",
&model.TeamSearch{Term: "searchterm", AllowOpenInvite: model.NewPointer(false)},
1,
[]string{p.Id},
},
{
"Search for all 3 teams filter by group constrained",
&model.TeamSearch{Term: "searchterm", GroupConstrained: model.NewPointer(true)},
1,
[]string{g.Id},
},
{
"Search for all 3 teams filter by group constrained = false",
&model.TeamSearch{Term: "searchterm", GroupConstrained: model.NewPointer(false)},
2,
[]string{o.Id, p.Id},
},
{
"Search for all 3 teams filter by allow open invite and include group constrained",
&model.TeamSearch{Term: "searchterm", AllowOpenInvite: model.NewPointer(true), GroupConstrained: model.NewPointer(true)},
2,
[]string{o.Id, g.Id},
},
{
"Search for all 3 teams filter by group constrained and not open invite",
&model.TeamSearch{Term: "searchterm", GroupConstrained: model.NewPointer(true), AllowOpenInvite: model.NewPointer(false)},
2,
[]string{g.Id, p.Id},
},
{
"Search for all 3 teams filter by group constrained false and open invite",
&model.TeamSearch{Term: "searchterm", GroupConstrained: model.NewPointer(false), AllowOpenInvite: model.NewPointer(true)},
2,
[]string{o.Id, p.Id},
},
{
"Search for all 3 teams filter by group constrained false and open invite false",
&model.TeamSearch{Term: "searchterm", GroupConstrained: model.NewPointer(false), AllowOpenInvite: model.NewPointer(false)},
2,
[]string{p.Id, o.Id},
},
{
"Search for teams which are not part of a data retention policy",
&model.TeamSearch{Term: "", ExcludePolicyConstrained: model.NewPointer(true)},
3,
[]string{o.Id, p.Id, g.Id},
},
}
for _, tc := range testCases {
t.Run(tc.Name, func(t *testing.T) {
response, err := ss.Team().SearchAll(tc.Opts)
require.NoError(t, err)
require.Equal(t, tc.ExpectedLenth, len(response))
responseTeamIds := []string{}
for _, team := range response {
responseTeamIds = append(responseTeamIds, team.Id)
}
require.ElementsMatch(t, tc.ExpectedTeamIds, responseTeamIds)
})
}
}
func testTeamStoreSearchOpen(t *testing.T, rctx request.CTX, ss store.Store) {
o := model.Team{}
o.DisplayName = "ADisplayName" + NewTestID()
o.Name = NewTestID()
o.Email = MakeEmail()
o.Type = model.TeamOpen
o.AllowOpenInvite = true
_, err := ss.Team().Save(&o)
require.NoError(t, err)
p := model.Team{}
p.DisplayName = "ADisplayName" + NewTestID()
p.Name = NewTestID()
p.Email = MakeEmail()
p.Type = model.TeamOpen
p.AllowOpenInvite = false
_, err = ss.Team().Save(&p)
require.NoError(t, err)
q := model.Team{}
q.DisplayName = "PINEAPPLEPIE"
q.Name = "ihadsomepineapplepiewithstrawberry"
q.Email = MakeEmail()
q.Type = model.TeamOpen
q.AllowOpenInvite = true
_, err = ss.Team().Save(&q)
require.NoError(t, err)
testCases := []struct {
Name string
Term string
ExpectedLength int
ExpectedFirstId string
}{
{
"Search PINEAPPLEPIE by display name",
"neapplep",
1,
q.Id,
},
{
"Search PINEAPPLEPIE by display name",
"pine",
1,
q.Id,
},
{
"Search PINEAPPLEPIE by display name",
"epie",
1,
q.Id,
},
{
"Search PINEAPPLEPIE by name",
"ihadsome",
1,
q.Id,
},
{
"Search PINEAPPLEPIE by name",
"pineapplepiewithstrawberry",
1,
q.Id,
},
{
"Search for open team name",
o.Name,
1,
o.Id,
},
{
"Search for open team displayName",
o.DisplayName,
1,
o.Id,
},
{
"Search for open team without results",
"nonexistent",
0,
"",
},
{
"Search for a private team (expected no results)",
p.DisplayName,
0,
"",
},
}
for _, tc := range testCases {
t.Run(tc.Name, func(t *testing.T) {
r1, err := ss.Team().SearchOpen(&model.TeamSearch{Term: tc.Term})
require.NoError(t, err)
results := r1
require.Equal(t, tc.ExpectedLength, len(results))
if tc.ExpectedFirstId != "" {
assert.Equal(t, tc.ExpectedFirstId, results[0].Id)
}
})
}
}
func testTeamStoreSearchPrivate(t *testing.T, rctx request.CTX, ss store.Store) {
o := model.Team{}
o.DisplayName = "ADisplayName" + NewTestID()
o.Name = NewTestID()
o.Email = MakeEmail()
o.Type = model.TeamOpen
o.AllowOpenInvite = true
_, err := ss.Team().Save(&o)
require.NoError(t, err)
p := model.Team{}
p.DisplayName = "ADisplayName" + NewTestID()
p.Name = NewTestID()
p.Email = MakeEmail()
p.Type = model.TeamOpen
p.AllowOpenInvite = false
_, err = ss.Team().Save(&p)
require.NoError(t, err)
q := model.Team{}
q.DisplayName = "FOOBARDISPLAYNAME"
q.Name = "averylongname"
q.Email = MakeEmail()
q.Type = model.TeamOpen
q.AllowOpenInvite = false
_, err = ss.Team().Save(&q)
require.NoError(t, err)
testCases := []struct {
Name string
Term string
ExpectedLength int
ExpectedFirstId string
}{
{
"Search FooBar by display name from text in the middle of display name",
"oobardisplay",
1,
q.Id,
},
{
"Search FooBar by display name from text at the beginning of display name",
"foobar",
1,
q.Id,
},
{
"Search FooBar by display name from text at the end of display name",
"bardisplayname",
1,
q.Id,
},
{
"Search FooBar by name from text at the beginning name",
"averyl",
1,
q.Id,
},
{
"Search FooBar by name from text at the end of name",
"ongname",
1,
q.Id,
},
{
"Search for private team name",
p.Name,
1,
p.Id,
},
{
"Search for private team displayName",
p.DisplayName,
1,
p.Id,
},
{
"Search for private team without results",
"nonexistent",
0,
"",
},
{
"Search for a open team (expected no results)",
o.DisplayName,
0,
"",
},
}
for _, tc := range testCases {
t.Run(tc.Name, func(t *testing.T) {
r1, err := ss.Team().SearchPrivate(&model.TeamSearch{Term: tc.Term})
require.NoError(t, err)
results := r1
require.Equal(t, tc.ExpectedLength, len(results))
if tc.ExpectedFirstId != "" {
assert.Equal(t, tc.ExpectedFirstId, results[0].Id)
}
})
}
}
func testTeamStoreGetByInviteId(t *testing.T, rctx request.CTX, ss store.Store) {
o1 := model.Team{}
o1.DisplayName = "DisplayName"
o1.Name = NewTestID()
o1.Email = MakeEmail()
o1.Type = model.TeamOpen
o1.InviteId = model.NewId()
save1, err := ss.Team().Save(&o1)
require.NoError(t, err)
r1, err := ss.Team().GetByInviteId(save1.InviteId)
require.NoError(t, err)
require.Equal(t, *r1, o1, "invalid returned team")
_, err = ss.Team().GetByInviteId("")
require.Error(t, err, "Missing id should have failed")
}
func testTeamStoreByUserId(t *testing.T, rctx request.CTX, ss store.Store) {
o1 := &model.Team{}
o1.DisplayName = "DisplayName"
o1.Name = NewTestID()
o1.Email = MakeEmail()
o1.Type = model.TeamOpen
o1.InviteId = model.NewId()
o1, err := ss.Team().Save(o1)
require.NoError(t, err)
m1 := &model.TeamMember{TeamId: o1.Id, UserId: model.NewId()}
_, nErr := ss.Team().SaveMember(rctx, m1, -1)
require.NoError(t, nErr)
teams, err := ss.Team().GetTeamsByUserId(m1.UserId)
require.NoError(t, err)
require.Len(t, teams, 1, "Should return a team")
require.Equal(t, teams[0].Id, o1.Id, "should be a member")
}
func testTeamStoreGetAllPage(t *testing.T, rctx request.CTX, ss store.Store) {
o := model.Team{}
o.DisplayName = "ADisplayName" + model.NewId()
o.Name = "zz" + model.NewId() + "a"
o.Email = MakeEmail()
o.Type = model.TeamOpen
o.AllowOpenInvite = true
_, err := ss.Team().Save(&o)
require.NoError(t, err)
policy, err := ss.RetentionPolicy().Save(&model.RetentionPolicyWithTeamAndChannelIDs{
RetentionPolicy: model.RetentionPolicy{
DisplayName: "Policy 1",
PostDurationDays: model.NewPointer(int64(30)),
},
TeamIDs: []string{o.Id},
})
require.NoError(t, err)
// Without ExcludePolicyConstrained
teams, err := ss.Team().GetAllPage(0, 100, nil)
require.NoError(t, err)
found := false
for _, team := range teams {
if team.Id == o.Id {
found = true
require.Nil(t, team.PolicyID)
break
}
}
require.True(t, found)
// With ExcludePolicyConstrained
teams, err = ss.Team().GetAllPage(0, 100, &model.TeamSearch{ExcludePolicyConstrained: model.NewPointer(true)})
require.NoError(t, err)
found = false
for _, team := range teams {
if team.Id == o.Id {
found = true
break
}
}
require.False(t, found)
// With policy ID
teams, err = ss.Team().GetAllPage(0, 100, &model.TeamSearch{IncludePolicyID: model.NewPointer(true)})
require.NoError(t, err)
found = false
for _, team := range teams {
if team.Id == o.Id {
found = true
require.Equal(t, *team.PolicyID, policy.ID)
break
}
}
require.True(t, found)
}
func testGetAllTeamListing(t *testing.T, rctx request.CTX, ss store.Store) {
o1 := model.Team{}
o1.DisplayName = "DisplayName"
o1.Name = NewTestID()
o1.Email = MakeEmail()
o1.Type = model.TeamOpen
o1.AllowOpenInvite = true
_, err := ss.Team().Save(&o1)
require.NoError(t, err)
o2 := model.Team{}
o2.DisplayName = "DisplayName"
o2.Name = NewTestID()
o2.Email = MakeEmail()
o2.Type = model.TeamOpen
_, err = ss.Team().Save(&o2)
require.NoError(t, err)
o3 := model.Team{}
o3.DisplayName = "DisplayName"
o3.Name = NewTestID()
o3.Email = MakeEmail()
o3.Type = model.TeamInvite
o3.AllowOpenInvite = true
_, err = ss.Team().Save(&o3)
require.NoError(t, err)
o4 := model.Team{}
o4.DisplayName = "DisplayName"
o4.Name = NewTestID()
o4.Email = MakeEmail()
o4.Type = model.TeamInvite
_, err = ss.Team().Save(&o4)
require.NoError(t, err)
teams, err := ss.Team().GetAllTeamListing()
require.NoError(t, err)
for _, team := range teams {
require.True(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as true")
}
require.NotEmpty(t, teams, "failed team listing")
}
func testGetAllTeamPageListing(t *testing.T, rctx request.CTX, ss store.Store) {
o1 := model.Team{}
o1.DisplayName = "DisplayName"
o1.Name = NewTestID()
o1.Email = MakeEmail()
o1.Type = model.TeamOpen
o1.AllowOpenInvite = true
_, err := ss.Team().Save(&o1)
require.NoError(t, err)
o2 := model.Team{}
o2.DisplayName = "DisplayName"
o2.Name = NewTestID()
o2.Email = MakeEmail()
o2.Type = model.TeamOpen
o2.AllowOpenInvite = false
_, err = ss.Team().Save(&o2)
require.NoError(t, err)
o3 := model.Team{}
o3.DisplayName = "DisplayName"
o3.Name = NewTestID()
o3.Email = MakeEmail()
o3.Type = model.TeamInvite
o3.AllowOpenInvite = true
_, err = ss.Team().Save(&o3)
require.NoError(t, err)
o4 := model.Team{}
o4.DisplayName = "DisplayName"
o4.Name = NewTestID()
o4.Email = MakeEmail()
o4.Type = model.TeamInvite
o4.AllowOpenInvite = false
_, err = ss.Team().Save(&o4)
require.NoError(t, err)
opts := &model.TeamSearch{AllowOpenInvite: model.NewPointer(true)}
teams, err := ss.Team().GetAllPage(0, 10, opts)
require.NoError(t, err)
for _, team := range teams {
require.True(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as true")
}
require.LessOrEqual(t, len(teams), 10, "should have returned max of 10 teams")
o5 := model.Team{}
o5.DisplayName = "DisplayName"
o5.Name = NewTestID()
o5.Email = MakeEmail()
o5.Type = model.TeamOpen
o5.AllowOpenInvite = true
_, err = ss.Team().Save(&o5)
require.NoError(t, err)
teams, err = ss.Team().GetAllPage(0, 4, opts)
require.NoError(t, err)
for _, team := range teams {
require.True(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as true")
}
require.LessOrEqual(t, len(teams), 4, "should have returned max of 4 teams")
teams, err = ss.Team().GetAllPage(1, 1, opts)
require.NoError(t, err)
for _, team := range teams {
require.True(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as true")
}
require.LessOrEqual(t, len(teams), 1, "should have returned max of 1 team")
}
func testGetAllPrivateTeamListing(t *testing.T, rctx request.CTX, ss store.Store) {
o1 := model.Team{}
o1.DisplayName = "DisplayName"
o1.Name = NewTestID()
o1.Email = MakeEmail()
o1.Type = model.TeamOpen
o1.AllowOpenInvite = true
_, err := ss.Team().Save(&o1)
require.NoError(t, err)
o2 := model.Team{}
o2.DisplayName = "DisplayName"
o2.Name = NewTestID()
o2.Email = MakeEmail()
o2.Type = model.TeamOpen
_, err = ss.Team().Save(&o2)
require.NoError(t, err)
o3 := model.Team{}
o3.DisplayName = "DisplayName"
o3.Name = NewTestID()
o3.Email = MakeEmail()
o3.Type = model.TeamInvite
o3.AllowOpenInvite = true
_, err = ss.Team().Save(&o3)
require.NoError(t, err)
o4 := model.Team{}
o4.DisplayName = "DisplayName"
o4.Name = NewTestID()
o4.Email = MakeEmail()
o4.Type = model.TeamInvite
_, err = ss.Team().Save(&o4)
require.NoError(t, err)
teams, err := ss.Team().GetAllPrivateTeamListing()
require.NoError(t, err)
require.NotEmpty(t, teams, "failed team listing")
for _, team := range teams {
require.False(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as false")
}
}
func testGetAllPrivateTeamPageListing(t *testing.T, rctx request.CTX, ss store.Store) {
o1 := model.Team{}
o1.DisplayName = "DisplayName"
o1.Name = NewTestID()
o1.Email = MakeEmail()
o1.Type = model.TeamOpen
o1.AllowOpenInvite = true
_, err := ss.Team().Save(&o1)
require.NoError(t, err)
o2 := model.Team{}
o2.DisplayName = "DisplayName"
o2.Name = NewTestID()
o2.Email = MakeEmail()
o2.Type = model.TeamOpen
o2.AllowOpenInvite = false
_, err = ss.Team().Save(&o2)
require.NoError(t, err)
o3 := model.Team{}
o3.DisplayName = "DisplayName"
o3.Name = NewTestID()
o3.Email = MakeEmail()
o3.Type = model.TeamInvite
o3.AllowOpenInvite = true
_, err = ss.Team().Save(&o3)
require.NoError(t, err)
o4 := model.Team{}
o4.DisplayName = "DisplayName"
o4.Name = NewTestID()
o4.Email = MakeEmail()
o4.Type = model.TeamInvite
o4.AllowOpenInvite = false
_, err = ss.Team().Save(&o4)
require.NoError(t, err)
opts := &model.TeamSearch{AllowOpenInvite: model.NewPointer(false)}
teams, listErr := ss.Team().GetAllPage(0, 10, opts)
require.NoError(t, listErr)
for _, team := range teams {
require.False(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as false")
}
require.LessOrEqual(t, len(teams), 10, "should have returned max of 10 teams")
o5 := model.Team{}
o5.DisplayName = "DisplayName"
o5.Name = NewTestID()
o5.Email = MakeEmail()
o5.Type = model.TeamOpen
o5.AllowOpenInvite = true
_, err = ss.Team().Save(&o5)
require.NoError(t, err)
teams, listErr = ss.Team().GetAllPage(0, 4, opts)
require.NoError(t, listErr)
for _, team := range teams {
require.False(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as false")
}
require.LessOrEqual(t, len(teams), 4, "should have returned max of 4 teams")
teams, listErr = ss.Team().GetAllPage(1, 1, opts)
require.NoError(t, listErr)
for _, team := range teams {
require.False(t, team.AllowOpenInvite, "should have returned team with AllowOpenInvite as false")
}
require.LessOrEqual(t, len(teams), 1, "should have returned max of 1 team")
}
func testGetAllPublicTeamPageListing(t *testing.T, rctx request.CTX, ss store.Store) {
cleanupTeamStore(t, rctx, ss)
o1 := model.Team{}
o1.DisplayName = "DisplayName1"
o1.Name = NewTestID()
o1.Email = MakeEmail()
o1.Type = model.TeamOpen
o1.AllowOpenInvite = true
t1, err := ss.Team().Save(&o1)
require.NoError(t, err)
o2 := model.Team{}
o2.DisplayName = "DisplayName2"
o2.Name = NewTestID()
o2.Email = MakeEmail()
o2.Type = model.TeamOpen
o2.AllowOpenInvite = false
_, err = ss.Team().Save(&o2)
require.NoError(t, err)
o3 := model.Team{}
o3.DisplayName = "DisplayName3"
o3.Name = NewTestID()
o3.Email = MakeEmail()
o3.Type = model.TeamInvite
o3.AllowOpenInvite = true
t3, err := ss.Team().Save(&o3)
require.NoError(t, err)
o4 := model.Team{}
o4.DisplayName = "DisplayName4"
o4.Name = NewTestID()
o4.Email = MakeEmail()
o4.Type = model.TeamInvite
o4.AllowOpenInvite = false
_, err = ss.Team().Save(&o4)
require.NoError(t, err)
opts := &model.TeamSearch{AllowOpenInvite: model.NewPointer(true)}
teams, err := ss.Team().GetAllPage(0, 10, opts)
assert.NoError(t, err)
assert.Equal(t, []*model.Team{t1, t3}, teams)
o5 := model.Team{}
o5.DisplayName = "DisplayName5"
o5.Name = NewTestID()
o5.Email = MakeEmail()
o5.Type = model.TeamOpen
o5.AllowOpenInvite = true
t5, err := ss.Team().Save(&o5)
require.NoError(t, err)
teams, err = ss.Team().GetAllPage(0, 4, opts)
assert.NoError(t, err)
assert.Equal(t, []*model.Team{t1, t3, t5}, teams)
_, err = ss.Team().GetAllPage(1, 1, opts)
assert.NoError(t, err)
}
func testDelete(t *testing.T, rctx request.CTX, ss store.Store) {
o1 := model.Team{}
o1.DisplayName = "DisplayName"
o1.Name = NewTestID()
o1.Email = MakeEmail()
o1.Type = model.TeamOpen
o1.AllowOpenInvite = true
_, err := ss.Team().Save(&o1)
require.NoError(t, err)
o2 := model.Team{}
o2.DisplayName = "DisplayName"
o2.Name = NewTestID()
o2.Email = MakeEmail()
o2.Type = model.TeamOpen
_, err = ss.Team().Save(&o2)
require.NoError(t, err)
r1 := ss.Team().PermanentDelete(o1.Id)
require.NoError(t, r1)
}
func testPublicTeamCount(t *testing.T, rctx request.CTX, ss store.Store) {
cleanupTeamStore(t, rctx, ss)
o1 := model.Team{}
o1.DisplayName = "DisplayName"
o1.Name = NewTestID()
o1.Email = MakeEmail()
o1.Type = model.TeamOpen
o1.AllowOpenInvite = true
_, err := ss.Team().Save(&o1)
require.NoError(t, err)
o2 := model.Team{}
o2.DisplayName = "DisplayName"
o2.Name = NewTestID()
o2.Email = MakeEmail()
o2.Type = model.TeamOpen
o2.AllowOpenInvite = false
_, err = ss.Team().Save(&o2)
require.NoError(t, err)
o3 := model.Team{}
o3.DisplayName = "DisplayName"
o3.Name = NewTestID()
o3.Email = MakeEmail()
o3.Type = model.TeamOpen
o3.AllowOpenInvite = true
_, err = ss.Team().Save(&o3)
require.NoError(t, err)
teamCount, err := ss.Team().AnalyticsTeamCount(&model.TeamSearch{AllowOpenInvite: model.NewPointer(true)})
require.NoError(t, err)
require.Equal(t, int64(2), teamCount, "should only be 1 team")
}
func testPrivateTeamCount(t *testing.T, rctx request.CTX, ss store.Store) {
cleanupTeamStore(t, rctx, ss)
o1 := model.Team{}
o1.DisplayName = "DisplayName"
o1.Name = NewTestID()
o1.Email = MakeEmail()
o1.Type = model.TeamOpen
o1.AllowOpenInvite = false
_, err := ss.Team().Save(&o1)
require.NoError(t, err)
o2 := model.Team{}
o2.DisplayName = "DisplayName"
o2.Name = NewTestID()
o2.Email = MakeEmail()
o2.Type = model.TeamOpen
o2.AllowOpenInvite = true
_, err = ss.Team().Save(&o2)
require.NoError(t, err)
o3 := model.Team{}
o3.DisplayName = "DisplayName"
o3.Name = NewTestID()
o3.Email = MakeEmail()
o3.Type = model.TeamOpen
o3.AllowOpenInvite = false
_, err = ss.Team().Save(&o3)
require.NoError(t, err)
teamCount, err := ss.Team().AnalyticsTeamCount(&model.TeamSearch{AllowOpenInvite: model.NewPointer(false)})
require.NoError(t, err)
require.Equal(t, int64(2), teamCount, "should only be 1 team")
}
func testTeamCount(t *testing.T, rctx request.CTX, ss store.Store) {
o1 := model.Team{}
o1.DisplayName = "DisplayName"
o1.Name = NewTestID()
o1.Email = MakeEmail()
o1.Type = model.TeamOpen
o1.AllowOpenInvite = true
team, err := ss.Team().Save(&o1)
require.NoError(t, err)
// not including deleted teams
teamCount, err := ss.Team().AnalyticsTeamCount(nil)
require.NoError(t, err)
require.NotEqual(t, 0, int(teamCount), "should be at least 1 team")
// delete the team for the next check
team.DeleteAt = model.GetMillis()
_, err = ss.Team().Update(team)
require.NoError(t, err)
// get the count of teams not including deleted
countNotIncludingDeleted, err := ss.Team().AnalyticsTeamCount(nil)
require.NoError(t, err)
// get the count of teams including deleted
countIncludingDeleted, err := ss.Team().AnalyticsTeamCount(&model.TeamSearch{IncludeDeleted: model.NewPointer(true)})
require.NoError(t, err)
// count including deleted should be one greater than not including deleted
require.Equal(t, countNotIncludingDeleted+1, countIncludingDeleted)
}
func testGetMembers(t *testing.T, rctx request.CTX, ss store.Store) {
// Each user should have a mention count of exactly 1 in the DB at this point.
t.Run("Test GetMembers Order By UserID", func(t *testing.T) {
teamId1 := model.NewId()
teamId2 := model.NewId()
m1 := &model.TeamMember{TeamId: teamId1, UserId: "55555555555555555555555555"}
m2 := &model.TeamMember{TeamId: teamId1, UserId: "11111111111111111111111111"}
m3 := &model.TeamMember{TeamId: teamId1, UserId: "33333333333333333333333333"}
m4 := &model.TeamMember{TeamId: teamId1, UserId: "22222222222222222222222222"}
m5 := &model.TeamMember{TeamId: teamId1, UserId: "44444444444444444444444444"}
m6 := &model.TeamMember{TeamId: teamId2, UserId: "00000000000000000000000000"}
_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4, m5, m6}, -1)
require.NoError(t, nErr)
// Gets users ordered by UserId
ms, err := ss.Team().GetMembers(teamId1, 0, 100, nil)
require.NoError(t, err)
assert.Len(t, ms, 5)
assert.Equal(t, "11111111111111111111111111", ms[0].UserId)
assert.Equal(t, "22222222222222222222222222", ms[1].UserId)
assert.Equal(t, "33333333333333333333333333", ms[2].UserId)
assert.Equal(t, "44444444444444444444444444", ms[3].UserId)
assert.Equal(t, "55555555555555555555555555", ms[4].UserId)
})
t.Run("Test GetMembers Order By Username And Exclude Deleted Members", func(t *testing.T) {
teamId1 := model.NewId()
teamId2 := model.NewId()
u1 := &model.User{Username: "a", Email: MakeEmail(), DeleteAt: int64(1)}
u2 := &model.User{Username: "c", Email: MakeEmail()}
u3 := &model.User{Username: "b", Email: MakeEmail(), DeleteAt: int64(1)}
u4 := &model.User{Username: "f", Email: MakeEmail()}
u5 := &model.User{Username: "e", Email: MakeEmail(), DeleteAt: int64(1)}
u6 := &model.User{Username: "d", Email: MakeEmail()}
u1, err := ss.User().Save(rctx, u1)
require.NoError(t, err)
u2, err = ss.User().Save(rctx, u2)
require.NoError(t, err)
u3, err = ss.User().Save(rctx, u3)
require.NoError(t, err)
u4, err = ss.User().Save(rctx, u4)
require.NoError(t, err)
u5, err = ss.User().Save(rctx, u5)
require.NoError(t, err)
u6, err = ss.User().Save(rctx, u6)
require.NoError(t, err)
m1 := &model.TeamMember{TeamId: teamId1, UserId: u1.Id}
m2 := &model.TeamMember{TeamId: teamId1, UserId: u2.Id}
m3 := &model.TeamMember{TeamId: teamId1, UserId: u3.Id}
m4 := &model.TeamMember{TeamId: teamId1, UserId: u4.Id}
m5 := &model.TeamMember{TeamId: teamId1, UserId: u5.Id}
m6 := &model.TeamMember{TeamId: teamId2, UserId: u6.Id}
_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4, m5, m6}, -1)
require.NoError(t, nErr)
// Gets users ordered by UserName
ms, nErr := ss.Team().GetMembers(teamId1, 0, 100, &model.TeamMembersGetOptions{Sort: model.USERNAME})
require.NoError(t, nErr)
assert.Len(t, ms, 5)
assert.Equal(t, u1.Id, ms[0].UserId)
assert.Equal(t, u3.Id, ms[1].UserId)
assert.Equal(t, u2.Id, ms[2].UserId)
assert.Equal(t, u5.Id, ms[3].UserId)
assert.Equal(t, u4.Id, ms[4].UserId)
// Gets users ordered by UserName and excludes deleted members
ms, nErr = ss.Team().GetMembers(teamId1, 0, 100, &model.TeamMembersGetOptions{Sort: model.USERNAME, ExcludeDeletedUsers: true})
require.NoError(t, nErr)
assert.Len(t, ms, 2)
assert.Equal(t, u2.Id, ms[0].UserId)
assert.Equal(t, u4.Id, ms[1].UserId)
})
t.Run("Test GetMembers Excluded Deleted Users", func(t *testing.T) {
teamId1 := model.NewId()
teamId2 := model.NewId()
u1 := &model.User{Email: MakeEmail()}
u2 := &model.User{Email: MakeEmail(), DeleteAt: int64(1)}
u3 := &model.User{Email: MakeEmail()}
u4 := &model.User{Email: MakeEmail(), DeleteAt: int64(3)}
u5 := &model.User{Email: MakeEmail()}
u6 := &model.User{Email: MakeEmail(), DeleteAt: int64(5)}
u1, err := ss.User().Save(rctx, u1)
require.NoError(t, err)
u2, err = ss.User().Save(rctx, u2)
require.NoError(t, err)
u3, err = ss.User().Save(rctx, u3)
require.NoError(t, err)
u4, err = ss.User().Save(rctx, u4)
require.NoError(t, err)
u5, err = ss.User().Save(rctx, u5)
require.NoError(t, err)
u6, err = ss.User().Save(rctx, u6)
require.NoError(t, err)
m1 := &model.TeamMember{TeamId: teamId1, UserId: u1.Id}
m2 := &model.TeamMember{TeamId: teamId1, UserId: u2.Id}
m3 := &model.TeamMember{TeamId: teamId1, UserId: u3.Id}
m4 := &model.TeamMember{TeamId: teamId1, UserId: u4.Id}
m5 := &model.TeamMember{TeamId: teamId1, UserId: u5.Id}
m6 := &model.TeamMember{TeamId: teamId2, UserId: u6.Id}
t1, nErr := ss.Team().SaveMember(rctx, m1, -1)
require.NoError(t, nErr)
_, nErr = ss.Team().SaveMember(rctx, m2, -1)
require.NoError(t, nErr)
t3, nErr := ss.Team().SaveMember(rctx, m3, -1)
require.NoError(t, nErr)
_, nErr = ss.Team().SaveMember(rctx, m4, -1)
require.NoError(t, nErr)
t5, nErr := ss.Team().SaveMember(rctx, m5, -1)
require.NoError(t, nErr)
_, nErr = ss.Team().SaveMember(rctx, m6, -1)
require.NoError(t, nErr)
// Gets users ordered by UserName
ms, nErr := ss.Team().GetMembers(teamId1, 0, 100, &model.TeamMembersGetOptions{ExcludeDeletedUsers: true})
require.NoError(t, nErr)
assert.Len(t, ms, 3)
require.ElementsMatch(t, ms, [3]*model.TeamMember{t1, t3, t5})
})
}
func testTeamMembers(t *testing.T, rctx request.CTX, ss store.Store) {
teamId1 := model.NewId()
teamId2 := model.NewId()
m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
m2 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
m3 := &model.TeamMember{TeamId: teamId2, UserId: model.NewId()}
_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3}, -1)
require.NoError(t, nErr)
ms, err := ss.Team().GetMembers(teamId1, 0, 100, nil)
require.NoError(t, err)
assert.Len(t, ms, 2)
ms, err = ss.Team().GetMembers(teamId2, 0, 100, nil)
require.NoError(t, err)
require.Len(t, ms, 1)
require.Equal(t, m3.UserId, ms[0].UserId)
ms, err = ss.Team().GetTeamsForUser(rctx, m1.UserId, "", true)
require.NoError(t, err)
require.Len(t, ms, 1)
require.Equal(t, m1.TeamId, ms[0].TeamId)
err = ss.Team().RemoveMember(rctx, teamId1, m1.UserId)
require.NoError(t, err)
ms, err = ss.Team().GetMembers(teamId1, 0, 100, nil)
require.NoError(t, err)
require.Len(t, ms, 1)
require.Equal(t, m2.UserId, ms[0].UserId)
_, nErr = ss.Team().SaveMember(rctx, m1, -1)
require.NoError(t, nErr)
err = ss.Team().RemoveAllMembersByTeam(teamId1)
require.NoError(t, err)
ms, err = ss.Team().GetMembers(teamId1, 0, 100, nil)
require.NoError(t, err)
require.Empty(t, ms)
uid := model.NewId()
m4 := &model.TeamMember{TeamId: teamId1, UserId: uid}
m5 := &model.TeamMember{TeamId: teamId2, UserId: uid}
_, nErr = ss.Team().SaveMultipleMembers([]*model.TeamMember{m4, m5}, -1)
require.NoError(t, nErr)
ms, err = ss.Team().GetTeamsForUser(rctx, uid, "", true)
require.NoError(t, err)
require.Len(t, ms, 2)
ms, err = ss.Team().GetTeamsForUser(rctx, uid, teamId2, true)
require.NoError(t, err)
require.Len(t, ms, 1)
m4.DeleteAt = model.GetMillis()
_, err = ss.Team().UpdateMember(rctx, m4)
require.NoError(t, err)
ms, err = ss.Team().GetTeamsForUser(rctx, uid, "", true)
require.NoError(t, err)
require.Len(t, ms, 2)
ms, err = ss.Team().GetTeamsForUser(rctx, uid, "", false)
require.NoError(t, err)
require.Len(t, ms, 1)
nErr = ss.Team().RemoveAllMembersByUser(rctx, uid)
require.NoError(t, nErr)
ms, err = ss.Team().GetTeamsForUser(rctx, m1.UserId, "", true)
require.NoError(t, err)
require.Empty(t, ms)
}
func testTeamSaveMember(t *testing.T, rctx request.CTX, ss store.Store) {
u1, err := ss.User().Save(rctx, &model.User{Username: model.NewUsername(), Email: MakeEmail()})
require.NoError(t, err)
u2, err := ss.User().Save(rctx, &model.User{Username: model.NewUsername(), Email: MakeEmail()})
require.NoError(t, err)
t.Run("not valid team member", func(t *testing.T) {
member := &model.TeamMember{TeamId: "wrong", UserId: u1.Id}
_, nErr := ss.Team().SaveMember(rctx, member, -1)
require.Error(t, nErr)
require.Equal(t, "TeamMember.IsValid: model.team_member.is_valid.team_id.app_error", nErr.Error())
})
t.Run("too many members", func(t *testing.T) {
member := &model.TeamMember{TeamId: model.NewId(), UserId: u1.Id}
_, nErr := ss.Team().SaveMember(rctx, member, 0)
require.Error(t, nErr)
require.Equal(t, "limit exceeded: what: TeamMember count: 1 metadata: team members limit exceeded", nErr.Error())
})
t.Run("too many members because previous existing members", func(t *testing.T) {
teamID := model.NewId()
m1 := &model.TeamMember{TeamId: teamID, UserId: u1.Id}
_, nErr := ss.Team().SaveMember(rctx, m1, 1)
require.NoError(t, nErr)
m2 := &model.TeamMember{TeamId: teamID, UserId: u2.Id}
_, nErr = ss.Team().SaveMember(rctx, m2, 1)
require.Error(t, nErr)
require.Equal(t, "limit exceeded: what: TeamMember count: 2 metadata: team members limit exceeded", nErr.Error())
})
t.Run("duplicated entries should fail", func(t *testing.T) {
teamID1 := model.NewId()
m1 := &model.TeamMember{TeamId: teamID1, UserId: u1.Id}
_, nErr := ss.Team().SaveMember(rctx, m1, -1)
require.NoError(t, nErr)
m2 := &model.TeamMember{TeamId: teamID1, UserId: u1.Id}
_, nErr = ss.Team().SaveMember(rctx, m2, -1)
require.Error(t, nErr)
require.IsType(t, &store.ErrConflict{}, nErr)
})
t.Run("insert member correctly (in team without scheme)", func(t *testing.T) {
team := &model.Team{
DisplayName: "Name",
Name: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
}
team, nErr := ss.Team().Save(team)
require.NoError(t, nErr)
testCases := []struct {
Name string
SchemeGuest bool
SchemeUser bool
SchemeAdmin bool
ExplicitRoles string
ExpectedRoles string
ExpectedExplicitRoles string
ExpectedSchemeGuest bool
ExpectedSchemeUser bool
ExpectedSchemeAdmin bool
}{
{
Name: "team user implicit",
SchemeUser: true,
ExpectedRoles: "team_user",
ExpectedSchemeUser: true,
},
{
Name: "team user explicit",
ExplicitRoles: "team_user",
ExpectedRoles: "team_user",
ExpectedSchemeUser: true,
},
{
Name: "team guest implicit",
SchemeGuest: true,
ExpectedRoles: "team_guest",
ExpectedSchemeGuest: true,
},
{
Name: "team guest explicit",
ExplicitRoles: "team_guest",
ExpectedRoles: "team_guest",
ExpectedSchemeGuest: true,
},
{
Name: "team admin implicit",
SchemeUser: true,
SchemeAdmin: true,
ExpectedRoles: "team_user team_admin",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team admin explicit",
ExplicitRoles: "team_user team_admin",
ExpectedRoles: "team_user team_admin",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team user implicit and explicit custom role",
SchemeUser: true,
ExplicitRoles: "test",
ExpectedRoles: "test team_user",
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
},
{
Name: "team user explicit and explicit custom role",
ExplicitRoles: "team_user test",
ExpectedRoles: "test team_user",
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
},
{
Name: "team guest implicit and explicit custom role",
SchemeGuest: true,
ExplicitRoles: "test",
ExpectedRoles: "test team_guest",
ExpectedExplicitRoles: "test",
ExpectedSchemeGuest: true,
},
{
Name: "team guest explicit and explicit custom role",
ExplicitRoles: "team_guest test",
ExpectedRoles: "test team_guest",
ExpectedExplicitRoles: "test",
ExpectedSchemeGuest: true,
},
{
Name: "team admin implicit and explicit custom role",
SchemeUser: true,
SchemeAdmin: true,
ExplicitRoles: "test",
ExpectedRoles: "test team_user team_admin",
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team admin explicit and explicit custom role",
ExplicitRoles: "team_user team_admin test",
ExpectedRoles: "test team_user team_admin",
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team member with only explicit custom roles",
ExplicitRoles: "test test2",
ExpectedRoles: "test test2",
ExpectedExplicitRoles: "test test2",
},
}
for _, tc := range testCases {
t.Run(tc.Name, func(t *testing.T) {
member := &model.TeamMember{
TeamId: team.Id,
UserId: u1.Id,
SchemeGuest: tc.SchemeGuest,
SchemeUser: tc.SchemeUser,
SchemeAdmin: tc.SchemeAdmin,
ExplicitRoles: tc.ExplicitRoles,
}
member, nErr := ss.Team().SaveMember(rctx, member, -1)
require.NoError(t, nErr)
defer ss.Team().RemoveMember(rctx, team.Id, u1.Id)
assert.Equal(t, tc.ExpectedRoles, member.Roles)
assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
})
}
})
t.Run("insert member correctly (in team with scheme)", func(t *testing.T) {
ts := &model.Scheme{
Name: NewTestID(),
DisplayName: NewTestID(),
Description: NewTestID(),
Scope: model.SchemeScopeTeam,
}
ts, nErr := ss.Scheme().Save(ts)
require.NoError(t, nErr)
team := &model.Team{
DisplayName: "Name",
Name: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
SchemeId: &ts.Id,
}
team, nErr = ss.Team().Save(team)
require.NoError(t, nErr)
testCases := []struct {
Name string
SchemeGuest bool
SchemeUser bool
SchemeAdmin bool
ExplicitRoles string
ExpectedRoles string
ExpectedExplicitRoles string
ExpectedSchemeGuest bool
ExpectedSchemeUser bool
ExpectedSchemeAdmin bool
}{
{
Name: "team user implicit",
SchemeUser: true,
ExpectedRoles: ts.DefaultTeamUserRole,
ExpectedSchemeUser: true,
},
{
Name: "team user explicit",
ExplicitRoles: "team_user",
ExpectedRoles: ts.DefaultTeamUserRole,
ExpectedSchemeUser: true,
},
{
Name: "team guest implicit",
SchemeGuest: true,
ExpectedRoles: ts.DefaultTeamGuestRole,
ExpectedSchemeGuest: true,
},
{
Name: "team guest explicit",
ExplicitRoles: "team_guest",
ExpectedRoles: ts.DefaultTeamGuestRole,
ExpectedSchemeGuest: true,
},
{
Name: "team admin implicit",
SchemeUser: true,
SchemeAdmin: true,
ExpectedRoles: ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team admin explicit",
ExplicitRoles: "team_user team_admin",
ExpectedRoles: ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team user implicit and explicit custom role",
SchemeUser: true,
ExplicitRoles: "test",
ExpectedRoles: "test " + ts.DefaultTeamUserRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
},
{
Name: "team user explicit and explicit custom role",
ExplicitRoles: "team_user test",
ExpectedRoles: "test " + ts.DefaultTeamUserRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
},
{
Name: "team guest implicit and explicit custom role",
SchemeGuest: true,
ExplicitRoles: "test",
ExpectedRoles: "test " + ts.DefaultTeamGuestRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeGuest: true,
},
{
Name: "team guest explicit and explicit custom role",
ExplicitRoles: "team_guest test",
ExpectedRoles: "test " + ts.DefaultTeamGuestRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeGuest: true,
},
{
Name: "team admin implicit and explicit custom role",
SchemeUser: true,
SchemeAdmin: true,
ExplicitRoles: "test",
ExpectedRoles: "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team admin explicit and explicit custom role",
ExplicitRoles: "team_user team_admin test",
ExpectedRoles: "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team member with only explicit custom roles",
ExplicitRoles: "test test2",
ExpectedRoles: "test test2",
ExpectedExplicitRoles: "test test2",
},
}
for _, tc := range testCases {
t.Run(tc.Name, func(t *testing.T) {
member := &model.TeamMember{
TeamId: team.Id,
UserId: u1.Id,
SchemeGuest: tc.SchemeGuest,
SchemeUser: tc.SchemeUser,
SchemeAdmin: tc.SchemeAdmin,
ExplicitRoles: tc.ExplicitRoles,
}
member, nErr := ss.Team().SaveMember(rctx, member, -1)
require.NoError(t, nErr)
defer ss.Team().RemoveMember(rctx, team.Id, u1.Id)
assert.Equal(t, tc.ExpectedRoles, member.Roles)
assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
})
}
})
}
func testTeamSaveMultipleMembers(t *testing.T, rctx request.CTX, ss store.Store) {
u1, err := ss.User().Save(rctx, &model.User{Username: model.NewUsername(), Email: MakeEmail()})
require.NoError(t, err)
u2, err := ss.User().Save(rctx, &model.User{Username: model.NewUsername(), Email: MakeEmail()})
require.NoError(t, err)
u3, err := ss.User().Save(rctx, &model.User{Username: model.NewUsername(), Email: MakeEmail()})
require.NoError(t, err)
u4, err := ss.User().Save(rctx, &model.User{Username: model.NewUsername(), Email: MakeEmail()})
require.NoError(t, err)
t.Run("any not valid team member", func(t *testing.T) {
m1 := &model.TeamMember{TeamId: "wrong", UserId: u1.Id}
m2 := &model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}
_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2}, -1)
require.Error(t, nErr)
require.Equal(t, "TeamMember.IsValid: model.team_member.is_valid.team_id.app_error", nErr.Error())
})
t.Run("too many members in one team", func(t *testing.T) {
teamID := model.NewId()
m1 := &model.TeamMember{TeamId: teamID, UserId: u1.Id}
m2 := &model.TeamMember{TeamId: teamID, UserId: u2.Id}
_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2}, 0)
require.Error(t, nErr)
require.Equal(t, "limit exceeded: what: TeamMember count: 2 metadata: team members limit exceeded", nErr.Error())
})
t.Run("too many members in one team because previous existing members", func(t *testing.T) {
teamID := model.NewId()
m1 := &model.TeamMember{TeamId: teamID, UserId: u1.Id}
m2 := &model.TeamMember{TeamId: teamID, UserId: u2.Id}
m3 := &model.TeamMember{TeamId: teamID, UserId: u3.Id}
m4 := &model.TeamMember{TeamId: teamID, UserId: u4.Id}
_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2}, 3)
require.NoError(t, nErr)
_, nErr = ss.Team().SaveMultipleMembers([]*model.TeamMember{m3, m4}, 3)
require.Error(t, nErr)
require.Equal(t, "limit exceeded: what: TeamMember count: 4 metadata: team members limit exceeded", nErr.Error())
})
t.Run("too many members, but in different teams", func(t *testing.T) {
teamID1 := model.NewId()
teamID2 := model.NewId()
m1 := &model.TeamMember{TeamId: teamID1, UserId: u1.Id}
m2 := &model.TeamMember{TeamId: teamID1, UserId: u2.Id}
m3 := &model.TeamMember{TeamId: teamID1, UserId: u3.Id}
m4 := &model.TeamMember{TeamId: teamID2, UserId: u1.Id}
m5 := &model.TeamMember{TeamId: teamID2, UserId: u2.Id}
_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4, m5}, 2)
require.Error(t, nErr)
require.Equal(t, "limit exceeded: what: TeamMember count: 3 metadata: team members limit exceeded", nErr.Error())
})
t.Run("duplicated entries should fail", func(t *testing.T) {
teamID1 := model.NewId()
m1 := &model.TeamMember{TeamId: teamID1, UserId: u1.Id}
m2 := &model.TeamMember{TeamId: teamID1, UserId: u1.Id}
_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2}, 10)
require.Error(t, nErr)
require.IsType(t, &store.ErrConflict{}, nErr)
})
t.Run("insert members correctly (in team without scheme)", func(t *testing.T) {
team := &model.Team{
DisplayName: "Name",
Name: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
}
team, nErr := ss.Team().Save(team)
require.NoError(t, nErr)
testCases := []struct {
Name string
SchemeGuest bool
SchemeUser bool
SchemeAdmin bool
ExplicitRoles string
ExpectedRoles string
ExpectedExplicitRoles string
ExpectedSchemeGuest bool
ExpectedSchemeUser bool
ExpectedSchemeAdmin bool
}{
{
Name: "team user implicit",
SchemeUser: true,
ExpectedRoles: "team_user",
ExpectedSchemeUser: true,
},
{
Name: "team user explicit",
ExplicitRoles: "team_user",
ExpectedRoles: "team_user",
ExpectedSchemeUser: true,
},
{
Name: "team guest implicit",
SchemeGuest: true,
ExpectedRoles: "team_guest",
ExpectedSchemeGuest: true,
},
{
Name: "team guest explicit",
ExplicitRoles: "team_guest",
ExpectedRoles: "team_guest",
ExpectedSchemeGuest: true,
},
{
Name: "team admin implicit",
SchemeUser: true,
SchemeAdmin: true,
ExpectedRoles: "team_user team_admin",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team admin explicit",
ExplicitRoles: "team_user team_admin",
ExpectedRoles: "team_user team_admin",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team user implicit and explicit custom role",
SchemeUser: true,
ExplicitRoles: "test",
ExpectedRoles: "test team_user",
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
},
{
Name: "team user explicit and explicit custom role",
ExplicitRoles: "team_user test",
ExpectedRoles: "test team_user",
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
},
{
Name: "team guest implicit and explicit custom role",
SchemeGuest: true,
ExplicitRoles: "test",
ExpectedRoles: "test team_guest",
ExpectedExplicitRoles: "test",
ExpectedSchemeGuest: true,
},
{
Name: "team guest explicit and explicit custom role",
ExplicitRoles: "team_guest test",
ExpectedRoles: "test team_guest",
ExpectedExplicitRoles: "test",
ExpectedSchemeGuest: true,
},
{
Name: "team admin implicit and explicit custom role",
SchemeUser: true,
SchemeAdmin: true,
ExplicitRoles: "test",
ExpectedRoles: "test team_user team_admin",
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team admin explicit and explicit custom role",
ExplicitRoles: "team_user team_admin test",
ExpectedRoles: "test team_user team_admin",
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team member with only explicit custom roles",
ExplicitRoles: "test test2",
ExpectedRoles: "test test2",
ExpectedExplicitRoles: "test test2",
},
}
for _, tc := range testCases {
t.Run(tc.Name, func(t *testing.T) {
member := &model.TeamMember{
TeamId: team.Id,
UserId: u1.Id,
SchemeGuest: tc.SchemeGuest,
SchemeUser: tc.SchemeUser,
SchemeAdmin: tc.SchemeAdmin,
ExplicitRoles: tc.ExplicitRoles,
}
otherMember := &model.TeamMember{
TeamId: team.Id,
UserId: u2.Id,
SchemeGuest: tc.SchemeGuest,
SchemeUser: tc.SchemeUser,
SchemeAdmin: tc.SchemeAdmin,
ExplicitRoles: tc.ExplicitRoles,
}
var members []*model.TeamMember
members, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{member, otherMember}, -1)
require.NoError(t, nErr)
require.Len(t, members, 2)
member = members[0]
defer ss.Team().RemoveMember(rctx, team.Id, u1.Id)
defer ss.Team().RemoveMember(rctx, team.Id, u2.Id)
assert.Equal(t, tc.ExpectedRoles, member.Roles)
assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
})
}
})
t.Run("insert members correctly (in team with scheme)", func(t *testing.T) {
ts := &model.Scheme{
Name: NewTestID(),
DisplayName: NewTestID(),
Description: NewTestID(),
Scope: model.SchemeScopeTeam,
}
ts, nErr := ss.Scheme().Save(ts)
require.NoError(t, nErr)
team := &model.Team{
DisplayName: "Name",
Name: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
SchemeId: &ts.Id,
}
team, nErr = ss.Team().Save(team)
require.NoError(t, nErr)
testCases := []struct {
Name string
SchemeGuest bool
SchemeUser bool
SchemeAdmin bool
ExplicitRoles string
ExpectedRoles string
ExpectedExplicitRoles string
ExpectedSchemeGuest bool
ExpectedSchemeUser bool
ExpectedSchemeAdmin bool
}{
{
Name: "team user implicit",
SchemeUser: true,
ExpectedRoles: ts.DefaultTeamUserRole,
ExpectedSchemeUser: true,
},
{
Name: "team user explicit",
ExplicitRoles: "team_user",
ExpectedRoles: ts.DefaultTeamUserRole,
ExpectedSchemeUser: true,
},
{
Name: "team guest implicit",
SchemeGuest: true,
ExpectedRoles: ts.DefaultTeamGuestRole,
ExpectedSchemeGuest: true,
},
{
Name: "team guest explicit",
ExplicitRoles: "team_guest",
ExpectedRoles: ts.DefaultTeamGuestRole,
ExpectedSchemeGuest: true,
},
{
Name: "team admin implicit",
SchemeUser: true,
SchemeAdmin: true,
ExpectedRoles: ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team admin explicit",
ExplicitRoles: "team_user team_admin",
ExpectedRoles: ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team user implicit and explicit custom role",
SchemeUser: true,
ExplicitRoles: "test",
ExpectedRoles: "test " + ts.DefaultTeamUserRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
},
{
Name: "team user explicit and explicit custom role",
ExplicitRoles: "team_user test",
ExpectedRoles: "test " + ts.DefaultTeamUserRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
},
{
Name: "team guest implicit and explicit custom role",
SchemeGuest: true,
ExplicitRoles: "test",
ExpectedRoles: "test " + ts.DefaultTeamGuestRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeGuest: true,
},
{
Name: "team guest explicit and explicit custom role",
ExplicitRoles: "team_guest test",
ExpectedRoles: "test " + ts.DefaultTeamGuestRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeGuest: true,
},
{
Name: "team admin implicit and explicit custom role",
SchemeUser: true,
SchemeAdmin: true,
ExplicitRoles: "test",
ExpectedRoles: "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team admin explicit and explicit custom role",
ExplicitRoles: "team_user team_admin test",
ExpectedRoles: "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team member with only explicit custom roles",
ExplicitRoles: "test test2",
ExpectedRoles: "test test2",
ExpectedExplicitRoles: "test test2",
},
}
for _, tc := range testCases {
t.Run(tc.Name, func(t *testing.T) {
member := &model.TeamMember{
TeamId: team.Id,
UserId: u1.Id,
SchemeGuest: tc.SchemeGuest,
SchemeUser: tc.SchemeUser,
SchemeAdmin: tc.SchemeAdmin,
ExplicitRoles: tc.ExplicitRoles,
}
otherMember := &model.TeamMember{
TeamId: team.Id,
UserId: u2.Id,
SchemeGuest: tc.SchemeGuest,
SchemeUser: tc.SchemeUser,
SchemeAdmin: tc.SchemeAdmin,
ExplicitRoles: tc.ExplicitRoles,
}
members, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{member, otherMember}, -1)
require.NoError(t, nErr)
require.Len(t, members, 2)
member = members[0]
defer ss.Team().RemoveMember(rctx, team.Id, u1.Id)
defer ss.Team().RemoveMember(rctx, team.Id, u2.Id)
assert.Equal(t, tc.ExpectedRoles, member.Roles)
assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
})
}
})
}
func testTeamUpdateMember(t *testing.T, rctx request.CTX, ss store.Store) {
u1, err := ss.User().Save(rctx, &model.User{Username: model.NewUsername(), Email: MakeEmail()})
require.NoError(t, err)
t.Run("not valid team member", func(t *testing.T) {
member := &model.TeamMember{TeamId: "wrong", UserId: u1.Id}
_, nErr := ss.Team().UpdateMember(rctx, member)
require.Error(t, nErr)
var appErr *model.AppError
require.True(t, errors.As(nErr, &appErr))
require.Equal(t, "model.team_member.is_valid.team_id.app_error", appErr.Id)
})
t.Run("insert member correctly (in team without scheme)", func(t *testing.T) {
team := &model.Team{
DisplayName: "Name",
Name: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
}
team, nErr := ss.Team().Save(team)
require.NoError(t, nErr)
member := &model.TeamMember{TeamId: team.Id, UserId: u1.Id}
member, nErr = ss.Team().SaveMember(rctx, member, -1)
require.NoError(t, nErr)
testCases := []struct {
Name string
SchemeGuest bool
SchemeUser bool
SchemeAdmin bool
ExplicitRoles string
ExpectedRoles string
ExpectedExplicitRoles string
ExpectedSchemeGuest bool
ExpectedSchemeUser bool
ExpectedSchemeAdmin bool
}{
{
Name: "team user implicit",
SchemeUser: true,
ExpectedRoles: "team_user",
ExpectedSchemeUser: true,
},
{
Name: "team user explicit",
ExplicitRoles: "team_user",
ExpectedRoles: "team_user",
ExpectedSchemeUser: true,
},
{
Name: "team guest implicit",
SchemeGuest: true,
ExpectedRoles: "team_guest",
ExpectedSchemeGuest: true,
},
{
Name: "team guest explicit",
ExplicitRoles: "team_guest",
ExpectedRoles: "team_guest",
ExpectedSchemeGuest: true,
},
{
Name: "team admin implicit",
SchemeUser: true,
SchemeAdmin: true,
ExpectedRoles: "team_user team_admin",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team admin explicit",
ExplicitRoles: "team_user team_admin",
ExpectedRoles: "team_user team_admin",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team user implicit and explicit custom role",
SchemeUser: true,
ExplicitRoles: "test",
ExpectedRoles: "test team_user",
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
},
{
Name: "team user explicit and explicit custom role",
ExplicitRoles: "team_user test",
ExpectedRoles: "test team_user",
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
},
{
Name: "team guest implicit and explicit custom role",
SchemeGuest: true,
ExplicitRoles: "test",
ExpectedRoles: "test team_guest",
ExpectedExplicitRoles: "test",
ExpectedSchemeGuest: true,
},
{
Name: "team guest explicit and explicit custom role",
ExplicitRoles: "team_guest test",
ExpectedRoles: "test team_guest",
ExpectedExplicitRoles: "test",
ExpectedSchemeGuest: true,
},
{
Name: "team admin implicit and explicit custom role",
SchemeUser: true,
SchemeAdmin: true,
ExplicitRoles: "test",
ExpectedRoles: "test team_user team_admin",
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team admin explicit and explicit custom role",
ExplicitRoles: "team_user team_admin test",
ExpectedRoles: "test team_user team_admin",
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team member with only explicit custom roles",
ExplicitRoles: "test test2",
ExpectedRoles: "test test2",
ExpectedExplicitRoles: "test test2",
},
}
for _, tc := range testCases {
t.Run(tc.Name, func(t *testing.T) {
member.SchemeGuest = tc.SchemeGuest
member.SchemeUser = tc.SchemeUser
member.SchemeAdmin = tc.SchemeAdmin
member.ExplicitRoles = tc.ExplicitRoles
member, nErr = ss.Team().UpdateMember(rctx, member)
require.NoError(t, nErr)
assert.Equal(t, tc.ExpectedRoles, member.Roles)
assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
})
}
})
t.Run("insert member correctly (in team with scheme)", func(t *testing.T) {
ts := &model.Scheme{
Name: NewTestID(),
DisplayName: NewTestID(),
Description: NewTestID(),
Scope: model.SchemeScopeTeam,
}
ts, nErr := ss.Scheme().Save(ts)
require.NoError(t, nErr)
team := &model.Team{
DisplayName: "Name",
Name: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
SchemeId: &ts.Id,
}
team, nErr = ss.Team().Save(team)
require.NoError(t, nErr)
member := &model.TeamMember{TeamId: team.Id, UserId: u1.Id}
member, nErr = ss.Team().SaveMember(rctx, member, -1)
require.NoError(t, nErr)
testCases := []struct {
Name string
SchemeGuest bool
SchemeUser bool
SchemeAdmin bool
ExplicitRoles string
ExpectedRoles string
ExpectedExplicitRoles string
ExpectedSchemeGuest bool
ExpectedSchemeUser bool
ExpectedSchemeAdmin bool
}{
{
Name: "team user implicit",
SchemeUser: true,
ExpectedRoles: ts.DefaultTeamUserRole,
ExpectedSchemeUser: true,
},
{
Name: "team user explicit",
ExplicitRoles: "team_user",
ExpectedRoles: ts.DefaultTeamUserRole,
ExpectedSchemeUser: true,
},
{
Name: "team guest implicit",
SchemeGuest: true,
ExpectedRoles: ts.DefaultTeamGuestRole,
ExpectedSchemeGuest: true,
},
{
Name: "team guest explicit",
ExplicitRoles: "team_guest",
ExpectedRoles: ts.DefaultTeamGuestRole,
ExpectedSchemeGuest: true,
},
{
Name: "team admin implicit",
SchemeUser: true,
SchemeAdmin: true,
ExpectedRoles: ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team admin explicit",
ExplicitRoles: "team_user team_admin",
ExpectedRoles: ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team user implicit and explicit custom role",
SchemeUser: true,
ExplicitRoles: "test",
ExpectedRoles: "test " + ts.DefaultTeamUserRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
},
{
Name: "team user explicit and explicit custom role",
ExplicitRoles: "team_user test",
ExpectedRoles: "test " + ts.DefaultTeamUserRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
},
{
Name: "team guest implicit and explicit custom role",
SchemeGuest: true,
ExplicitRoles: "test",
ExpectedRoles: "test " + ts.DefaultTeamGuestRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeGuest: true,
},
{
Name: "team guest explicit and explicit custom role",
ExplicitRoles: "team_guest test",
ExpectedRoles: "test " + ts.DefaultTeamGuestRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeGuest: true,
},
{
Name: "team admin implicit and explicit custom role",
SchemeUser: true,
SchemeAdmin: true,
ExplicitRoles: "test",
ExpectedRoles: "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team admin explicit and explicit custom role",
ExplicitRoles: "team_user team_admin test",
ExpectedRoles: "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team member with only explicit custom roles",
ExplicitRoles: "test test2",
ExpectedRoles: "test test2",
ExpectedExplicitRoles: "test test2",
},
}
for _, tc := range testCases {
t.Run(tc.Name, func(t *testing.T) {
member.SchemeGuest = tc.SchemeGuest
member.SchemeUser = tc.SchemeUser
member.SchemeAdmin = tc.SchemeAdmin
member.ExplicitRoles = tc.ExplicitRoles
member, nErr = ss.Team().UpdateMember(rctx, member)
require.NoError(t, nErr)
assert.Equal(t, tc.ExpectedRoles, member.Roles)
assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
})
}
})
}
func testTeamUpdateMultipleMembers(t *testing.T, rctx request.CTX, ss store.Store) {
u1, err := ss.User().Save(rctx, &model.User{Username: model.NewUsername(), Email: MakeEmail()})
require.NoError(t, err)
u2, err := ss.User().Save(rctx, &model.User{Username: model.NewUsername(), Email: MakeEmail()})
require.NoError(t, err)
t.Run("any not valid team member", func(t *testing.T) {
m1 := &model.TeamMember{TeamId: "wrong", UserId: u1.Id}
m2 := &model.TeamMember{TeamId: model.NewId(), UserId: u2.Id}
_, nErr := ss.Team().UpdateMultipleMembers([]*model.TeamMember{m1, m2})
require.Error(t, nErr)
var appErr *model.AppError
require.True(t, errors.As(nErr, &appErr))
require.Equal(t, "model.team_member.is_valid.team_id.app_error", appErr.Id)
})
t.Run("update members correctly (in team without scheme)", func(t *testing.T) {
team := &model.Team{
DisplayName: "Name",
Name: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
}
team, nErr := ss.Team().Save(team)
require.NoError(t, nErr)
member := &model.TeamMember{TeamId: team.Id, UserId: u1.Id}
otherMember := &model.TeamMember{TeamId: team.Id, UserId: u2.Id}
var members []*model.TeamMember
members, nErr = ss.Team().SaveMultipleMembers([]*model.TeamMember{member, otherMember}, -1)
require.NoError(t, nErr)
require.Len(t, members, 2)
member = members[0]
otherMember = members[1]
testCases := []struct {
Name string
SchemeGuest bool
SchemeUser bool
SchemeAdmin bool
ExplicitRoles string
ExpectedRoles string
ExpectedExplicitRoles string
ExpectedSchemeGuest bool
ExpectedSchemeUser bool
ExpectedSchemeAdmin bool
}{
{
Name: "team user implicit",
SchemeUser: true,
ExpectedRoles: "team_user",
ExpectedSchemeUser: true,
},
{
Name: "team user explicit",
ExplicitRoles: "team_user",
ExpectedRoles: "team_user",
ExpectedSchemeUser: true,
},
{
Name: "team guest implicit",
SchemeGuest: true,
ExpectedRoles: "team_guest",
ExpectedSchemeGuest: true,
},
{
Name: "team guest explicit",
ExplicitRoles: "team_guest",
ExpectedRoles: "team_guest",
ExpectedSchemeGuest: true,
},
{
Name: "team admin implicit",
SchemeUser: true,
SchemeAdmin: true,
ExpectedRoles: "team_user team_admin",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team admin explicit",
ExplicitRoles: "team_user team_admin",
ExpectedRoles: "team_user team_admin",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team user implicit and explicit custom role",
SchemeUser: true,
ExplicitRoles: "test",
ExpectedRoles: "test team_user",
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
},
{
Name: "team user explicit and explicit custom role",
ExplicitRoles: "team_user test",
ExpectedRoles: "test team_user",
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
},
{
Name: "team guest implicit and explicit custom role",
SchemeGuest: true,
ExplicitRoles: "test",
ExpectedRoles: "test team_guest",
ExpectedExplicitRoles: "test",
ExpectedSchemeGuest: true,
},
{
Name: "team guest explicit and explicit custom role",
ExplicitRoles: "team_guest test",
ExpectedRoles: "test team_guest",
ExpectedExplicitRoles: "test",
ExpectedSchemeGuest: true,
},
{
Name: "team admin implicit and explicit custom role",
SchemeUser: true,
SchemeAdmin: true,
ExplicitRoles: "test",
ExpectedRoles: "test team_user team_admin",
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team admin explicit and explicit custom role",
ExplicitRoles: "team_user team_admin test",
ExpectedRoles: "test team_user team_admin",
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team member with only explicit custom roles",
ExplicitRoles: "test test2",
ExpectedRoles: "test test2",
ExpectedExplicitRoles: "test test2",
},
}
for _, tc := range testCases {
t.Run(tc.Name, func(t *testing.T) {
member.SchemeGuest = tc.SchemeGuest
member.SchemeUser = tc.SchemeUser
member.SchemeAdmin = tc.SchemeAdmin
member.ExplicitRoles = tc.ExplicitRoles
var members []*model.TeamMember
members, nErr = ss.Team().UpdateMultipleMembers([]*model.TeamMember{member, otherMember})
require.NoError(t, nErr)
require.Len(t, members, 2)
member = members[0]
assert.Equal(t, tc.ExpectedRoles, member.Roles)
assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
})
}
})
t.Run("insert members correctly (in team with scheme)", func(t *testing.T) {
ts := &model.Scheme{
Name: NewTestID(),
DisplayName: NewTestID(),
Description: NewTestID(),
Scope: model.SchemeScopeTeam,
}
ts, nErr := ss.Scheme().Save(ts)
require.NoError(t, nErr)
team := &model.Team{
DisplayName: "Name",
Name: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
SchemeId: &ts.Id,
}
team, nErr = ss.Team().Save(team)
require.NoError(t, nErr)
member := &model.TeamMember{TeamId: team.Id, UserId: u1.Id}
otherMember := &model.TeamMember{TeamId: team.Id, UserId: u2.Id}
members, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{member, otherMember}, -1)
require.NoError(t, nErr)
require.Len(t, members, 2)
member = members[0]
otherMember = members[1]
testCases := []struct {
Name string
SchemeGuest bool
SchemeUser bool
SchemeAdmin bool
ExplicitRoles string
ExpectedRoles string
ExpectedExplicitRoles string
ExpectedSchemeGuest bool
ExpectedSchemeUser bool
ExpectedSchemeAdmin bool
}{
{
Name: "team user implicit",
SchemeUser: true,
ExpectedRoles: ts.DefaultTeamUserRole,
ExpectedSchemeUser: true,
},
{
Name: "team user explicit",
ExplicitRoles: "team_user",
ExpectedRoles: ts.DefaultTeamUserRole,
ExpectedSchemeUser: true,
},
{
Name: "team guest implicit",
SchemeGuest: true,
ExpectedRoles: ts.DefaultTeamGuestRole,
ExpectedSchemeGuest: true,
},
{
Name: "team guest explicit",
ExplicitRoles: "team_guest",
ExpectedRoles: ts.DefaultTeamGuestRole,
ExpectedSchemeGuest: true,
},
{
Name: "team admin implicit",
SchemeUser: true,
SchemeAdmin: true,
ExpectedRoles: ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team admin explicit",
ExplicitRoles: "team_user team_admin",
ExpectedRoles: ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team user implicit and explicit custom role",
SchemeUser: true,
ExplicitRoles: "test",
ExpectedRoles: "test " + ts.DefaultTeamUserRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
},
{
Name: "team user explicit and explicit custom role",
ExplicitRoles: "team_user test",
ExpectedRoles: "test " + ts.DefaultTeamUserRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
},
{
Name: "team guest implicit and explicit custom role",
SchemeGuest: true,
ExplicitRoles: "test",
ExpectedRoles: "test " + ts.DefaultTeamGuestRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeGuest: true,
},
{
Name: "team guest explicit and explicit custom role",
ExplicitRoles: "team_guest test",
ExpectedRoles: "test " + ts.DefaultTeamGuestRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeGuest: true,
},
{
Name: "team admin implicit and explicit custom role",
SchemeUser: true,
SchemeAdmin: true,
ExplicitRoles: "test",
ExpectedRoles: "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team admin explicit and explicit custom role",
ExplicitRoles: "team_user team_admin test",
ExpectedRoles: "test " + ts.DefaultTeamUserRole + " " + ts.DefaultTeamAdminRole,
ExpectedExplicitRoles: "test",
ExpectedSchemeUser: true,
ExpectedSchemeAdmin: true,
},
{
Name: "team member with only explicit custom roles",
ExplicitRoles: "test test2",
ExpectedRoles: "test test2",
ExpectedExplicitRoles: "test test2",
},
}
for _, tc := range testCases {
t.Run(tc.Name, func(t *testing.T) {
member.SchemeGuest = tc.SchemeGuest
member.SchemeUser = tc.SchemeUser
member.SchemeAdmin = tc.SchemeAdmin
member.ExplicitRoles = tc.ExplicitRoles
members, err := ss.Team().UpdateMultipleMembers([]*model.TeamMember{member, otherMember})
require.NoError(t, err)
require.Len(t, members, 2)
member = members[0]
assert.Equal(t, tc.ExpectedRoles, member.Roles)
assert.Equal(t, tc.ExpectedExplicitRoles, member.ExplicitRoles)
assert.Equal(t, tc.ExpectedSchemeGuest, member.SchemeGuest)
assert.Equal(t, tc.ExpectedSchemeUser, member.SchemeUser)
assert.Equal(t, tc.ExpectedSchemeAdmin, member.SchemeAdmin)
})
}
})
}
func testTeamRemoveMember(t *testing.T, rctx request.CTX, ss store.Store) {
u1, err := ss.User().Save(rctx, &model.User{Username: model.NewUsername(), Email: MakeEmail()})
require.NoError(t, err)
u2, err := ss.User().Save(rctx, &model.User{Username: model.NewUsername(), Email: MakeEmail()})
require.NoError(t, err)
u3, err := ss.User().Save(rctx, &model.User{Username: model.NewUsername(), Email: MakeEmail()})
require.NoError(t, err)
u4, err := ss.User().Save(rctx, &model.User{Username: model.NewUsername(), Email: MakeEmail()})
require.NoError(t, err)
teamID := model.NewId()
m1 := &model.TeamMember{TeamId: teamID, UserId: u1.Id}
m2 := &model.TeamMember{TeamId: teamID, UserId: u2.Id}
m3 := &model.TeamMember{TeamId: teamID, UserId: u3.Id}
m4 := &model.TeamMember{TeamId: teamID, UserId: u4.Id}
_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4}, -1)
require.NoError(t, nErr)
t.Run("remove member from not existing team", func(t *testing.T) {
nErr = ss.Team().RemoveMember(rctx, "not-existing-team", u1.Id)
require.NoError(t, nErr)
var membersOtherTeam []*model.TeamMember
membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil)
require.NoError(t, nErr)
require.Len(t, membersOtherTeam, 4)
})
t.Run("remove not existing member from an existing team", func(t *testing.T) {
nErr = ss.Team().RemoveMember(rctx, teamID, model.NewId())
require.NoError(t, nErr)
var membersOtherTeam []*model.TeamMember
membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil)
require.NoError(t, nErr)
require.Len(t, membersOtherTeam, 4)
})
t.Run("remove existing member from an existing team", func(t *testing.T) {
nErr = ss.Team().RemoveMember(rctx, teamID, u1.Id)
require.NoError(t, nErr)
defer ss.Team().SaveMember(rctx, m1, -1)
var membersOtherTeam []*model.TeamMember
membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil)
require.NoError(t, nErr)
require.Len(t, membersOtherTeam, 3)
})
}
func testTeamRemoveMembers(t *testing.T, rctx request.CTX, ss store.Store) {
u1, err := ss.User().Save(rctx, &model.User{Username: model.NewUsername(), Email: MakeEmail()})
require.NoError(t, err)
u2, err := ss.User().Save(rctx, &model.User{Username: model.NewUsername(), Email: MakeEmail()})
require.NoError(t, err)
u3, err := ss.User().Save(rctx, &model.User{Username: model.NewUsername(), Email: MakeEmail()})
require.NoError(t, err)
u4, err := ss.User().Save(rctx, &model.User{Username: model.NewUsername(), Email: MakeEmail()})
require.NoError(t, err)
teamID := model.NewId()
m1 := &model.TeamMember{TeamId: teamID, UserId: u1.Id}
m2 := &model.TeamMember{TeamId: teamID, UserId: u2.Id}
m3 := &model.TeamMember{TeamId: teamID, UserId: u3.Id}
m4 := &model.TeamMember{TeamId: teamID, UserId: u4.Id}
_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4}, -1)
require.NoError(t, nErr)
t.Run("remove members from not existing team", func(t *testing.T) {
nErr = ss.Team().RemoveMembers(rctx, "not-existing-team", []string{u1.Id, u2.Id, u3.Id, u4.Id})
require.NoError(t, nErr)
var membersOtherTeam []*model.TeamMember
membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil)
require.NoError(t, nErr)
require.Len(t, membersOtherTeam, 4)
})
t.Run("remove not existing members from an existing team", func(t *testing.T) {
nErr = ss.Team().RemoveMembers(rctx, teamID, []string{model.NewId(), model.NewId()})
require.NoError(t, nErr)
var membersOtherTeam []*model.TeamMember
membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil)
require.NoError(t, nErr)
require.Len(t, membersOtherTeam, 4)
})
t.Run("remove not existing and not existing members from an existing team", func(t *testing.T) {
nErr = ss.Team().RemoveMembers(rctx, teamID, []string{u1.Id, u2.Id, model.NewId(), model.NewId()})
require.NoError(t, nErr)
defer ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2}, -1)
var membersOtherTeam []*model.TeamMember
membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil)
require.NoError(t, nErr)
require.Len(t, membersOtherTeam, 2)
})
t.Run("remove existing members from an existing team", func(t *testing.T) {
nErr = ss.Team().RemoveMembers(rctx, teamID, []string{u1.Id, u2.Id, u3.Id})
require.NoError(t, nErr)
defer ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3}, -1)
var membersOtherTeam []*model.TeamMember
membersOtherTeam, nErr = ss.Team().GetMembers(teamID, 0, 100, nil)
require.NoError(t, nErr)
require.Len(t, membersOtherTeam, 1)
})
}
func testTeamMembersWithPagination(t *testing.T, rctx request.CTX, ss store.Store) {
teamId1 := model.NewId()
teamId2 := model.NewId()
m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
m2 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
m3 := &model.TeamMember{TeamId: teamId2, UserId: model.NewId()}
_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3}, -1)
require.NoError(t, nErr)
ms, errTeam := ss.Team().GetTeamsForUserWithPagination(m1.UserId, 0, 1)
require.NoError(t, errTeam)
require.Len(t, ms, 1)
require.Equal(t, m1.TeamId, ms[0].TeamId)
e := ss.Team().RemoveMember(rctx, teamId1, m1.UserId)
require.NoError(t, e)
ms, err := ss.Team().GetMembers(teamId1, 0, 100, nil)
require.NoError(t, err)
require.Len(t, ms, 1)
require.Equal(t, m2.UserId, ms[0].UserId)
_, nErr = ss.Team().SaveMember(rctx, m1, -1)
require.NoError(t, nErr)
err = ss.Team().RemoveAllMembersByTeam(teamId1)
require.NoError(t, err)
uid := model.NewId()
m4 := &model.TeamMember{TeamId: teamId1, UserId: uid}
m5 := &model.TeamMember{TeamId: teamId2, UserId: uid}
_, nErr = ss.Team().SaveMultipleMembers([]*model.TeamMember{m4, m5}, -1)
require.NoError(t, nErr)
result, err := ss.Team().GetTeamsForUserWithPagination(uid, 0, 1)
require.NoError(t, err)
require.Len(t, result, 1)
nErr = ss.Team().RemoveAllMembersByUser(rctx, uid)
require.NoError(t, nErr)
result, err = ss.Team().GetTeamsForUserWithPagination(uid, 1, 1)
require.NoError(t, err)
require.Empty(t, result)
}
func testSaveTeamMemberMaxMembers(t *testing.T, rctx request.CTX, ss store.Store) {
maxUsersPerTeam := 5
team, errSave := ss.Team().Save(&model.Team{
DisplayName: "DisplayName",
Name: NewTestID(),
Type: model.TeamOpen,
})
require.NoError(t, errSave)
defer func() {
ss.Team().PermanentDelete(team.Id)
}()
userIds := make([]string, maxUsersPerTeam)
for i := range maxUsersPerTeam {
user, err := ss.User().Save(rctx, &model.User{
Username: "a" + NewTestID(),
Email: MakeEmail(),
})
require.NoError(t, err)
userIds[i] = user.Id
defer func(userId string) {
ss.User().PermanentDelete(rctx, userId)
}(userIds[i])
_, nErr := ss.Team().SaveMember(rctx, &model.TeamMember{
TeamId: team.Id,
UserId: userIds[i],
}, maxUsersPerTeam)
require.NoError(t, nErr)
defer func(userId string) {
ss.Team().RemoveMember(rctx, team.Id, userId)
}(userIds[i])
}
totalMemberCount, err := ss.Team().GetTotalMemberCount(team.Id, nil)
require.NoError(t, err)
require.Equal(t, int(totalMemberCount), maxUsersPerTeam, "should start with 5 team members, had %v instead", totalMemberCount)
user, nErr := ss.User().Save(rctx, &model.User{
Username: "a" + NewTestID(),
Email: MakeEmail(),
})
require.NoError(t, nErr)
newUserId := user.Id
defer func() {
ss.User().PermanentDelete(rctx, newUserId)
}()
_, nErr = ss.Team().SaveMember(rctx, &model.TeamMember{
TeamId: team.Id,
UserId: newUserId,
}, maxUsersPerTeam)
require.Error(t, nErr, "shouldn't be able to save member when at maximum members per team")
totalMemberCount, teamErr := ss.Team().GetTotalMemberCount(team.Id, nil)
require.NoError(t, teamErr)
require.Equal(t, maxUsersPerTeam, int(totalMemberCount), "should still have 5 team members, had %v instead", totalMemberCount)
// Leaving the team from the UI sets DeleteAt instead of using TeamStore.RemoveMember
_, teamErr = ss.Team().UpdateMember(rctx, &model.TeamMember{
TeamId: team.Id,
UserId: userIds[0],
DeleteAt: 1234,
})
require.NoError(t, teamErr)
totalMemberCount, teamErr = ss.Team().GetTotalMemberCount(team.Id, nil)
require.NoError(t, teamErr)
require.Equal(t, maxUsersPerTeam-1, int(totalMemberCount), "should now only have 4 team members, had %v instead", totalMemberCount)
_, nErr = ss.Team().SaveMember(rctx, &model.TeamMember{TeamId: team.Id, UserId: newUserId}, maxUsersPerTeam)
require.NoError(t, nErr, "should've been able to save new member after deleting one")
defer ss.Team().RemoveMember(rctx, team.Id, newUserId)
totalMemberCount, teamErr = ss.Team().GetTotalMemberCount(team.Id, nil)
require.NoError(t, teamErr)
require.Equal(t, maxUsersPerTeam, int(totalMemberCount), "should have 5 team members again, had %v instead", totalMemberCount)
// Deactivating a user should make them stop counting against max members
user2, nErr := ss.User().Get(context.Background(), userIds[1])
require.NoError(t, nErr)
user2.DeleteAt = 1234
_, nErr = ss.User().Update(rctx, user2, true)
require.NoError(t, nErr)
user, nErr = ss.User().Save(rctx, &model.User{
Username: "a" + NewTestID(),
Email: MakeEmail(),
})
require.NoError(t, nErr)
newUserId2 := user.Id
_, nErr = ss.Team().SaveMember(rctx, &model.TeamMember{TeamId: team.Id, UserId: newUserId2}, maxUsersPerTeam)
require.NoError(t, nErr, "should've been able to save new member after deleting one")
defer ss.Team().RemoveMember(rctx, team.Id, newUserId2)
}
func testGetTeamMember(t *testing.T, rctx request.CTX, ss store.Store) {
teamId1 := model.NewId()
m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
_, nErr := ss.Team().SaveMember(rctx, m1, -1)
require.NoError(t, nErr)
var rm1 *model.TeamMember
rm1, err := ss.Team().GetMember(rctx, m1.TeamId, m1.UserId)
require.NoError(t, err)
require.Equal(t, rm1.TeamId, m1.TeamId, "bad team id")
require.Equal(t, rm1.UserId, m1.UserId, "bad user id")
_, err = ss.Team().GetMember(rctx, m1.TeamId, "")
require.Error(t, err, "empty user id - should have failed")
_, err = ss.Team().GetMember(rctx, "", m1.UserId)
require.Error(t, err, "empty team id - should have failed")
// Test with a custom team scheme.
s2 := &model.Scheme{
Name: NewTestID(),
DisplayName: NewTestID(),
Description: NewTestID(),
Scope: model.SchemeScopeTeam,
}
s2, nErr = ss.Scheme().Save(s2)
require.NoError(t, nErr)
t.Log(s2)
t2, nErr := ss.Team().Save(&model.Team{
DisplayName: "DisplayName",
Name: NewTestID(),
Type: model.TeamOpen,
SchemeId: &s2.Id,
})
require.NoError(t, nErr)
defer func() {
ss.Team().PermanentDelete(t2.Id)
}()
m2 := &model.TeamMember{TeamId: t2.Id, UserId: model.NewId(), SchemeUser: true}
_, nErr = ss.Team().SaveMember(rctx, m2, -1)
require.NoError(t, nErr)
m3, err := ss.Team().GetMember(rctx, m2.TeamId, m2.UserId)
require.NoError(t, err)
t.Log(m3)
assert.Equal(t, s2.DefaultTeamUserRole, m3.Roles)
m4 := &model.TeamMember{TeamId: t2.Id, UserId: model.NewId(), SchemeGuest: true}
_, nErr = ss.Team().SaveMember(rctx, m4, -1)
require.NoError(t, nErr)
m5, err := ss.Team().GetMember(rctx, m4.TeamId, m4.UserId)
require.NoError(t, err)
assert.Equal(t, s2.DefaultTeamGuestRole, m5.Roles)
}
func testGetTeamMembersByIds(t *testing.T, rctx request.CTX, ss store.Store) {
teamId1 := model.NewId()
m1 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
_, nErr := ss.Team().SaveMember(rctx, m1, -1)
require.NoError(t, nErr)
var r []*model.TeamMember
r, err := ss.Team().GetMembersByIds(m1.TeamId, []string{m1.UserId}, nil)
require.NoError(t, err)
rm1 := r[0]
require.Equal(t, rm1.TeamId, m1.TeamId, "bad team id")
require.Equal(t, rm1.UserId, m1.UserId, "bad user id")
m2 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
_, nErr = ss.Team().SaveMember(rctx, m2, -1)
require.NoError(t, nErr)
rm, err := ss.Team().GetMembersByIds(m1.TeamId, []string{m1.UserId, m2.UserId, model.NewId()}, nil)
require.NoError(t, err)
require.Len(t, rm, 2, "return wrong number of results")
_, err = ss.Team().GetMembersByIds(m1.TeamId, []string{}, nil)
require.Error(t, err, "empty user ids - should have failed")
}
func testTeamStoreMemberCount(t *testing.T, rctx request.CTX, ss store.Store) {
u1 := &model.User{}
u1.Email = MakeEmail()
_, err := ss.User().Save(rctx, u1)
require.NoError(t, err)
u2 := &model.User{}
u2.Email = MakeEmail()
u2.DeleteAt = 1
_, err = ss.User().Save(rctx, u2)
require.NoError(t, err)
teamId1 := model.NewId()
m1 := &model.TeamMember{TeamId: teamId1, UserId: u1.Id}
_, nErr := ss.Team().SaveMember(rctx, m1, -1)
require.NoError(t, nErr)
m2 := &model.TeamMember{TeamId: teamId1, UserId: u2.Id}
_, nErr = ss.Team().SaveMember(rctx, m2, -1)
require.NoError(t, nErr)
var totalMemberCount int64
totalMemberCount, nErr = ss.Team().GetTotalMemberCount(teamId1, nil)
require.NoError(t, nErr)
require.Equal(t, int(totalMemberCount), 2, "wrong count")
var result int64
result, nErr = ss.Team().GetActiveMemberCount(teamId1, nil)
require.NoError(t, nErr)
require.Equal(t, 1, int(result), "wrong count")
m3 := &model.TeamMember{TeamId: teamId1, UserId: model.NewId()}
_, nErr = ss.Team().SaveMember(rctx, m3, -1)
require.NoError(t, nErr)
totalMemberCount, nErr = ss.Team().GetTotalMemberCount(teamId1, nil)
require.NoError(t, nErr)
require.Equal(t, 2, int(totalMemberCount), "wrong count")
result, nErr = ss.Team().GetActiveMemberCount(teamId1, nil)
require.NoError(t, nErr)
require.Equal(t, 1, int(result), "wrong count")
}
func testGetChannelUnreadsForAllTeams(t *testing.T, rctx request.CTX, ss store.Store) {
teamId1 := model.NewId()
teamId2 := model.NewId()
uid := model.NewId()
m1 := &model.TeamMember{TeamId: teamId1, UserId: uid}
m2 := &model.TeamMember{TeamId: teamId2, UserId: uid}
_, nErr := ss.Team().SaveMember(rctx, m1, -1)
require.NoError(t, nErr)
_, nErr = ss.Team().SaveMember(rctx, m2, -1)
require.NoError(t, nErr)
c1 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.ChannelTypeOpen, TotalMsgCount: 100}
_, nErr = ss.Channel().Save(rctx, c1, -1)
require.NoError(t, nErr)
c2 := &model.Channel{TeamId: m2.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.ChannelTypeOpen, TotalMsgCount: 100}
_, nErr = ss.Channel().Save(rctx, c2, -1)
require.NoError(t, nErr)
cm1 := &model.ChannelMember{ChannelId: c1.Id, UserId: m1.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90}
_, err := ss.Channel().SaveMember(rctx, cm1)
require.NoError(t, err)
cm2 := &model.ChannelMember{ChannelId: c2.Id, UserId: m2.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90}
_, err = ss.Channel().SaveMember(rctx, cm2)
require.NoError(t, err)
ms1, nErr := ss.Team().GetChannelUnreadsForAllTeams("", uid)
require.NoError(t, nErr)
membersMap := make(map[string]bool)
for i := range ms1 {
id := ms1[i].TeamId
if _, ok := membersMap[id]; !ok {
membersMap[id] = true
}
}
require.Len(t, membersMap, 2, "Should be the unreads for all the teams")
require.Equal(t, 10, int(ms1[0].MsgCount), "subtraction failed")
ms2, nErr := ss.Team().GetChannelUnreadsForAllTeams(teamId1, uid)
require.NoError(t, nErr)
membersMap = make(map[string]bool)
for i := range ms2 {
id := ms2[i].TeamId
if _, ok := membersMap[id]; !ok {
membersMap[id] = true
}
}
require.Len(t, membersMap, 1, "Should be the unreads for just one team")
require.Equal(t, 10, int(ms2[0].MsgCount), "subtraction failed")
nErr = ss.Team().RemoveAllMembersByUser(rctx, uid)
require.NoError(t, nErr)
}
func testGetChannelUnreadsForTeam(t *testing.T, rctx request.CTX, ss store.Store) {
teamId1 := model.NewId()
uid := model.NewId()
m1 := &model.TeamMember{TeamId: teamId1, UserId: uid}
_, nErr := ss.Team().SaveMember(rctx, m1, -1)
require.NoError(t, nErr)
c1 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.ChannelTypeOpen, TotalMsgCount: 100}
_, nErr = ss.Channel().Save(rctx, c1, -1)
require.NoError(t, nErr)
c2 := &model.Channel{TeamId: m1.TeamId, Name: model.NewId(), DisplayName: "Town Square", Type: model.ChannelTypeOpen, TotalMsgCount: 100}
_, nErr = ss.Channel().Save(rctx, c2, -1)
require.NoError(t, nErr)
cm1 := &model.ChannelMember{ChannelId: c1.Id, UserId: m1.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90}
_, nErr = ss.Channel().SaveMember(rctx, cm1)
require.NoError(t, nErr)
cm2 := &model.ChannelMember{ChannelId: c2.Id, UserId: m1.UserId, NotifyProps: model.GetDefaultChannelNotifyProps(), MsgCount: 90}
_, nErr = ss.Channel().SaveMember(rctx, cm2)
require.NoError(t, nErr)
ms, err := ss.Team().GetChannelUnreadsForTeam(m1.TeamId, m1.UserId)
require.NoError(t, err)
require.Len(t, ms, 2, "wrong length")
require.Equal(t, 10, int(ms[0].MsgCount), "subtraction failed")
}
func testUpdateLastTeamIconUpdate(t *testing.T, rctx request.CTX, ss store.Store) {
// team icon initially updated a second ago
lastTeamIconUpdateInitial := model.GetMillis() - 1000
o1 := &model.Team{}
o1.DisplayName = "Display Name"
o1.Name = "z-z-z" + model.NewId() + "b"
o1.Email = MakeEmail()
o1.Type = model.TeamOpen
o1.LastTeamIconUpdate = lastTeamIconUpdateInitial
o1, err := ss.Team().Save(o1)
require.NoError(t, err)
curTime := model.GetMillis()
err = ss.Team().UpdateLastTeamIconUpdate(o1.Id, curTime)
require.NoError(t, err)
ro1, err := ss.Team().Get(o1.Id)
require.NoError(t, err)
require.Greater(t, ro1.LastTeamIconUpdate, lastTeamIconUpdateInitial, "LastTeamIconUpdate not updated")
}
func testGetTeamsByScheme(t *testing.T, rctx request.CTX, ss store.Store) {
// Create some schemes.
s1 := &model.Scheme{
DisplayName: NewTestID(),
Name: NewTestID(),
Description: NewTestID(),
Scope: model.SchemeScopeTeam,
}
s2 := &model.Scheme{
DisplayName: NewTestID(),
Name: NewTestID(),
Description: NewTestID(),
Scope: model.SchemeScopeTeam,
}
s1, err := ss.Scheme().Save(s1)
require.NoError(t, err)
s2, err = ss.Scheme().Save(s2)
require.NoError(t, err)
// Create and save some teams.
t1 := &model.Team{
Name: NewTestID(),
DisplayName: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
SchemeId: &s1.Id,
}
t2 := &model.Team{
Name: NewTestID(),
DisplayName: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
SchemeId: &s1.Id,
}
t3 := &model.Team{
Name: NewTestID(),
DisplayName: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
}
_, err = ss.Team().Save(t1)
require.NoError(t, err)
_, err = ss.Team().Save(t2)
require.NoError(t, err)
_, err = ss.Team().Save(t3)
require.NoError(t, err)
// Get the teams by a valid Scheme ID.
d, err := ss.Team().GetTeamsByScheme(s1.Id, 0, 100)
assert.NoError(t, err)
assert.Len(t, d, 2)
// Get the teams by a valid Scheme ID where there aren't any matching Teams.
d, err = ss.Team().GetTeamsByScheme(s2.Id, 0, 100)
assert.NoError(t, err)
assert.Empty(t, d)
// Get the teams by an invalid Scheme ID.
d, err = ss.Team().GetTeamsByScheme(model.NewId(), 0, 100)
assert.NoError(t, err)
assert.Empty(t, d)
}
func testTeamStoreMigrateTeamMembers(t *testing.T, rctx request.CTX, ss store.Store) {
s1 := model.NewId()
t1 := &model.Team{
DisplayName: "Name",
Name: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
InviteId: model.NewId(),
SchemeId: &s1,
}
t1, err := ss.Team().Save(t1)
require.NoError(t, err)
tm1 := &model.TeamMember{
TeamId: t1.Id,
UserId: NewTestID(),
ExplicitRoles: "team_admin team_user",
}
tm2 := &model.TeamMember{
TeamId: t1.Id,
UserId: NewTestID(),
ExplicitRoles: "team_user",
}
tm3 := &model.TeamMember{
TeamId: t1.Id,
UserId: NewTestID(),
ExplicitRoles: "something_else",
}
memberships, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{tm1, tm2, tm3}, -1)
require.NoError(t, nErr)
require.Len(t, memberships, 3)
tm1 = memberships[0]
tm2 = memberships[1]
tm3 = memberships[2]
lastDoneTeamId := strings.Repeat("0", 26)
lastDoneUserId := strings.Repeat("0", 26)
for {
res, e := ss.Team().MigrateTeamMembers(lastDoneTeamId, lastDoneUserId)
if assert.NoError(t, e) {
if res == nil {
break
}
lastDoneTeamId = res["TeamId"]
lastDoneUserId = res["UserId"]
}
}
tm1b, err := ss.Team().GetMember(rctx, tm1.TeamId, tm1.UserId)
assert.NoError(t, err)
assert.Equal(t, "", tm1b.ExplicitRoles)
assert.True(t, tm1b.SchemeUser)
assert.True(t, tm1b.SchemeAdmin)
tm2b, err := ss.Team().GetMember(rctx, tm2.TeamId, tm2.UserId)
assert.NoError(t, err)
assert.Equal(t, "", tm2b.ExplicitRoles)
assert.True(t, tm2b.SchemeUser)
assert.False(t, tm2b.SchemeAdmin)
tm3b, err := ss.Team().GetMember(rctx, tm3.TeamId, tm3.UserId)
assert.NoError(t, err)
assert.Equal(t, "something_else", tm3b.ExplicitRoles)
assert.False(t, tm3b.SchemeUser)
assert.False(t, tm3b.SchemeAdmin)
}
func testResetAllTeamSchemes(t *testing.T, rctx request.CTX, ss store.Store) {
s1 := &model.Scheme{
Name: NewTestID(),
DisplayName: NewTestID(),
Description: NewTestID(),
Scope: model.SchemeScopeTeam,
}
s1, err := ss.Scheme().Save(s1)
require.NoError(t, err)
t1 := &model.Team{
Name: NewTestID(),
DisplayName: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
SchemeId: &s1.Id,
}
t2 := &model.Team{
Name: NewTestID(),
DisplayName: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
SchemeId: &s1.Id,
}
t1, err = ss.Team().Save(t1)
require.NoError(t, err)
t2, err = ss.Team().Save(t2)
require.NoError(t, err)
assert.Equal(t, s1.Id, *t1.SchemeId)
assert.Equal(t, s1.Id, *t2.SchemeId)
res := ss.Team().ResetAllTeamSchemes()
assert.NoError(t, res)
t1, err = ss.Team().Get(t1.Id)
require.NoError(t, err)
t2, err = ss.Team().Get(t2.Id)
require.NoError(t, err)
assert.Equal(t, "", *t1.SchemeId)
assert.Equal(t, "", *t2.SchemeId)
}
func testTeamStoreClearAllCustomRoleAssignments(t *testing.T, rctx request.CTX, ss store.Store) {
m1 := &model.TeamMember{
TeamId: model.NewId(),
UserId: model.NewId(),
ExplicitRoles: "team_post_all_public team_user team_admin",
}
m2 := &model.TeamMember{
TeamId: model.NewId(),
UserId: model.NewId(),
ExplicitRoles: "team_user custom_role team_admin another_custom_role",
}
m3 := &model.TeamMember{
TeamId: model.NewId(),
UserId: model.NewId(),
ExplicitRoles: "team_user",
}
m4 := &model.TeamMember{
TeamId: model.NewId(),
UserId: model.NewId(),
ExplicitRoles: "custom_only",
}
_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4}, -1)
require.NoError(t, nErr)
require.NoError(t, (ss.Team().ClearAllCustomRoleAssignments()))
r1, err := ss.Team().GetMember(rctx, m1.TeamId, m1.UserId)
require.NoError(t, err)
assert.Equal(t, m1.ExplicitRoles, r1.Roles)
r2, err := ss.Team().GetMember(rctx, m2.TeamId, m2.UserId)
require.NoError(t, err)
assert.Equal(t, "team_user team_admin", r2.Roles)
r3, err := ss.Team().GetMember(rctx, m3.TeamId, m3.UserId)
require.NoError(t, err)
assert.Equal(t, m3.ExplicitRoles, r3.Roles)
r4, err := ss.Team().GetMember(rctx, m4.TeamId, m4.UserId)
require.NoError(t, err)
assert.Equal(t, "", r4.Roles)
}
func testTeamStoreAnalyticsGetTeamCountForScheme(t *testing.T, rctx request.CTX, ss store.Store) {
s1 := &model.Scheme{
DisplayName: NewTestID(),
Name: NewTestID(),
Description: NewTestID(),
Scope: model.SchemeScopeTeam,
}
s1, err := ss.Scheme().Save(s1)
require.NoError(t, err)
count1, err := ss.Team().AnalyticsGetTeamCountForScheme(s1.Id)
assert.NoError(t, err)
assert.Equal(t, int64(0), count1)
t1 := &model.Team{
Name: NewTestID(),
DisplayName: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
SchemeId: &s1.Id,
}
_, err = ss.Team().Save(t1)
require.NoError(t, err)
count2, err := ss.Team().AnalyticsGetTeamCountForScheme(s1.Id)
assert.NoError(t, err)
assert.Equal(t, int64(1), count2)
t2 := &model.Team{
Name: NewTestID(),
DisplayName: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
SchemeId: &s1.Id,
}
_, err = ss.Team().Save(t2)
require.NoError(t, err)
count3, err := ss.Team().AnalyticsGetTeamCountForScheme(s1.Id)
assert.NoError(t, err)
assert.Equal(t, int64(2), count3)
t3 := &model.Team{
Name: NewTestID(),
DisplayName: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
}
_, err = ss.Team().Save(t3)
require.NoError(t, err)
count4, err := ss.Team().AnalyticsGetTeamCountForScheme(s1.Id)
assert.NoError(t, err)
assert.Equal(t, int64(2), count4)
t4 := &model.Team{
Name: NewTestID(),
DisplayName: NewTestID(),
Email: MakeEmail(),
Type: model.TeamOpen,
SchemeId: &s1.Id,
DeleteAt: model.GetMillis(),
}
_, err = ss.Team().Save(t4)
require.NoError(t, err)
count5, err := ss.Team().AnalyticsGetTeamCountForScheme(s1.Id)
assert.NoError(t, err)
assert.Equal(t, int64(2), count5)
}
func testTeamStoreGetAllForExportAfter(t *testing.T, rctx request.CTX, ss store.Store) {
t1 := model.Team{}
t1.DisplayName = "Name"
t1.Name = NewTestID()
t1.Email = MakeEmail()
t1.Type = model.TeamOpen
_, err := ss.Team().Save(&t1)
require.NoError(t, err)
d1, err := ss.Team().GetAllForExportAfter(10000, strings.Repeat("0", 26))
assert.NoError(t, err)
found := false
for _, team := range d1 {
if team.Id == t1.Id {
found = true
assert.Equal(t, t1.Id, team.Id)
assert.Nil(t, team.SchemeId)
assert.Equal(t, t1.Name, team.Name)
}
}
assert.True(t, found)
}
func testTeamStoreGetTeamMembersForExport(t *testing.T, rctx request.CTX, ss store.Store) {
t1 := model.Team{}
t1.DisplayName = "Name"
t1.Name = NewTestID()
t1.Email = MakeEmail()
t1.Type = model.TeamOpen
_, err := ss.Team().Save(&t1)
require.NoError(t, err)
u1 := model.User{}
u1.Email = MakeEmail()
u1.Nickname = NewTestID()
_, err = ss.User().Save(rctx, &u1)
require.NoError(t, err)
u2 := model.User{}
u2.Email = MakeEmail()
u2.Nickname = NewTestID()
_, err = ss.User().Save(rctx, &u2)
require.NoError(t, err)
m1 := &model.TeamMember{TeamId: t1.Id, UserId: u1.Id}
m2 := &model.TeamMember{TeamId: t1.Id, UserId: u2.Id}
_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2}, -1)
require.NoError(t, nErr)
d1, err := ss.Team().GetTeamMembersForExport(u1.Id)
assert.NoError(t, err)
assert.Len(t, d1, 1)
tmfe1 := d1[0]
assert.Equal(t, t1.Id, tmfe1.TeamId)
assert.Equal(t, u1.Id, tmfe1.UserId)
assert.Equal(t, t1.Name, tmfe1.TeamName)
}
func testGroupSyncedTeamCount(t *testing.T, rctx request.CTX, ss store.Store) {
team1, err := ss.Team().Save(&model.Team{
DisplayName: NewTestID(),
Name: NewTestID(),
Email: MakeEmail(),
Type: model.TeamInvite,
GroupConstrained: model.NewPointer(true),
})
require.NoError(t, err)
require.True(t, team1.IsGroupConstrained())
defer ss.Team().PermanentDelete(team1.Id)
team2, err := ss.Team().Save(&model.Team{
DisplayName: NewTestID(),
Name: "zz" + model.NewId(),
Email: MakeEmail(),
Type: model.TeamInvite,
})
require.NoError(t, err)
require.False(t, team2.IsGroupConstrained())
defer ss.Team().PermanentDelete(team2.Id)
count, err := ss.Team().GroupSyncedTeamCount()
require.NoError(t, err)
require.GreaterOrEqual(t, count, int64(1))
team2.GroupConstrained = model.NewPointer(true)
team2, err = ss.Team().Update(team2)
require.NoError(t, err)
require.True(t, team2.IsGroupConstrained())
countAfter, err := ss.Team().GroupSyncedTeamCount()
require.NoError(t, err)
require.GreaterOrEqual(t, countAfter, count+1)
}
func testGetCommonTeamIDsForMultipleUsers(t *testing.T, rctx request.CTX, ss store.Store) {
// Creating teams
// Team 1
t1 := model.Team{}
t1.DisplayName = "Team 1"
t1.Name = NewTestID()
t1.Email = MakeEmail()
t1.Type = model.TeamOpen
_, err := ss.Team().Save(&t1)
require.NoError(t, err)
// Team 2
t2 := model.Team{}
t2.DisplayName = "Team 2"
t2.Name = NewTestID()
t2.Email = MakeEmail()
t2.Type = model.TeamOpen
_, err = ss.Team().Save(&t2)
require.NoError(t, err)
// Team 3
t3 := model.Team{}
t3.DisplayName = "Team 3"
t3.Name = NewTestID()
t3.Email = MakeEmail()
t3.Type = model.TeamOpen
_, err = ss.Team().Save(&t3)
require.NoError(t, err)
// Creating users
// User 1
u1 := model.User{}
u1.Email = MakeEmail()
u1.Nickname = NewTestID()
_, err = ss.User().Save(rctx, &u1)
require.NoError(t, err)
// User 2
u2 := model.User{}
u2.Email = MakeEmail()
u2.Nickname = NewTestID()
_, err = ss.User().Save(rctx, &u2)
require.NoError(t, err)
t.Run("multiple common teams exist", func(t *testing.T) {
// Add user 1 in team 1 and 2
m1 := &model.TeamMember{TeamId: t1.Id, UserId: u1.Id}
m2 := &model.TeamMember{TeamId: t2.Id, UserId: u1.Id}
// Add user 2 in team1, 2 and 3
m3 := &model.TeamMember{TeamId: t1.Id, UserId: u2.Id}
m4 := &model.TeamMember{TeamId: t2.Id, UserId: u2.Id}
m5 := &model.TeamMember{TeamId: t3.Id, UserId: u2.Id}
// Save team memberships
_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4, m5}, -1)
require.NoError(t, nErr)
// Find common teams between user 1 and user 2
commonTeamIDs, err2 := ss.Team().GetCommonTeamIDsForMultipleUsers([]string{u1.Id, u2.Id})
require.NoError(t, err2)
require.Equal(t, 2, len(commonTeamIDs))
require.Contains(t, commonTeamIDs, t1.Id)
require.Contains(t, commonTeamIDs, t2.Id)
// cleanup
err2 = ss.Team().RemoveAllMembersByUser(rctx, u1.Id)
require.NoError(t, err2)
err2 = ss.Team().RemoveAllMembersByUser(rctx, u2.Id)
require.NoError(t, err2)
})
t.Run("single common teams exist", func(t *testing.T) {
// Add user 1 in team 1 and 2
m1 := &model.TeamMember{TeamId: t1.Id, UserId: u1.Id}
m2 := &model.TeamMember{TeamId: t2.Id, UserId: u1.Id}
// Add user 2 in team1, 2 and 3
m3 := &model.TeamMember{TeamId: t1.Id, UserId: u2.Id}
m5 := &model.TeamMember{TeamId: t3.Id, UserId: u2.Id}
// Save team memberships
_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m5}, -1)
require.NoError(t, nErr)
// Find common teams between user 1 and user 2
commonTeamIDs, err2 := ss.Team().GetCommonTeamIDsForMultipleUsers([]string{u1.Id, u2.Id})
require.NoError(t, err2)
require.Equal(t, 1, len(commonTeamIDs))
require.Contains(t, commonTeamIDs, t1.Id)
// cleanup
err2 = ss.Team().RemoveAllMembersByUser(rctx, u1.Id)
require.NoError(t, err2)
err2 = ss.Team().RemoveAllMembersByUser(rctx, u2.Id)
require.NoError(t, err2)
})
t.Run("no common teams exist", func(t *testing.T) {
// Add user 1 in team 1 and 2
m1 := &model.TeamMember{TeamId: t1.Id, UserId: u1.Id}
// Add user 2 in team1, 2 and 3
m4 := &model.TeamMember{TeamId: t2.Id, UserId: u2.Id}
m5 := &model.TeamMember{TeamId: t3.Id, UserId: u2.Id}
// Save team memberships
_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m4, m5}, -1)
require.NoError(t, nErr)
// Find common teams between user 1 and user 2
commonTeamIDs, err2 := ss.Team().GetCommonTeamIDsForMultipleUsers([]string{u1.Id, u2.Id})
require.NoError(t, err2)
require.Equal(t, 0, len(commonTeamIDs))
// cleanup
err2 = ss.Team().RemoveAllMembersByUser(rctx, u1.Id)
require.NoError(t, err2)
err2 = ss.Team().RemoveAllMembersByUser(rctx, u2.Id)
require.NoError(t, err2)
})
t.Run("some user have no team members", func(t *testing.T) {
// Add user 1 in team 1 and 2
m1 := &model.TeamMember{TeamId: t1.Id, UserId: u1.Id}
m2 := &model.TeamMember{TeamId: t2.Id, UserId: u1.Id}
// We'll leave user 2 without any team
// Save team memberships
_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2}, -1)
require.NoError(t, nErr)
// Find common teams between user 1 and user 2
commonTeamIDs, err2 := ss.Team().GetCommonTeamIDsForMultipleUsers([]string{u1.Id, u2.Id})
require.NoError(t, err2)
require.Equal(t, 0, len(commonTeamIDs))
// cleanup
err2 = ss.Team().RemoveAllMembersByUser(rctx, u1.Id)
require.NoError(t, err2)
})
t.Run("more than two users, common teams exist", func(t *testing.T) {
// User 3
u3 := model.User{}
u3.Email = MakeEmail()
u3.Nickname = NewTestID()
_, err = ss.User().Save(rctx, &u3)
require.NoError(t, err)
// User 4
u4 := model.User{}
u4.Email = MakeEmail()
u4.Nickname = NewTestID()
_, err = ss.User().Save(rctx, &u4)
require.NoError(t, err)
// Add user 1 in team 1 and 2
m1 := &model.TeamMember{TeamId: t1.Id, UserId: u1.Id}
m2 := &model.TeamMember{TeamId: t2.Id, UserId: u1.Id}
// Add user 2 in team1, 2 and 3
m3 := &model.TeamMember{TeamId: t1.Id, UserId: u2.Id}
m4 := &model.TeamMember{TeamId: t2.Id, UserId: u2.Id}
m5 := &model.TeamMember{TeamId: t3.Id, UserId: u2.Id}
// Add user 3 in team 1 and 2
m6 := &model.TeamMember{TeamId: t1.Id, UserId: u3.Id}
m7 := &model.TeamMember{TeamId: t2.Id, UserId: u3.Id}
// Add user 4 in team 1 and 2
m8 := &model.TeamMember{TeamId: t1.Id, UserId: u4.Id}
m9 := &model.TeamMember{TeamId: t2.Id, UserId: u4.Id}
// Save team memberships
_, nErr := ss.Team().SaveMultipleMembers([]*model.TeamMember{m1, m2, m3, m4, m5, m6, m7, m8, m9}, -1)
require.NoError(t, nErr)
// Find common teams between user 1 and user 2
commonTeamIDs, err := ss.Team().GetCommonTeamIDsForMultipleUsers([]string{u1.Id, u2.Id, u3.Id, u4.Id})
require.NoError(t, err)
require.Equal(t, 2, len(commonTeamIDs))
require.Contains(t, commonTeamIDs, t1.Id)
require.Contains(t, commonTeamIDs, t2.Id)
// cleanup
err = ss.Team().RemoveAllMembersByUser(rctx, u1.Id)
require.NoError(t, err)
err = ss.Team().RemoveAllMembersByUser(rctx, u2.Id)
require.NoError(t, err)
})
}