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) }