完善发货链接签名和作废恢复
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
package service
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"affiliate_dash/internal/model"
|
||||
)
|
||||
|
||||
func TestDeliveryLinkGenerateAuthorizeAndRevoke(t *testing.T) {
|
||||
db := newServiceTestDB(t)
|
||||
merchantID, product := seedFulfillmentMerchant(t, db, "delivery-link", 5000, 5, 100)
|
||||
fulfillmentSvc := NewFulfillmentService(db, nil)
|
||||
deliverySvc := NewDeliveryService(fulfillmentSvc, "https://bff.example", "dlc", "https://shop.example", "link-secret", 60)
|
||||
|
||||
created, err := fulfillmentSvc.CreateOrder(CreateFulfillmentOrderInput{
|
||||
MerchantID: merchantID,
|
||||
APIClientID: 1,
|
||||
ClientOrderNo: "delivery-link-001",
|
||||
SKU: product.SKU,
|
||||
})
|
||||
if err != nil {
|
||||
t.Fatalf("create order: %v", err)
|
||||
}
|
||||
|
||||
link, err := deliverySvc.GetOrCreateDeliveryLink(merchantID, created.Order.OrderNo)
|
||||
if err != nil {
|
||||
t.Fatalf("get delivery link: %v", err)
|
||||
}
|
||||
if !strings.Contains(link.DeliveryURL, "exp=") || !strings.Contains(link.DeliveryURL, "sign=") {
|
||||
t.Fatalf("delivery url should contain exp/sign, got %s", link.DeliveryURL)
|
||||
}
|
||||
|
||||
if _, err := deliverySvc.GetOrder(created.Order.OrderNo, DeliveryLinkAuth{Exp: link.Exp, Sign: link.Sign}); err != nil {
|
||||
t.Fatalf("authorize delivery link: %v", err)
|
||||
}
|
||||
|
||||
if err := deliverySvc.RevokeDeliveryLink(merchantID, created.Order.OrderNo); err != nil {
|
||||
t.Fatalf("revoke delivery link: %v", err)
|
||||
}
|
||||
if _, err := deliverySvc.GetOrder(created.Order.OrderNo, DeliveryLinkAuth{Exp: link.Exp, Sign: link.Sign}); err == nil {
|
||||
t.Fatalf("revoked link should be rejected")
|
||||
} else if sc, ok := err.(interface{ HTTPStatus() int }); !ok || sc.HTTPStatus() != 403 {
|
||||
t.Fatalf("expected 403 after revoke, got %v", err)
|
||||
}
|
||||
|
||||
var order model.FulfillmentOrder
|
||||
if err := db.Where("order_no = ?", created.Order.OrderNo).First(&order).Error; err != nil {
|
||||
t.Fatalf("reload order: %v", err)
|
||||
}
|
||||
if order.DeliveryLinkExpiresAt == nil {
|
||||
t.Fatalf("delivery_link_expires_at should be stored")
|
||||
}
|
||||
if order.DeliveryLinkRevokedAt == nil {
|
||||
t.Fatalf("delivery_link_revoked_at should be stored")
|
||||
}
|
||||
|
||||
restored, err := deliverySvc.RestoreDeliveryLink(merchantID, created.Order.OrderNo)
|
||||
if err != nil {
|
||||
t.Fatalf("restore delivery link: %v", err)
|
||||
}
|
||||
if restored.Exp == link.Exp || restored.Sign == link.Sign || restored.DeliveryURL == link.DeliveryURL {
|
||||
t.Fatalf("restored link should rotate exp/sign, old=%+v restored=%+v", link, restored)
|
||||
}
|
||||
if _, err := deliverySvc.GetOrder(created.Order.OrderNo, DeliveryLinkAuth{Exp: link.Exp, Sign: link.Sign}); err == nil {
|
||||
t.Fatalf("old link should stay invalid after restore")
|
||||
} else if sc, ok := err.(interface{ HTTPStatus() int }); !ok || sc.HTTPStatus() != 403 {
|
||||
t.Fatalf("expected 403 for old link after restore, got %v", err)
|
||||
}
|
||||
if _, err := deliverySvc.GetOrder(created.Order.OrderNo, DeliveryLinkAuth{Exp: restored.Exp, Sign: restored.Sign}); err != nil {
|
||||
t.Fatalf("restored link should be accepted: %v", err)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user