Skip to content

Commit 1358d81

Browse files
committed
feat: sort users by username
1 parent e016c30 commit 1358d81

File tree

4 files changed

+16
-23
lines changed

4 files changed

+16
-23
lines changed

coderd/database/dbfake/databasefake.go

Lines changed: 2 additions & 7 deletions
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 sort.StringsAreSorted([]string{a.Username, b.Username})
942937
})
943938

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

coderd/database/dbfake/databasefake_test.go

Lines changed: 10 additions & 10 deletions
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

Lines changed: 2 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

coderd/database/queries/users.sql

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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);

0 commit comments

Comments
 (0)