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