package systemconfig import ( "context" "fmt" "sync" "testing" "hfb_sys/backend/internal/database" "hfb_sys/backend/internal/model" "gorm.io/gorm" ) func newTestSystemConfigRepo(t *testing.T) (*Repository, *gorm.DB) { t.Helper() db := database.NewTestDB() if err := database.AutoMigrateIfMissing(db, &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() }