Files
cms-server/data/user_test.go
Asai Neko 210b8b08ce
All checks were successful
Server Check Build (NixCN CMS) TeamCity build finished
Add test for all components
Signed-off-by: Asai Neko <sugar@sne.moe>
2026-03-26 18:19:26 +08:00

163 lines
4.0 KiB
Go

package data_test
import (
"context"
"testing"
"github.com/google/uuid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"nixcn-cms/data"
"nixcn-cms/testutil"
)
func TestUserCreateAndGetByEmail(t *testing.T) {
testutil.Setup(t)
ctx := context.Background()
u := data.NewUser(
data.WithEmail("alice@example.com"),
data.WithUsername("alice"),
data.WithPermissionLevel(10),
)
require.NoError(t, u.Create(ctx))
assert.NotEqual(t, uuid.Nil, u.UserId)
got, err := new(data.User).GetByEmail(ctx, &u.Email)
require.NoError(t, err)
assert.Equal(t, u.Email, got.Email)
assert.Equal(t, u.UserId, got.UserId)
}
func TestUserGetByEmailNotFound(t *testing.T) {
testutil.Setup(t)
ctx := context.Background()
email := "nobody@example.com"
_, err := new(data.User).GetByEmail(ctx, &email)
require.Error(t, err)
}
func TestUserGetByUserId(t *testing.T) {
testutil.Setup(t)
ctx := context.Background()
u := data.NewUser(
data.WithEmail("bob@example.com"),
data.WithUsername("bob"),
data.WithPermissionLevel(20),
)
require.NoError(t, u.Create(ctx))
got, err := new(data.User).GetByUserId(ctx, &u.UserId)
require.NoError(t, err)
require.NotNil(t, got)
assert.Equal(t, u.Email, got.Email)
}
func TestUserGetByUserIdNotFound(t *testing.T) {
testutil.Setup(t)
ctx := context.Background()
missing := uuid.New()
got, err := new(data.User).GetByUserId(ctx, &missing)
require.NoError(t, err)
assert.Nil(t, got)
}
func TestUserPatchByUserId(t *testing.T) {
testutil.Setup(t)
ctx := context.Background()
u := data.NewUser(data.WithEmail("carol@example.com"), data.WithUsername("carol"), data.WithPermissionLevel(10))
require.NoError(t, u.Create(ctx))
require.NoError(t, new(data.User).PatchByUserId(ctx, u.UserId,
data.WithNickname("Carol Smith"),
data.WithPermissionLevel(20),
))
got, err := new(data.User).GetByUserId(ctx, &u.UserId)
require.NoError(t, err)
assert.Equal(t, "Carol Smith", got.Nickname)
assert.Equal(t, uint(20), got.PermissionLevel)
}
func TestUserPatchByUserIdNoOp(t *testing.T) {
testutil.Setup(t)
ctx := context.Background()
u := data.NewUser(data.WithEmail("dave@example.com"), data.WithUsername("dave"), data.WithPermissionLevel(10))
require.NoError(t, u.Create(ctx))
require.NoError(t, new(data.User).PatchByUserId(ctx, u.UserId))
}
func TestUserFastListUsers(t *testing.T) {
testutil.Setup(t)
ctx := context.Background()
for i := 0; i < 5; i++ {
u := data.NewUser(
data.WithEmail(uuid.New().String()+"@example.com"),
data.WithUsername(uuid.New().String()),
data.WithPermissionLevel(10),
)
require.NoError(t, u.Create(ctx))
}
limit, offset := 3, 0
results, err := new(data.User).FastListUsers(ctx, &limit, &offset)
require.NoError(t, err)
assert.Len(t, *results, 3)
}
func TestUserListUsersFiltered(t *testing.T) {
testutil.Setup(t)
ctx := context.Background()
for _, lvl := range []uint{10, 10, 30} {
u := data.NewUser(
data.WithEmail(uuid.New().String()+"@example.com"),
data.WithUsername(uuid.New().String()),
data.WithPermissionLevel(lvl),
)
require.NoError(t, u.Create(ctx))
}
lvl := uint(10)
results, total, err := new(data.User).ListUsersFiltered(ctx, data.UserListOptions{
PermissionLevel: &lvl,
Limit: 10,
Offset: 0,
})
require.NoError(t, err)
assert.Equal(t, int64(2), total)
assert.Len(t, *results, 2)
}
func TestUserListUsersSortAndPaginate(t *testing.T) {
testutil.Setup(t)
ctx := context.Background()
for _, lvl := range []uint{10, 20, 30} {
u := data.NewUser(
data.WithEmail(uuid.New().String()+"@example.com"),
data.WithUsername(uuid.New().String()),
data.WithPermissionLevel(lvl),
)
require.NoError(t, u.Create(ctx))
}
results, total, err := new(data.User).ListUsersFiltered(ctx, data.UserListOptions{
SortBy: "permission_level",
SortOrder: "desc",
Limit: 2,
Offset: 0,
})
require.NoError(t, err)
assert.Equal(t, int64(3), total)
assert.Len(t, *results, 2)
assert.GreaterOrEqual(t, (*results)[0].PermissionLevel, (*results)[1].PermissionLevel)
}