修正发货回调流程
This commit is contained in:
@@ -20,6 +20,8 @@ func newServiceTestDB(t *testing.T) *gorm.DB {
|
||||
&model.WalletLedgerEntry{},
|
||||
&model.FulfillmentOrder{},
|
||||
&model.FulfillmentJob{},
|
||||
&model.CallbackSubscription{},
|
||||
&model.CallbackDelivery{},
|
||||
&model.AuditLog{},
|
||||
)
|
||||
}
|
||||
@@ -455,3 +457,70 @@ func TestCreateTestOrderSupportsFailedFulfillableStatus(t *testing.T) {
|
||||
t.Fatalf("failed test order should be re-fulfillable, got %+v", openOrder)
|
||||
}
|
||||
}
|
||||
|
||||
func TestHandleShipNotifyUpdatesOrderJobAndEnqueuesMerchantCallback(t *testing.T) {
|
||||
db := newServiceTestDB(t)
|
||||
merchantID, product := seedFulfillmentMerchant(t, db, "merchant-source-notify", 1000, 2, 100)
|
||||
codec, err := NewSecretCodec("test-master-key")
|
||||
if err != nil {
|
||||
t.Fatalf("codec: %v", err)
|
||||
}
|
||||
callbackSvc := NewCallbackService(db, codec)
|
||||
svc := NewFulfillmentService(db, callbackSvc)
|
||||
created, err := svc.CreateOrder(CreateFulfillmentOrderInput{
|
||||
MerchantID: merchantID,
|
||||
APIClientID: 31,
|
||||
ClientOrderNo: "client-source-notify",
|
||||
SKU: product.SKU,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("create order: %v", err)
|
||||
}
|
||||
if _, err := callbackSvc.CreateSubscription(merchantID, CreateCallbackInput{
|
||||
Name: "履约回调",
|
||||
URL: "https://example.com/callback",
|
||||
Events: "order.fulfillment.updated",
|
||||
}, 7); err != nil {
|
||||
t.Fatalf("create callback subscription: %v", err)
|
||||
}
|
||||
|
||||
result, err := svc.HandleShipNotify(ShipNotifyInput{
|
||||
OrderNo: created.Order.OrderNo,
|
||||
ShipStatus: "success",
|
||||
ProviderOrderNo: "SRC-10001",
|
||||
FailReason: "ignored",
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("handle ship notify: %v", err)
|
||||
}
|
||||
if result.Status != "delivered" {
|
||||
t.Fatalf("unexpected notify result: %+v", result)
|
||||
}
|
||||
|
||||
var order model.FulfillmentOrder
|
||||
if err := db.First(&order, created.Order.ID).Error; err != nil {
|
||||
t.Fatalf("query order: %v", err)
|
||||
}
|
||||
if order.FulfillmentStatus != model.FulfillmentStatusSucceeded || order.ProviderOrderNo != "SRC-10001" || order.DeliveredAt == nil {
|
||||
t.Fatalf("unexpected order after source notify: %+v", order)
|
||||
}
|
||||
var job model.FulfillmentJob
|
||||
if err := db.Where("order_id = ?", created.Order.ID).First(&job).Error; err != nil {
|
||||
t.Fatalf("query fulfillment job: %v", err)
|
||||
}
|
||||
if job.Status != model.FulfillmentJobStatusSucceeded || job.ProviderOrderNo != "SRC-10001" {
|
||||
t.Fatalf("unexpected job after source notify: %+v", job)
|
||||
}
|
||||
var delivery model.CallbackDelivery
|
||||
if err := db.Where("merchant_id = ? AND event = ?", merchantID, "order.fulfillment.updated").First(&delivery).Error; err != nil {
|
||||
t.Fatalf("query callback delivery: %v", err)
|
||||
}
|
||||
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)
|
||||
}
|
||||
var auditCount int64
|
||||
db.Model(&model.AuditLog{}).Where("entity_id = ? AND action = ?", created.Order.OrderNo, "ship.notify").Count(&auditCount)
|
||||
if auditCount != 1 {
|
||||
t.Fatalf("expected one ship notify audit, got %d", auditCount)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user