From 1929c42e353c2299ffe1e7ca90c92fa706d9a3d4 Mon Sep 17 00:00:00 2001 From: long-agent Date: Sat, 11 Apr 2026 22:26:18 +0800 Subject: [PATCH] test: add comprehensive ListCursor tests with keyword, time range, and role filters --- internal/repository/user_repository_test.go | 102 ++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/internal/repository/user_repository_test.go b/internal/repository/user_repository_test.go index e799b8e..b8b4644 100644 --- a/internal/repository/user_repository_test.go +++ b/internal/repository/user_repository_test.go @@ -705,3 +705,105 @@ func TestUserRepository_ListCursor(t *testing.T) { } } +// TestUserRepository_ListCursor_WithKeyword 测试带关键字过滤的游标分页 +func TestUserRepository_ListCursor_WithKeyword(t *testing.T) { + db := setupTestDB(t) + repo := NewUserRepository(db) + ctx := context.Background() + + repo.Create(ctx, &domain.User{ + Username: "keyworduser1", + Nickname: "张三", + Password: "hash", + Status: domain.UserStatusActive, + }) + repo.Create(ctx, &domain.User{ + Username: "keyworduser2", + Nickname: "李四", + Password: "hash", + Status: domain.UserStatusActive, + }) + repo.Create(ctx, &domain.User{ + Username: "otheruser", + Nickname: "王五", + Password: "hash", + Status: domain.UserStatusActive, + }) + + filter := &AdvancedFilter{Keyword: "keyword", Status: -1, Offset: 0, Limit: 10} + users, _, err := repo.ListCursor(ctx, filter, 10, nil) + if err != nil { + t.Fatalf("ListCursor() error = %v", err) + } + if len(users) != 2 { + t.Errorf("len(users) = %d, want 2", len(users)) + } +} + +// TestUserRepository_ListCursor_WithCreatedRange 测试带创建时间范围的游标分页 +func TestUserRepository_ListCursor_WithCreatedRange(t *testing.T) { + db := setupTestDB(t) + repo := NewUserRepository(db) + ctx := context.Background() + + repo.Create(ctx, &domain.User{ + Username: "timeuser1", + Password: "hash", + Status: domain.UserStatusActive, + }) + repo.Create(ctx, &domain.User{ + Username: "timeuser2", + Password: "hash", + Status: domain.UserStatusActive, + }) + + now := time.Now() + filter := &AdvancedFilter{ + Status: -1, + CreatedFrom: func() *time.Time { t := now.Add(-time.Hour); return &t }(), + CreatedTo: func() *time.Time { return &now }(), + Offset: 0, + Limit: 10, + } + users, _, err := repo.ListCursor(ctx, filter, 10, nil) + if err != nil { + t.Fatalf("ListCursor() error = %v", err) + } + if len(users) != 2 { + t.Errorf("len(users) = %d, want 2", len(users)) + } +} + +// TestUserRepository_ListCursor_WithRoleIDs 测试带角色过滤的游标分页 +func TestUserRepository_ListCursor_WithRoleIDs(t *testing.T) { + db := setupTestDB(t) + repo := NewUserRepository(db) + ctx := context.Background() + + // 创建用户 + user1 := &domain.User{Username: "roleuser1", Password: "hash", Status: domain.UserStatusActive} + user2 := &domain.User{Username: "roleuser2", Password: "hash", Status: domain.UserStatusActive} + repo.Create(ctx, user1) + repo.Create(ctx, user2) + + // 创建角色 + role := &domain.Role{Code: "testrole", Name: "测试角色", Status: domain.RoleStatusEnabled} + db.WithContext(ctx).Create(role) + + // 分配角色给user1 + urRepo := NewUserRoleRepository(db) + urRepo.Create(ctx, &domain.UserRole{UserID: user1.ID, RoleID: role.ID}) + + filter := &AdvancedFilter{RoleIDs: []int64{role.ID}, Status: -1, Offset: 0, Limit: 10} + users, _, err := repo.ListCursor(ctx, filter, 10, nil) + if err != nil { + t.Fatalf("ListCursor() error = %v", err) + } + if len(users) != 1 { + t.Errorf("len(users) = %d, want 1", len(users)) + } + if users[0].Username != "roleuser1" { + t.Errorf("users[0].Username = %s, want roleuser1", users[0].Username) + } +} +