feat(adminuser): 优化用户管理筛选并展示筛选人数
- 免押额度与号主类型改为下拉筛选,支持有/无和优质/普通 - 新增用户成长等级筛选 - 列表上方固定展示筛选结果人数,补充组合筛选测试
This commit is contained in:
@@ -85,6 +85,128 @@ func TestApplyUserFilterHasDepositFreeQuota(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestApplyUserFilterNoneDepositFreeQuota(t *testing.T) {
|
||||
db := database.NewDryRunDB()
|
||||
|
||||
stmt := applyUserFilter(db.Table("users AS u"), ListQuery{
|
||||
DepositFreeQuota: "none",
|
||||
}, rentergrowth.DefaultConfig()).Find(&[]struct{}{}).Statement
|
||||
sql := stmt.SQL.String()
|
||||
|
||||
if !strings.Contains(sql, "NOT (u.deposit_free_quota_cent > 0 OR u.renter_growth_points >= ? OR u.renter_growth_level_override IN (?,?,?))") {
|
||||
t.Fatalf("SQL 未包含无免押额度过滤:%s", sql)
|
||||
}
|
||||
}
|
||||
|
||||
func TestApplyUserFilterOwnerTypeAndGrowthLevel(t *testing.T) {
|
||||
db := database.NewDryRunDB()
|
||||
|
||||
stmt := applyUserFilter(db.Table("users AS u"), ListQuery{
|
||||
OwnerType: "normal",
|
||||
GrowthLevel: "diamond",
|
||||
}, rentergrowth.DefaultConfig()).Find(&[]struct{}{}).Statement
|
||||
sql := stmt.SQL.String()
|
||||
|
||||
if !strings.Contains(sql, "u.quality_owner_status <> ?") {
|
||||
t.Fatalf("SQL 未包含普通号主过滤:%s", sql)
|
||||
}
|
||||
if !strings.Contains(sql, "u.renter_growth_level = ?") {
|
||||
t.Fatalf("SQL 未包含成长等级过滤:%s", sql)
|
||||
}
|
||||
if len(stmt.Vars) != 2 || stmt.Vars[0] != "active" || stmt.Vars[1] != "diamond" {
|
||||
t.Fatalf("筛选变量不正确:%v", stmt.Vars)
|
||||
}
|
||||
}
|
||||
|
||||
func TestNormalizeEnumQuery(t *testing.T) {
|
||||
tests := []struct {
|
||||
input string
|
||||
want string
|
||||
}{
|
||||
{input: " QUALITY ", want: "quality"},
|
||||
{input: "normal", want: "normal"},
|
||||
{input: "unknown", want: ""},
|
||||
{input: "", want: ""},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
if got := normalizeEnumQuery(tt.input, "quality", "normal"); got != tt.want {
|
||||
t.Fatalf("normalizeEnumQuery(%q) = %q, want %q", tt.input, got, tt.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestListFiltersByDepositQuotaOwnerTypeAndGrowthLevel(t *testing.T) {
|
||||
db := setupAdminUserTestDB(t)
|
||||
users := []model.User{
|
||||
{Phone: "13900001001", Nickname: "普通无免押", Status: "active", QualityOwnerStatus: "active", RenterGrowthLevel: "normal"},
|
||||
{Phone: "13900001002", Nickname: "铂金有免押", Status: "active", QualityOwnerStatus: "none", RenterGrowthPoints: 300, RenterGrowthLevel: "platinum"},
|
||||
{Phone: "13900001003", Nickname: "钻石有免押", Status: "active", QualityOwnerStatus: "none", RenterGrowthPoints: 1000, RenterGrowthLevel: "diamond"},
|
||||
{Phone: "13900001004", Nickname: "人工免押", Status: "active", QualityOwnerStatus: "none", DepositFreeQuotaCent: 20000, RenterGrowthLevel: "normal"},
|
||||
}
|
||||
if err := db.Create(&users).Error; err != nil {
|
||||
t.Fatalf("创建用户失败:%v", err)
|
||||
}
|
||||
repo := NewRepository(db)
|
||||
|
||||
tests := []struct {
|
||||
name string
|
||||
query ListQuery
|
||||
wantIDs []uint64
|
||||
}{
|
||||
{
|
||||
name: "有免押额度",
|
||||
query: ListQuery{DepositFreeQuota: "has"},
|
||||
wantIDs: []uint64{users[1].ID, users[2].ID, users[3].ID},
|
||||
},
|
||||
{
|
||||
name: "无免押额度",
|
||||
query: ListQuery{DepositFreeQuota: "none"},
|
||||
wantIDs: []uint64{users[0].ID},
|
||||
},
|
||||
{
|
||||
name: "优质号主",
|
||||
query: ListQuery{OwnerType: "quality"},
|
||||
wantIDs: []uint64{users[0].ID},
|
||||
},
|
||||
{
|
||||
name: "普通用户",
|
||||
query: ListQuery{OwnerType: "normal"},
|
||||
wantIDs: []uint64{users[1].ID, users[2].ID, users[3].ID},
|
||||
},
|
||||
{
|
||||
name: "铂金等级",
|
||||
query: ListQuery{GrowthLevel: "platinum"},
|
||||
wantIDs: []uint64{users[1].ID},
|
||||
},
|
||||
{
|
||||
name: "组合筛选",
|
||||
query: ListQuery{OwnerType: "normal", GrowthLevel: "normal", DepositFreeQuota: "has"},
|
||||
wantIDs: []uint64{users[3].ID},
|
||||
},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
result, err := repo.List(t.Context(), 1, 20, tt.query)
|
||||
if err != nil {
|
||||
t.Fatalf("List() error = %v", err)
|
||||
}
|
||||
if result.Total != int64(len(tt.wantIDs)) {
|
||||
t.Fatalf("Total = %d, want %d", result.Total, len(tt.wantIDs))
|
||||
}
|
||||
items := result.Items.([]UserDTO)
|
||||
got := make(map[uint64]bool, len(items))
|
||||
for _, item := range items {
|
||||
got[item.ID] = true
|
||||
}
|
||||
for _, id := range tt.wantIDs {
|
||||
if !got[id] {
|
||||
t.Fatalf("结果缺少用户 %d:%v", id, got)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestAdjustGrowthPointsWritesRepeatableLedgers(t *testing.T) {
|
||||
db := setupAdminUserTestDB(t)
|
||||
user := model.User{
|
||||
|
||||
Reference in New Issue
Block a user