Files
kra-new/internal/data/system/user_business_status_test.go
T

44 lines
1.5 KiB
Go

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("留下部分状态或资料更新")
}
}