Files
headscale/hscontrol/servertest/apiv1_users_test.go
T
Kristoffer Dalby fe76fe0f57 hscontrol/api/v1: implement user endpoints
CreateUser, ListUsers (with filters), RenameUser, DeleteUser over the state
layer; unknown users now 404. HTTP-parity tests via the generated client.
2026-06-19 05:57:04 +00:00

95 lines
2.6 KiB
Go

package servertest_test
import (
"context"
"net/http"
"testing"
apiv1 "github.com/juanfont/headscale/gen/api/v1"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestAPIv1_CreateUser(t *testing.T) {
srv, client := apiClient(t)
ctx := context.Background()
resp, err := client.CreateUser(ctx, &apiv1.CreateUserReq{
Name: apiv1.NewOptString("alice"),
DisplayName: apiv1.NewOptString("Alice"),
Email: apiv1.NewOptString("alice@example.com"),
})
require.NoError(t, err)
user := resp.User.Value
assert.NotZero(t, user.ID.Value)
assert.Equal(t, "alice", user.Name.Value)
assert.Equal(t, "Alice", user.DisplayName.Value)
assert.Equal(t, "alice@example.com", user.Email.Value)
// Side effect: the user is persisted.
got, err := srv.State().GetUserByName("alice")
require.NoError(t, err)
assert.Equal(t, uint64(got.ID), user.ID.Value)
}
func TestAPIv1_ListUsers(t *testing.T) {
srv, client := apiClient(t)
ctx := context.Background()
srv.CreateUser(t, "alice")
srv.CreateUser(t, "bob")
all, err := client.ListUsers(ctx, apiv1.ListUsersParams{})
require.NoError(t, err)
require.Len(t, all.Users, 2)
// Sorted by id ascending.
assert.Less(t, all.Users[0].ID.Value, all.Users[1].ID.Value)
byName, err := client.ListUsers(ctx, apiv1.ListUsersParams{Name: apiv1.NewOptString("bob")})
require.NoError(t, err)
require.Len(t, byName.Users, 1)
assert.Equal(t, "bob", byName.Users[0].Name.Value)
none, err := client.ListUsers(ctx, apiv1.ListUsersParams{Name: apiv1.NewOptString("nobody")})
require.NoError(t, err)
assert.Empty(t, none.Users)
}
func TestAPIv1_RenameUser(t *testing.T) {
srv, client := apiClient(t)
ctx := context.Background()
u := srv.CreateUser(t, "alice")
resp, err := client.RenameUser(ctx, apiv1.RenameUserParams{
OldID: uint64(u.ID),
NewName: "alice2",
})
require.NoError(t, err)
assert.Equal(t, "alice2", resp.User.Value.Name.Value)
_, err = srv.State().GetUserByName("alice2")
require.NoError(t, err)
// Unknown user is a 404 (the gRPC stack returned 500 here).
_, err = client.RenameUser(ctx, apiv1.RenameUserParams{OldID: 99999, NewName: "ghost"})
requireProblem(t, err, http.StatusNotFound)
}
func TestAPIv1_DeleteUser(t *testing.T) {
srv, client := apiClient(t)
ctx := context.Background()
u := srv.CreateUser(t, "alice")
require.NoError(t, client.DeleteUser(ctx, apiv1.DeleteUserParams{ID: uint64(u.ID)}))
_, err := srv.State().GetUserByName("alice")
require.Error(t, err)
// Deleting an unknown user is a 404.
err = client.DeleteUser(ctx, apiv1.DeleteUserParams{ID: 99999})
requireProblem(t, err, http.StatusNotFound)
}