Fix host count for list teams (#861)

- Add test
This commit is contained in:
Zach Wasserman 2021-05-25 15:30:01 -07:00 committed by GitHub
parent 15ee1f5358
commit fef1ce579e
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 61 additions and 4 deletions

View file

@ -98,6 +98,7 @@ var TestFunctions = [...]func(*testing.T, kolide.Datastore){
testCarveUpdateCarve,
testTeamGetSetDelete,
testTeamUsers,
testTeamListTeams,
testUserTeams,
testUserCreateWithTeams,
testSaveHostSoftware,

View file

@ -1,9 +1,12 @@
package datastore
import (
"sort"
"testing"
"time"
"github.com/fleetdm/fleet/server/kolide"
"github.com/fleetdm/fleet/server/test"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
@ -98,5 +101,58 @@ func testTeamUsers(t *testing.T, ds kolide.Datastore) {
team2, err = ds.Team(team2.ID)
require.NoError(t, err)
assert.ElementsMatch(t, team2Users, team2.Users)
}
func testTeamListTeams(t *testing.T, ds kolide.Datastore) {
users := createTestUsers(t, ds)
user1 := kolide.User{Name: users[0].Name, Email: users[0].Email, ID: users[0].ID}
user2 := kolide.User{Name: users[1].Name, Email: users[1].Email, ID: users[1].ID}
team1, err := ds.NewTeam(&kolide.Team{Name: "team1"})
require.NoError(t, err)
team2, err := ds.NewTeam(&kolide.Team{Name: "team2"})
require.NoError(t, err)
teams, err := ds.ListTeams(kolide.ListOptions{})
require.NoError(t, err)
sort.Slice(teams, func(i, j int) bool { return teams[i].Name < teams[j].Name })
assert.Equal(t, "team1", teams[0].Name)
assert.Equal(t, 0, teams[0].HostCount)
assert.Equal(t, 0, teams[0].UserCount)
assert.Equal(t, "team2", teams[1].Name)
assert.Equal(t, 0, teams[1].HostCount)
assert.Equal(t, 0, teams[1].UserCount)
host1 := test.NewHost(t, ds, "1", "1", "1", "1", time.Now())
host2 := test.NewHost(t, ds, "2", "2", "2", "2", time.Now())
host3 := test.NewHost(t, ds, "3", "3", "3", "3", time.Now())
require.NoError(t, ds.AddHostsToTeam(&team1.ID, []uint{host1.ID}))
require.NoError(t, ds.AddHostsToTeam(&team2.ID, []uint{host2.ID, host3.ID}))
team1.Users = []kolide.TeamUser{
{User: user1, Role: "maintainer"},
{User: user2, Role: "observer"},
}
team1, err = ds.SaveTeam(team1)
require.NoError(t, err)
team2.Users = []kolide.TeamUser{
{User: user1, Role: "maintainer"},
}
team1, err = ds.SaveTeam(team2)
require.NoError(t, err)
teams, err = ds.ListTeams(kolide.ListOptions{})
require.NoError(t, err)
sort.Slice(teams, func(i, j int) bool { return teams[i].Name < teams[j].Name })
assert.Equal(t, "team1", teams[0].Name)
assert.Equal(t, 1, teams[0].HostCount)
assert.Equal(t, 2, teams[0].UserCount)
assert.Equal(t, "team2", teams[1].Name)
assert.Equal(t, 2, teams[1].HostCount)
assert.Equal(t, 1, teams[1].UserCount)
}

View file

@ -151,9 +151,9 @@ func (d *Datastore) SaveTeam(team *kolide.Team) (*kolide.Team, error) {
func (d *Datastore) ListTeams(opt kolide.ListOptions) ([]*kolide.Team, error) {
query := `
SELECT *,
(SELECT count(*) FROM user_teams WHERE team_id = id) AS user_count,
(SELECT count(*) FROM hosts WHERE team_id = id) AS host_count
FROM teams
(SELECT count(*) FROM user_teams WHERE team_id = t.id) AS user_count,
(SELECT count(*) FROM hosts WHERE team_id = t.id) AS host_count
FROM teams t
WHERE TRUE
`
query, params := searchLike(query, nil, opt.MatchQuery, teamSearchColumns...)