Files
hfb_sys/backend/internal/modules/systemconfig/repository_test.go
T
yml2213 33ee8408e9 fix(stability): 修复慢查询雪崩隐患、系统配置死锁与提号翻页错误
- 消除 system_configs 写锁争抢:使用读写锁与启动预热将默认配置初始化收敛为单例,杜绝读请求开事务导致的 Lock wait timeout exceeded
- 强化财务看板缓存:将 Redis 缓存有效期由 1 分钟延长为 5 分钟,接入 singleflight.Group 防并发击穿
- 修复提号列表 GORM 翻页 Bug:分离 Count 查询与列表查询构建,避免重复 Join 导致的 Error 1066
- 生产环境资源加固:docker-compose.prod.yml 中 MySQL 资源限制提升至 2.0 核 CPU、2G 内存
- 补充 systemconfig 并发测试与 pickup 分页 Count 回归测试
2026-09-07 19:45:11 +08:00

73 lines
1.5 KiB
Go

package systemconfig
import (
"context"
"fmt"
"sync"
"testing"
"hfb_sys/backend/internal/model"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
func newTestSystemConfigRepo(t *testing.T) (*Repository, *gorm.DB) {
t.Helper()
dsn := fmt.Sprintf("file:%s?mode=memory&cache=shared", t.Name())
db, err := gorm.Open(sqlite.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Silent),
})
if err != nil {
t.Fatalf("连接测试数据库失败: %v", err)
}
if err := db.AutoMigrate(&model.SystemConfig{}); err != nil {
t.Fatalf("自动迁移 SystemConfig 失败: %v", err)
}
return NewRepository(db), db
}
func TestRepositoryEnsureDefaultsConcurrency(t *testing.T) {
repo, _ := newTestSystemConfigRepo(t)
ctx := context.Background()
// 并发 20 个 goroutine 调用 EnsureDefaults
var wg sync.WaitGroup
errCh := make(chan error, 20)
for i := 0; i < 20; i++ {
wg.Add(1)
go func() {
defer wg.Done()
if err := repo.EnsureDefaults(ctx); err != nil {
errCh <- err
}
}()
}
wg.Wait()
close(errCh)
for err := range errCh {
if err != nil {
t.Fatalf("并发 EnsureDefaults 失败: %v", err)
}
}
// 再次并发调用 FindValue,验证 initialized 为 true 时直接走只读路径
for i := 0; i < 20; i++ {
wg.Add(1)
go func() {
defer wg.Done()
val, err := repo.FindValue(ctx, "handoff.owner_submit_timeout_minutes")
if err != nil {
errCh <- err
return
}
if val != "30" {
errCh <- fmt.Errorf("got %s, want 30", val)
}
}()
}
wg.Wait()
}