恢复测试订单创建

This commit is contained in:
yml2213
2026-07-30 19:04:38 +08:00
parent 2f0104be07
commit 254ba9b721
7 changed files with 417 additions and 24 deletions
+83 -1
View File
@@ -121,7 +121,7 @@ func TestFulfillmentCreateOrderAppliesMerchantFeeRate(t *testing.T) {
db := newServiceTestDB(t)
merchantID, product := seedFulfillmentMerchant(t, db, "merchant-fee-rate", 1000, 5, 200)
if err := db.Model(&model.Merchant{}).Where("id = ?", merchantID).Updates(map[string]interface{}{
"fee_type": model.FeeTypeRate,
"fee_type": model.FeeTypeRate,
"fee_rate_bp": int64(250),
}).Error; err != nil {
t.Fatalf("update merchant fee: %v", err)
@@ -373,3 +373,85 @@ func TestCreateOrderRejectsInsufficientBalance(t *testing.T) {
t.Fatalf("balance should remain unchanged, got %d", wallet.AvailableBalance)
}
}
func TestCreateTestOrderCreatesFulfillableOrderWithoutBilling(t *testing.T) {
db := newServiceTestDB(t)
merchantID, product := seedFulfillmentMerchant(t, db, "merchant-test-order", 0, 0, 100)
originalStock := product.Stock
svc := NewFulfillmentService(db, nil)
order, err := svc.CreateTestOrder(CreateTestOrderInput{
MerchantID: merchantID,
ActorUserID: 99,
SKU: product.SKU,
BuyerReference: "测试买家 A",
Note: "联调测试",
})
if err != nil {
t.Fatalf("create test order: %v", err)
}
if !strings.HasPrefix(order.OrderNo, "O") || order.ClientOrderNo != "TEST-"+order.OrderNo {
t.Fatalf("unexpected test order numbers: %+v", order)
}
if order.PaymentStatus != model.PaymentStatusPaid || order.FulfillmentStatus != model.FulfillmentStatusPending {
t.Fatalf("unexpected test order status: %+v", order)
}
canShip, reason := CanFulfill(order)
if !canShip || reason != "" {
t.Fatalf("test order should be fulfillable, canShip=%v reason=%q", canShip, reason)
}
openOrder, err := svc.QueryOpenOrder(order.OrderNo)
if err != nil {
t.Fatalf("query open order: %v", err)
}
if !openOrder.CanShip || openOrder.Product == nil || openOrder.Product.SKU != product.SKU {
t.Fatalf("unexpected open order: %+v", openOrder)
}
var wallet model.WalletAccount
if err := db.Where("merchant_id = ?", merchantID).First(&wallet).Error; err != nil {
t.Fatalf("query wallet: %v", err)
}
if wallet.AvailableBalance != 0 {
t.Fatalf("test order should not debit wallet, got %d", wallet.AvailableBalance)
}
var refreshed model.MerchantProduct
if err := db.First(&refreshed, product.ID).Error; err != nil {
t.Fatalf("query product: %v", err)
}
if refreshed.Stock != originalStock {
t.Fatalf("test order should not decrease stock, got %d", refreshed.Stock)
}
var ledgerCount int64
db.Model(&model.WalletLedgerEntry{}).Where("merchant_id = ?", merchantID).Count(&ledgerCount)
if ledgerCount != 0 {
t.Fatalf("test order should not create wallet ledger, got %d", ledgerCount)
}
}
func TestCreateTestOrderSupportsFailedFulfillableStatus(t *testing.T) {
db := newServiceTestDB(t)
merchantID, product := seedFulfillmentMerchant(t, db, "merchant-test-failed", 0, -1, 100)
svc := NewFulfillmentService(db, nil)
order, err := svc.CreateTestOrder(CreateTestOrderInput{
MerchantID: merchantID,
SKU: product.SKU,
FulfillmentStatus: model.FulfillmentStatusFailed,
Note: "等待重新发货",
})
if err != nil {
t.Fatalf("create failed test order: %v", err)
}
if order.FulfillmentStatus != model.FulfillmentStatusFailed || order.FailureReason != "等待重新发货" {
t.Fatalf("unexpected failed test order: %+v", order)
}
openOrder, err := svc.QueryOpenOrder(order.OrderNo)
if err != nil {
t.Fatalf("query open failed order: %v", err)
}
if !openOrder.CanShip || openOrder.Status != "ship_failed" {
t.Fatalf("failed test order should be re-fulfillable, got %+v", openOrder)
}
}