优化二维码池筛选和日期中文化

This commit is contained in:
yml2213
2026-06-19 19:16:52 +08:00
parent f4343ed8a5
commit fcf0230e04
5 changed files with 408 additions and 35 deletions
@@ -104,6 +104,102 @@ func TestListQrCodesIncludesBoundConversationTitle(t *testing.T) {
}
}
func TestListQrCodesFilters(t *testing.T) {
db := setupQrCodeTestDB(t)
repo := NewRepository(db, nil)
now := time.Now()
expiredAt := now.Add(-time.Hour)
validAt := now.Add(7 * 24 * time.Hour)
expiringAt := now.Add(2 * time.Hour)
conversation := model.ChatConversation{
Title: "账号群 绑定测试",
Type: ConversationTypeListingGroup,
Status: "active",
}
if err := db.Create(&conversation).Error; err != nil {
t.Fatalf("创建群聊失败: %v", err)
}
qrcodes := []model.ChatQrCode{
{
ImageURL: "/api/files/object?key=qrcode/unused-a.png",
GroupName: "待用群A",
Status: QrCodeStatusUnused,
CreatedBy: 1,
Note: "六月首批",
ExpiresAt: &validAt,
CreatedAt: now.Add(-48 * time.Hour),
},
{
ImageURL: "/api/files/object?key=qrcode/used-b.png",
GroupName: "已发群B",
Status: QrCodeStatusUsed,
ConversationID: &conversation.ID,
CreatedBy: 1,
Note: "特殊备注",
WecomRenamed: true,
ExpiresAt: &expiredAt,
CreatedAt: now.Add(-2 * time.Hour),
},
{
ImageURL: "/api/files/object?key=qrcode/permanent-c.png",
GroupName: "永久群C",
Status: QrCodeStatusDisabled,
CreatedBy: 1,
Note: "长期备用",
CreatedAt: now.Add(-24 * time.Hour),
},
{
ImageURL: "/api/files/object?key=qrcode/expiring-d.png",
GroupName: "临期群D",
Status: QrCodeStatusUnused,
CreatedBy: 1,
Note: "三天内到期",
ExpiresAt: &expiringAt,
CreatedAt: now.Add(-30 * time.Minute),
},
}
if err := db.Create(&qrcodes).Error; err != nil {
t.Fatalf("创建二维码失败: %v", err)
}
assertListIDs := func(name string, req QrCodeListRequest, want ...uint64) {
t.Helper()
req.Page = 1
req.Limit = 20
items, total, err := repo.ListQrCodes(t.Context(), req)
if err != nil {
t.Fatalf("%s 查询二维码失败: %v", name, err)
}
if total != int64(len(want)) || len(items) != len(want) {
t.Fatalf("%s total = %d, len = %d, want %d", name, total, len(items), len(want))
}
for i, id := range want {
if items[i].ID != id {
t.Fatalf("%s 第 %d 条 ID = %d, want %d", name, i, items[i].ID, id)
}
}
}
assertListIDs("状态", QrCodeListRequest{Status: QrCodeStatusUnused}, qrcodes[3].ID, qrcodes[0].ID)
assertListIDs("关键词群名", QrCodeListRequest{Keyword: "待用群"}, qrcodes[0].ID)
assertListIDs("关键词备注", QrCodeListRequest{Keyword: "特殊备注"}, qrcodes[1].ID)
assertListIDs("关键词绑定群", QrCodeListRequest{Keyword: "绑定测试"}, qrcodes[1].ID)
assertListIDs("企微改名", QrCodeListRequest{WecomRenamed: "true"}, qrcodes[1].ID)
assertListIDs("未绑定", QrCodeListRequest{Bound: "false"}, qrcodes[3].ID, qrcodes[2].ID, qrcodes[0].ID)
assertListIDs("已过期", QrCodeListRequest{ExpireStatus: "expired"}, qrcodes[1].ID)
assertListIDs("永久有效", QrCodeListRequest{ExpireStatus: "permanent"}, qrcodes[2].ID)
assertListIDs("即将过期", QrCodeListRequest{ExpireStatus: "expiring_soon"}, qrcodes[3].ID)
assertListIDs(
"上传时间",
QrCodeListRequest{
CreatedStart: now.Add(-3 * time.Hour).Format(time.RFC3339),
CreatedEnd: now.Add(-90 * time.Minute).Format(time.RFC3339),
},
qrcodes[1].ID,
)
}
func TestParseQrCodeGroupNameCandidates(t *testing.T) {
rawText := strings.Join([]string{
"使用微信或企业微信扫码加入",