package system import ( "context" "testing" "kra/internal/biz/system" ) func TestUserStatusPolicyReadsLockedStateAndWritesTogether(t *testing.T) { data := newTransactionTestData(t) db := data.gormDB.WithContext(context.Background()) user := userPO{Username: "status-user", AuthorityID: 888, Enable: 0, BusinessStatus: 3, NickName: "old"} if err := db.Create(&user).Error; err != nil { t.Fatal(err) } repo := &userRepo{data: data} seen := -1 err := repo.UpdateUserWithStatus(context.Background(), &system.User{ID: user.ID, NickName: "new", Enable: 1}, func(current int) (int, error) { seen = current; return 0, nil }) if err != nil { t.Fatal(err) } var stored userPO if err := db.First(&stored, user.ID).Error; err != nil { t.Fatal(err) } if seen != 3 || stored.Enable != 1 || stored.BusinessStatus != 0 || stored.NickName != "new" { t.Fatalf("状态策略和更新不同步: %+v seen=%d", stored, seen) } if err := db.Exec("CREATE TRIGGER fail_status_update BEFORE UPDATE OF business_status ON sys_users BEGIN SELECT RAISE(ABORT, 'test rejection'); END").Error; err != nil { t.Fatal(err) } err = repo.UpdateUserWithStatus(context.Background(), &system.User{ID: user.ID, NickName: "failed", Enable: 2}, func(int) (int, error) { return 1, nil }) if err == nil { t.Fatal("失败的状态更新应回滚") } if err := db.First(&stored, user.ID).Error; err != nil { t.Fatal(err) } if stored.Enable != 1 || stored.BusinessStatus != 0 || stored.NickName != "new" { t.Fatal("留下部分状态或资料更新") } }