package business import ( "context" "github.com/glebarez/sqlite" "gorm.io/gorm" "kra/internal/biz/business" "path/filepath" "testing" ) type testData struct{ db *gorm.DB } func (d testData) DB() *gorm.DB { return d.db } func openTestDB(t *testing.T) *gorm.DB { t.Helper() db, err := gorm.Open(sqlite.Open(filepath.Join(t.TempDir(), "business.db")), &gorm.Config{}) if err != nil { t.Fatal(err) } sqlDB, err := db.DB() if err != nil { t.Fatal(err) } t.Cleanup(func() { _ = sqlDB.Close() }) for _, step := range Migrations() { if err := step.Migrate(db); err != nil { t.Fatal(err) } } return db } func TestPreferencePreservesLegacyValuesAndUpserts(t *testing.T) { db := openTestDB(t) r := NewUserPreferenceRepo(testData{db}) ctx := context.Background() if pref, err := r.Find(ctx, 5); err != nil || pref != nil { t.Fatalf("缺省记录错误: %+v %v", pref, err) } if err := db.Exec("INSERT INTO sys_user_preference(user_id,include_sub_promote,idcard_dedup) VALUES (5,NULL,2),(6,1,1)").Error; err != nil { t.Fatal(err) } pref, err := r.Find(ctx, 5) if err != nil || !pref.IncludeSubPromote || !pref.IDCardDedup { t.Fatalf("旧 NULL 和非零值应为开启: %+v %v", pref, err) } for i := 0; i < 2; i++ { if err := r.Save(ctx, 5, business.UserPreference{}); err != nil { t.Fatal(err) } } for _, step := range Migrations() { if err := step.Migrate(db); err != nil { t.Fatal(err) } } pref, err = r.Find(ctx, 5) if err != nil || pref.IncludeSubPromote || pref.IDCardDedup { t.Fatalf("重复迁移不能重置偏好: %+v %v", pref, err) } other, err := r.Find(ctx, 6) if err != nil || !other.IncludeSubPromote || !other.IDCardDedup { t.Fatalf("影响其他用户: %+v %v", other, err) } var count int64 db.Model(&preferencePO{}).Where("user_id = ?", 5).Count(&count) if count != 1 { t.Fatalf("重复写入产生多条记录: %d", count) } }