chore(init): 初始化解忧商行项目并完成 Phase 0 基座
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
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()
|
||||
}
|
||||
Reference in New Issue
Block a user