禁止已发放二维码回退待用

This commit is contained in:
yml
2026-06-18 09:59:06 +08:00
parent 58e071d157
commit 7934141ba2
4 changed files with 143 additions and 10 deletions
@@ -0,0 +1,105 @@
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)
}
}