feat: 顺运宝支持输入 PDD 商品 ID (#95)
This commit is contained in:
@@ -2,6 +2,7 @@ package service
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"errors"
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
@@ -9,6 +10,86 @@ import (
|
||||
"cmautobuy/admin/repository"
|
||||
)
|
||||
|
||||
func TestAssociateSybPdd_兼容商品ID并复用已有采集结果(t *testing.T) {
|
||||
db := newTestDB(t)
|
||||
seedWorkflowOrder(t, db, "SYB-PDD-ID", "SP-PDD-ID", "黑色,M")
|
||||
|
||||
if _, err := repository.EnsurePddProduct(db, "737116531267", pddURLA); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := repository.SetCollectResult(db, "737116531267", "已采集商品", "已有店铺", collectedThreeDimensions); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
goodsID, err := AssociateSybPdd(db, "SYB-PDD-ID", " 737116531267 ", false)
|
||||
if err != nil || goodsID != "737116531267" {
|
||||
t.Fatalf("纯商品 ID 关联结果 goodsID=%q err=%v", goodsID, err)
|
||||
}
|
||||
|
||||
product, err := repository.GetPddProductByGoodsID(db, goodsID)
|
||||
if err != nil || product == nil {
|
||||
t.Fatalf("读取复用商品失败: product=%+v err=%v", product, err)
|
||||
}
|
||||
if product.URL != pddURLA || product.CollectStatus != model.CollectCollected ||
|
||||
product.Title != "已采集商品" || product.SkusJSON != collectedThreeDimensions {
|
||||
t.Fatalf("已有采集结果不应被清空或重置: %+v", product)
|
||||
}
|
||||
var productCount, taskCount int
|
||||
db.QueryRow(`SELECT COUNT(*) FROM pdd_products WHERE goods_id = ?`, goodsID).Scan(&productCount)
|
||||
db.QueryRow(`SELECT COUNT(*) FROM tasks`).Scan(&taskCount)
|
||||
if productCount != 1 || taskCount != 0 {
|
||||
t.Fatalf("应复用一条商品且不自动建任务: products=%d tasks=%d", productCount, taskCount)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAssociateSybPdd_新商品ID生成标准链接且完整链接保持兼容(t *testing.T) {
|
||||
t.Run("纯商品ID", func(t *testing.T) {
|
||||
db := newTestDB(t)
|
||||
seedWorkflowOrder(t, db, "SYB-NEW-ID", "SP-NEW-ID", "白色,L")
|
||||
goodsID, err := AssociateSybPdd(db, "SYB-NEW-ID", "123456789", false)
|
||||
if err != nil || goodsID != "123456789" {
|
||||
t.Fatalf("关联结果 goodsID=%q err=%v", goodsID, err)
|
||||
}
|
||||
product, _ := repository.GetPddProductByGoodsID(db, goodsID)
|
||||
if product == nil || product.URL != canonicalPddGoodsURL+goodsID || product.CollectStatus != model.CollectPending {
|
||||
t.Fatalf("新商品 ID 没有生成待采集标准档案: %+v", product)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("完整链接", func(t *testing.T) {
|
||||
db := newTestDB(t)
|
||||
seedWorkflowOrder(t, db, "SYB-FULL-URL", "SP-FULL-URL", "白色,L")
|
||||
goodsID, err := AssociateSybPdd(db, "SYB-FULL-URL", pddURLA, false)
|
||||
if err != nil || goodsID != "737116531267" {
|
||||
t.Fatalf("原完整链接行为回归: goodsID=%q err=%v", goodsID, err)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestAssociateSybPdd_商品ID输入边界和换品确认(t *testing.T) {
|
||||
for _, input := range []string{"12345", "1234567890123456789012345", "737116abc", "普通文本"} {
|
||||
t.Run(input, func(t *testing.T) {
|
||||
db := newTestDB(t)
|
||||
seedWorkflowOrder(t, db, "SYB-BAD-ID", "SP-BAD-ID", "黑色,M")
|
||||
if _, err := AssociateSybPdd(db, "SYB-BAD-ID", input, false); !errors.Is(err, ErrBadPddURL) {
|
||||
t.Fatalf("输入 %q 应返回 ErrBadPddURL,实际 %v", input, err)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
db := newTestDB(t)
|
||||
seedWorkflowOrder(t, db, "SYB-REPLACE", "SP-REPLACE", "黑色,M")
|
||||
if _, err := AssociateSybPdd(db, "SYB-REPLACE", "737116531267", false); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if _, err := AssociateSybPdd(db, "SYB-REPLACE", "937122477375", false); !errors.Is(err, ErrPddAssociationReplaceRequired) {
|
||||
t.Fatalf("纯 ID 换成其他商品仍应要求确认,实际 %v", err)
|
||||
}
|
||||
if _, err := AssociateSybPdd(db, "SYB-REPLACE", "937122477375", true); err != nil {
|
||||
t.Fatalf("确认后应允许更换: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
const collectedThreeDimensions = `{
|
||||
"goods_id":"737116531267",
|
||||
"price_granularity":"sku",
|
||||
|
||||
Reference in New Issue
Block a user