Skip to content

Commit 93378da

Browse files
authored
feat: sort users by username (#7838)
1 parent 2ad1308 commit 93378da

File tree

6 files changed

+28
-41
lines changed

6 files changed

+28
-41
lines changed

coderd/database/dbauthz/querier_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -726,14 +726,14 @@ func (s *MethodTestSuite) TestUser() {
726726
check.Args(database.GetFilteredUserCountParams{}).Asserts().Returns(int64(1))
727727
}))
728728
s.Run("GetUsers", s.Subtest(func(db database.Store, check *expects) {
729-
a := dbgen.User(s.T(), db, database.User{CreatedAt: database.Now().Add(-time.Hour)})
730-
b := dbgen.User(s.T(), db, database.User{CreatedAt: database.Now()})
729+
a := dbgen.User(s.T(), db, database.User{Username: "GetUsers-a-user"})
730+
b := dbgen.User(s.T(), db, database.User{Username: "GetUsers-b-user"})
731731
check.Args(database.GetUsersParams{}).
732732
Asserts(a, rbac.ActionRead, b, rbac.ActionRead)
733733
}))
734734
s.Run("GetUsersWithCount", s.Subtest(func(db database.Store, check *expects) {
735-
a := dbgen.User(s.T(), db, database.User{CreatedAt: database.Now().Add(-time.Hour)})
736-
b := dbgen.User(s.T(), db, database.User{CreatedAt: database.Now()})
735+
a := dbgen.User(s.T(), db, database.User{Username: "GetUsersWithCount-a-user"})
736+
b := dbgen.User(s.T(), db, database.User{Username: "GetUsersWithCount-b-user"})
737737
check.Args(database.GetUsersParams{}).Asserts(a, rbac.ActionRead, b, rbac.ActionRead)
738738
}))
739739
s.Run("InsertUser", s.Subtest(func(db database.Store, check *expects) {

coderd/database/dbfake/databasefake.go

+2-7
Original file line numberDiff line numberDiff line change
@@ -931,14 +931,9 @@ func (q *fakeQuerier) GetUsers(_ context.Context, params database.GetUsersParams
931931
users := make([]database.User, len(q.users))
932932
copy(users, q.users)
933933

934-
// Database orders by created_at
934+
// Database orders by username
935935
slices.SortFunc(users, func(a, b database.User) bool {
936-
if a.CreatedAt.Equal(b.CreatedAt) {
937-
// Technically the postgres database also orders by uuid. So match
938-
// that behavior
939-
return a.ID.String() < b.ID.String()
940-
}
941-
return a.CreatedAt.Before(b.CreatedAt)
936+
return a.Username < b.Username
942937
})
943938

944939
// Filter out deleted since they should never be returned..

coderd/database/dbfake/databasefake_test.go

+10-10
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"database/sql"
66
"fmt"
77
"reflect"
8+
"sort"
89
"testing"
910
"time"
1011

@@ -106,26 +107,25 @@ func TestExactMethods(t *testing.T) {
106107
}
107108
}
108109

109-
// TestUserOrder ensures that the fake database returns users in the order they
110-
// were created.
110+
// TestUserOrder ensures that the fake database returns users sorted by username.
111111
func TestUserOrder(t *testing.T) {
112112
t.Parallel()
113113

114114
db := dbfake.New()
115115
now := database.Now()
116-
count := 10
117-
for i := 0; i < count; i++ {
118-
dbgen.User(t, db, database.User{
119-
Username: fmt.Sprintf("user%d", i),
120-
CreatedAt: now,
121-
})
116+
117+
usernames := []string{"b-user", "d-user", "a-user", "c-user", "e-user"}
118+
for _, username := range usernames {
119+
dbgen.User(t, db, database.User{Username: username, CreatedAt: now})
122120
}
123121

124122
users, err := db.GetUsers(context.Background(), database.GetUsersParams{})
125123
require.NoError(t, err)
126-
require.Lenf(t, users, count, "expected %d users", count)
124+
require.Lenf(t, users, len(usernames), "expected %d users", len(usernames))
125+
126+
sort.Strings(usernames)
127127
for i, user := range users {
128-
require.Equal(t, fmt.Sprintf("user%d", i), user.Username)
128+
require.Equal(t, usernames[i], user.Username)
129129
}
130130
}
131131

coderd/database/queries.sql.go

+5-6
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/users.sql

+5-6
Original file line numberDiff line numberDiff line change
@@ -143,11 +143,11 @@ WHERE
143143
-- duplicating or missing data.
144144
WHEN @after_id :: uuid != '00000000-0000-0000-0000-000000000000'::uuid THEN (
145145
-- The pagination cursor is the last ID of the previous page.
146-
-- The query is ordered by the created_at field, so select all
146+
-- The query is ordered by the username field, so select all
147147
-- rows after the cursor.
148-
(created_at, id) > (
148+
(username) > (
149149
SELECT
150-
created_at, id
150+
username
151151
FROM
152152
users
153153
WHERE
@@ -183,9 +183,8 @@ WHERE
183183
END
184184
-- End of filters
185185
ORDER BY
186-
-- Deterministic and consistent ordering of all users, even if they share
187-
-- a timestamp. This is to ensure consistent pagination.
188-
(created_at, id) ASC OFFSET @offset_opt
186+
-- Deterministic and consistent ordering of all users. This is to ensure consistent pagination.
187+
username ASC OFFSET @offset_opt
189188
LIMIT
190189
-- A null limit means "no limit", so 0 means return all
191190
NULLIF(@limit_opt :: int, 0);

coderd/users_test.go

+2-8
Original file line numberDiff line numberDiff line change
@@ -1579,10 +1579,7 @@ func TestPaginatedUsers(t *testing.T) {
15791579
err = eg.Wait()
15801580
require.NoError(t, err, "create users failed")
15811581

1582-
// Sorting the users will sort by (created_at, uuid). This is to handle
1583-
// the off case that created_at is identical for 2 users.
1584-
// This is a really rare case in production, but does happen in unit tests
1585-
// due to the fake database being in memory and exceptionally quick.
1582+
// Sorting the users will sort by username.
15861583
sortUsers(allUsers)
15871584
sortUsers(specialUsers)
15881585

@@ -1697,10 +1694,7 @@ func assertPagination(ctx context.Context, t *testing.T, client *codersdk.Client
16971694
// sortUsers sorts by (created_at, id)
16981695
func sortUsers(users []codersdk.User) {
16991696
sort.Slice(users, func(i, j int) bool {
1700-
if users[i].CreatedAt.Equal(users[j].CreatedAt) {
1701-
return users[i].ID.String() < users[j].ID.String()
1702-
}
1703-
return users[i].CreatedAt.Before(users[j].CreatedAt)
1697+
return users[i].Username < users[j].Username
17041698
})
17051699
}
17061700

0 commit comments

Comments
 (0)