按实际纯币金额计算租客优惠与积分

This commit is contained in:
yml2213
2026-07-27 10:45:41 +08:00
parent 99e8eb28af
commit 8af7333969
30 changed files with 983 additions and 154 deletions
@@ -159,6 +159,9 @@ func TestAwardOrderCompletedUpdatesUserAndIsIdempotent(t *testing.T) {
if order.GrowthPointsAwarded != 20 || order.GrowthPointsAwardedAt == nil {
t.Fatalf("order awarded = %d at %v, want 20 with time", order.GrowthPointsAwarded, order.GrowthPointsAwardedAt)
}
if order.GrowthPointsBasisCent != 2000 || order.GrowthPointsPerYuan != 1 {
t.Fatalf("order points basis = %d x %d, want 2000 x 1", order.GrowthPointsBasisCent, order.GrowthPointsPerYuan)
}
var savedUser model.User
if err := db.First(&savedUser, user.ID).Error; err != nil {
t.Fatalf("find user failed: %v", err)
@@ -186,4 +189,72 @@ func TestAwardOrderCompletedUpdatesUserAndIsIdempotent(t *testing.T) {
if ledgerCount != 1 {
t.Fatalf("ledger count = %d, want 1", ledgerCount)
}
if err := RevokeOrderCompleted(db, &order); err != nil {
t.Fatalf("RevokeOrderCompleted() error = %v", err)
}
if err := RevokeOrderCompleted(db, &order); err != nil {
t.Fatalf("second RevokeOrderCompleted() error = %v", err)
}
if err := db.First(&savedUser, user.ID).Error; err != nil {
t.Fatalf("find user after revoke failed: %v", err)
}
if savedUser.RenterGrowthPoints != 290 || savedUser.RenterGrowthLevel != DefaultLevelCode {
t.Fatalf("user growth after revoke = %d/%s, want 290/%s", savedUser.RenterGrowthPoints, savedUser.RenterGrowthLevel, DefaultLevelCode)
}
if err := db.Model(&model.RenterGrowthLedger{}).Where("order_id = ?", order.ID).Count(&ledgerCount).Error; err != nil {
t.Fatalf("count ledger after revoke failed: %v", err)
}
if ledgerCount != 2 {
t.Fatalf("ledger count after revoke = %d, want 2", ledgerCount)
}
}
func TestRevokeOrderCompletedRecordsIdempotencyWhenUserHasNoPoints(t *testing.T) {
db := database.NewTestDB()
if err := db.AutoMigrate(
&model.User{},
&model.RentalOrder{},
&model.SystemConfig{},
&model.RenterGrowthLedger{},
); err != nil {
t.Fatalf("migrate failed: %v", err)
}
user := model.User{Phone: "13800008889", RenterGrowthLevel: DefaultLevelCode}
if err := db.Create(&user).Error; err != nil {
t.Fatalf("create user failed: %v", err)
}
order := model.RentalOrder{
OrderNo: "RG202607260002",
RenterID: user.ID,
GrowthPointsAwarded: 20,
GrowthPointsBasisCent: 2000,
GrowthPointsPerYuan: 1,
}
if err := db.Create(&order).Error; err != nil {
t.Fatalf("create order failed: %v", err)
}
if err := RevokeOrderCompleted(db, &order); err != nil {
t.Fatalf("RevokeOrderCompleted() error = %v", err)
}
if err := db.Model(&model.User{}).Where("id = ?", user.ID).Update("renter_growth_points", 100).Error; err != nil {
t.Fatalf("add later points failed: %v", err)
}
if err := RevokeOrderCompleted(db, &order); err != nil {
t.Fatalf("repeat RevokeOrderCompleted() error = %v", err)
}
var saved model.User
if err := db.First(&saved, user.ID).Error; err != nil {
t.Fatalf("find user failed: %v", err)
}
if saved.RenterGrowthPoints != 100 {
t.Fatalf("later points after repeated callback = %d, want 100", saved.RenterGrowthPoints)
}
var ledger model.RenterGrowthLedger
if err := db.Where("order_id = ? AND source = ?", order.ID, SourceOrderRefunded).First(&ledger).Error; err != nil {
t.Fatalf("find revoke ledger failed: %v", err)
}
if ledger.Points != 0 {
t.Fatalf("revoke ledger points = %d, want 0", ledger.Points)
}
}