统一发货口径并保护结果数据
This commit is contained in:
@@ -393,6 +393,47 @@ func TestOrderStatusTransitions(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestUpdateFulfillmentKeepsResultDataWhenOmitted(t *testing.T) {
|
||||
db := newServiceTestDB(t)
|
||||
merchantID, product := seedFulfillmentMerchant(t, db, "merchant-result-data", 1000, -1, 100)
|
||||
svc := NewFulfillmentService(db, nil)
|
||||
created, err := svc.CreateOrder(CreateFulfillmentOrderInput{
|
||||
MerchantID: merchantID,
|
||||
APIClientID: 13,
|
||||
ClientOrderNo: "client-result-data",
|
||||
SKU: product.SKU,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("create order: %v", err)
|
||||
}
|
||||
delivering, err := svc.UpdateFulfillment(FulfillmentUpdateInput{
|
||||
MerchantID: merchantID,
|
||||
APIClientID: 13,
|
||||
OrderNo: created.Order.OrderNo,
|
||||
Status: model.OrderStatusDelivering,
|
||||
ResultData: map[string]string{"stage": "claimed"},
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("mark delivering: %v", err)
|
||||
}
|
||||
if !strings.Contains(delivering.ResultData, `"stage":"claimed"`) {
|
||||
t.Fatalf("expected initial result_data, got %s", delivering.ResultData)
|
||||
}
|
||||
failed, err := svc.UpdateFulfillment(FulfillmentUpdateInput{
|
||||
MerchantID: merchantID,
|
||||
APIClientID: 13,
|
||||
OrderNo: created.Order.OrderNo,
|
||||
Status: model.OrderStatusShipFailed,
|
||||
FailureReason: "上游暂不可用",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("mark failed: %v", err)
|
||||
}
|
||||
if failed.ResultData != delivering.ResultData {
|
||||
t.Fatalf("result_data should be kept when omitted, before=%s after=%s", delivering.ResultData, failed.ResultData)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMarkProcessingTimeoutsMarksStaleOrdersFailed(t *testing.T) {
|
||||
db := newServiceTestDB(t)
|
||||
merchantID, product := seedFulfillmentMerchant(t, db, "merchant-timeout", 1000, -1, 100)
|
||||
@@ -432,7 +473,7 @@ func TestMarkProcessingTimeoutsMarksStaleOrdersFailed(t *testing.T) {
|
||||
if err := db.First(&order, delivering.ID).Error; err != nil {
|
||||
t.Fatalf("query order: %v", err)
|
||||
}
|
||||
if order.OrderStatus != model.OrderStatusShipFailed || !strings.Contains(order.FailureReason, "履约超时") {
|
||||
if order.OrderStatus != model.OrderStatusShipFailed || !strings.Contains(order.FailureReason, "发货超时") {
|
||||
t.Fatalf("expected failed timeout order, got %+v", order)
|
||||
}
|
||||
if !strings.Contains(order.ResultData, `"timeout":true`) {
|
||||
@@ -668,7 +709,7 @@ func TestHandleShipNotifyUpdatesOrderAndEnqueuesMerchantCallback(t *testing.T) {
|
||||
t.Fatalf("create order: %v", err)
|
||||
}
|
||||
if _, err := callbackSvc.CreateSubscription(merchantID, CreateCallbackInput{
|
||||
Name: "履约回调",
|
||||
Name: "发货回调",
|
||||
URL: "https://example.com/callback",
|
||||
Events: "order.fulfillment.updated",
|
||||
}, 7); err != nil {
|
||||
@@ -702,6 +743,9 @@ func TestHandleShipNotifyUpdatesOrderAndEnqueuesMerchantCallback(t *testing.T) {
|
||||
if !strings.Contains(delivery.Payload, created.Order.OrderNo) || !strings.Contains(delivery.Payload, "SRC-10001") {
|
||||
t.Fatalf("callback payload should contain updated order data, got %s", delivery.Payload)
|
||||
}
|
||||
if !strings.Contains(delivery.Payload, `"can_ship":false`) || strings.Contains(delivery.Payload, "can_fulfill") {
|
||||
t.Fatalf("callback payload should use can_ship fields, got %s", delivery.Payload)
|
||||
}
|
||||
var auditCount int64
|
||||
db.Model(&model.AuditLog{}).Where("entity_id = ? AND action = ?", created.Order.OrderNo, "ship.notify").Count(&auditCount)
|
||||
if auditCount != 1 {
|
||||
|
||||
Reference in New Issue
Block a user