修复退款幂等与补偿重试
This commit is contained in:
@@ -282,3 +282,67 @@ func TestNotifyResultHasRequiredFields(t *testing.T) {
|
||||
t.Fatal("NotifyResult.Message should not be empty")
|
||||
}
|
||||
}
|
||||
|
||||
func TestStartRefundDoesNotCreateNewOrderWhenFailedRefundExists(t *testing.T) {
|
||||
db := setupPaymentTestDB(t)
|
||||
repo := NewRepository(db, nil, nil)
|
||||
order := model.RentalOrder{
|
||||
ID: 1001,
|
||||
OrderNo: "ORD202606140001",
|
||||
RenterID: 11,
|
||||
RentAmountCent: 800,
|
||||
DepositAmountCent: 200,
|
||||
RefundStatus: "failed",
|
||||
RefundAmountCent: 1000,
|
||||
Status: "closed",
|
||||
}
|
||||
if err := db.Create(&order).Error; err != nil {
|
||||
t.Fatalf("create order failed: %v", err)
|
||||
}
|
||||
original := model.PaymentOrder{
|
||||
PaymentNo: "PAY202606140001",
|
||||
OrderID: order.ID,
|
||||
OrderNo: order.OrderNo,
|
||||
UserID: order.RenterID,
|
||||
Provider: "mock",
|
||||
ThirdOrderID: "PAY202606140001",
|
||||
ProviderOrderID: "MOCKPAY202606140001",
|
||||
AmountCent: 1000,
|
||||
BizType: "order_pay",
|
||||
Status: "paid",
|
||||
}
|
||||
if err := db.Create(&original).Error; err != nil {
|
||||
t.Fatalf("create original payment failed: %v", err)
|
||||
}
|
||||
existingRefund := model.PaymentOrder{
|
||||
PaymentNo: "PAY202606140002",
|
||||
OrderID: order.ID,
|
||||
OrderNo: order.OrderNo,
|
||||
UserID: order.RenterID,
|
||||
Provider: "mock",
|
||||
ThirdOrderID: "REF202606140002",
|
||||
AmountCent: 1000,
|
||||
BizType: "admin_refund",
|
||||
Status: "failed",
|
||||
}
|
||||
if err := db.Create(&existingRefund).Error; err != nil {
|
||||
t.Fatalf("create existing refund failed: %v", err)
|
||||
}
|
||||
|
||||
dto, err := repo.StartRefund(t.Context(), order.ID, 1000, "admin_refund", "后台人工退款")
|
||||
if err != nil {
|
||||
t.Fatalf("StartRefund() error = %v", err)
|
||||
}
|
||||
if dto.ID != existingRefund.ID {
|
||||
t.Fatalf("StartRefund() returned payment id %d, want existing %d", dto.ID, existingRefund.ID)
|
||||
}
|
||||
var count int64
|
||||
if err := db.Model(&model.PaymentOrder{}).
|
||||
Where("order_id = ? AND biz_type = ?", order.ID, "admin_refund").
|
||||
Count(&count).Error; err != nil {
|
||||
t.Fatalf("count refund orders failed: %v", err)
|
||||
}
|
||||
if count != 1 {
|
||||
t.Fatalf("refund order count = %d, want 1", count)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user