package chat import ( "errors" "testing" "time" "hfb_sys/backend/internal/model" "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" ) func setupQrCodeTestDB(t *testing.T) *gorm.DB { t.Helper() db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{ Logger: logger.Default.LogMode(logger.Silent), }) if err != nil { t.Fatalf("无法创建测试数据库: %v", err) } if err := db.AutoMigrate(&model.ChatQrCode{}); err != nil { t.Fatalf("数据库迁移失败: %v", err) } return db } func TestUpdateQrCodeRejectsUsedToUnused(t *testing.T) { db := setupQrCodeTestDB(t) repo := NewRepository(db, nil) now := time.Date(2026, 6, 18, 12, 0, 0, 0, time.UTC) conversationID := uint64(1001) qrcode := model.ChatQrCode{ ImageURL: "/api/files/object?key=qrcode/used.png", Status: QrCodeStatusUsed, ConversationID: &conversationID, UsedAt: &now, CreatedBy: 1, } if err := db.Create(&qrcode).Error; err != nil { t.Fatalf("创建二维码失败: %v", err) } status := QrCodeStatusUnused err := repo.UpdateQrCode(t.Context(), qrcode.ID, UpdateQrCodeRequest{Status: &status}) if !errors.Is(err, ErrQrCodeCannotReenable) { t.Fatalf("error = %v, want ErrQrCodeCannotReenable", err) } var saved model.ChatQrCode if err := db.First(&saved, qrcode.ID).Error; err != nil { t.Fatalf("查询二维码失败: %v", err) } if saved.Status != QrCodeStatusUsed { t.Fatalf("二维码状态 = %q, want %q", saved.Status, QrCodeStatusUsed) } } func TestUpdateQrCodeRejectsIssuedDisabledToUnused(t *testing.T) { db := setupQrCodeTestDB(t) repo := NewRepository(db, nil) conversationID := uint64(1002) qrcode := model.ChatQrCode{ ImageURL: "/api/files/object?key=qrcode/disabled.png", Status: QrCodeStatusDisabled, ConversationID: &conversationID, CreatedBy: 1, } if err := db.Create(&qrcode).Error; err != nil { t.Fatalf("创建二维码失败: %v", err) } status := QrCodeStatusUnused err := repo.UpdateQrCode(t.Context(), qrcode.ID, UpdateQrCodeRequest{Status: &status}) if !errors.Is(err, ErrQrCodeCannotReenable) { t.Fatalf("error = %v, want ErrQrCodeCannotReenable", err) } } func TestUpdateQrCodeAllowsUnusedToDisabled(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) } status := QrCodeStatusDisabled if err := repo.UpdateQrCode(t.Context(), qrcode.ID, UpdateQrCodeRequest{Status: &status}); 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.Status != QrCodeStatusDisabled { t.Fatalf("二维码状态 = %q, want %q", saved.Status, QrCodeStatusDisabled) } }