完善二维码池 OCR 配置与识别

This commit is contained in:
yml
2026-06-18 15:22:46 +08:00
parent e8bdf574f4
commit 35f2d93fdf
16 changed files with 1025 additions and 48 deletions
+116 -1
View File
@@ -2,6 +2,7 @@ package chat
import (
"errors"
"strings"
"testing"
"time"
@@ -20,12 +21,93 @@ func setupQrCodeTestDB(t *testing.T) *gorm.DB {
if err != nil {
t.Fatalf("无法创建测试数据库: %v", err)
}
if err := db.AutoMigrate(&model.ChatQrCode{}); err != nil {
if err := db.AutoMigrate(&model.ChatQrCode{}, &model.ChatConversation{}, &model.SystemConfig{}); err != nil {
t.Fatalf("数据库迁移失败: %v", err)
}
return db
}
func TestGetQrCodeOCRConfigReadsSystemConfig(t *testing.T) {
db := setupQrCodeTestDB(t)
repo := NewRepository(db, nil)
rows := []model.SystemConfig{
{Key: qrCodeOCRTokenConfigKey, Value: "test-token"},
{Key: qrCodeOCRJobURLConfigKey, Value: "https://example.test/ocr/jobs"},
{Key: qrCodeOCRModelConfigKey, Value: "PaddleOCR-Test"},
}
if err := db.Create(&rows).Error; err != nil {
t.Fatalf("创建系统配置失败: %v", err)
}
config, err := repo.GetQrCodeOCRConfig(t.Context())
if err != nil {
t.Fatalf("读取 OCR 配置失败: %v", err)
}
if config.Token != "test-token" {
t.Fatalf("token = %q", config.Token)
}
if config.JobURL != "https://example.test/ocr/jobs" {
t.Fatalf("job_url = %q", config.JobURL)
}
if config.Model != "PaddleOCR-Test" {
t.Fatalf("model = %q", config.Model)
}
}
func TestListQrCodesIncludesBoundConversationTitle(t *testing.T) {
db := setupQrCodeTestDB(t)
repo := NewRepository(db, nil)
conversation := model.ChatConversation{
Title: "账号群 L202606180001",
Type: ConversationTypeListingGroup,
Status: "active",
}
if err := db.Create(&conversation).Error; err != nil {
t.Fatalf("创建群聊失败: %v", err)
}
qrcode := model.ChatQrCode{
ImageURL: "/api/files/object?key=qrcode/group.png",
GroupName: "王大锤-鼠鼠跑刀一群",
Status: QrCodeStatusUsed,
ConversationID: &conversation.ID,
CreatedBy: 1,
}
if err := db.Create(&qrcode).Error; err != nil {
t.Fatalf("创建二维码失败: %v", err)
}
items, total, err := repo.ListQrCodes(t.Context(), QrCodeListRequest{Page: 1, Limit: 20})
if err != nil {
t.Fatalf("查询二维码失败: %v", err)
}
if total != 1 || len(items) != 1 {
t.Fatalf("total = %d, len = %d, want 1", total, len(items))
}
if items[0].GroupName != "王大锤-鼠鼠跑刀一群" {
t.Fatalf("群名 = %q", items[0].GroupName)
}
if items[0].BoundConversationTitle != "账号群 L202606180001" {
t.Fatalf("绑定群名 = %q", items[0].BoundConversationTitle)
}
}
func TestParseQrCodeGroupNameCandidates(t *testing.T) {
rawText := strings.Join([]string{
"使用微信或企业微信扫码加入",
"王大锤-鼠鼠跑刀一群",
"这二维码7天内有效",
}, "\n")
candidates := parseQrCodeGroupNameCandidates(rawText)
if len(candidates) == 0 {
t.Fatal("未解析出群名候选")
}
if candidates[0] != "王大锤-鼠鼠跑刀一群" {
t.Fatalf("首个候选 = %q", candidates[0])
}
}
func TestUpdateQrCodeRejectsUsedToUnused(t *testing.T) {
db := setupQrCodeTestDB(t)
repo := NewRepository(db, nil)
@@ -103,3 +185,36 @@ func TestUpdateQrCodeAllowsUnusedToDisabled(t *testing.T) {
t.Fatalf("二维码状态 = %q, want %q", saved.Status, QrCodeStatusDisabled)
}
}
func TestUpdateQrCodeGroupNameAndRenameFlag(t *testing.T) {
db := setupQrCodeTestDB(t)
repo := NewRepository(db, nil)
qrcode := model.ChatQrCode{
ImageURL: "/api/files/object?key=qrcode/unused.png",
Status: QrCodeStatusUnused,
CreatedBy: 1,
}
if err := db.Create(&qrcode).Error; err != nil {
t.Fatalf("创建二维码失败: %v", err)
}
groupName := "王大锤-鼠鼠跑刀一群"
renamed := true
if err := repo.UpdateQrCode(t.Context(), qrcode.ID, UpdateQrCodeRequest{
GroupName: &groupName,
WecomRenamed: &renamed,
}); err != nil {
t.Fatalf("更新二维码失败: %v", err)
}
var saved model.ChatQrCode
if err := db.First(&saved, qrcode.ID).Error; err != nil {
t.Fatalf("查询二维码失败: %v", err)
}
if saved.GroupName != groupName {
t.Fatalf("群名 = %q, want %q", saved.GroupName, groupName)
}
if !saved.WecomRenamed {
t.Fatal("企微改名标记未保存")
}
}