package service import ( "errors" "testing" "cmautobuy/admin/repository" ) const ( pddURLA = "https://mobile.yangkeduo.com/goods.html?goods_id=737116531267" pddURLB = "https://mobile.yangkeduo.com/goods.html?goods_id=937122477375" ) func TestAssociateShopeePdd_新建并重复复用(t *testing.T) { db := newTestDB(t) seedShopeeProduct(t, db, "1001", "商品一") for i := 0; i < 2; i++ { got, err := AssociateShopeePdd(db, "1001", pddURLA, false) if err != nil { t.Fatalf("第 %d 次关联失败: %v", i+1, err) } if got != "737116531267" { t.Fatalf("goods_id = %q", got) } } var count int db.QueryRow(`SELECT COUNT(*) FROM pdd_products WHERE goods_id = ?`, "737116531267").Scan(&count) if count != 1 { t.Fatalf("同一 PDD 商品建了 %d 条,想要 1", count) } } func TestAssociateShopeePdd_无效链接不写任何数据(t *testing.T) { db := newTestDB(t) seedShopeeProduct(t, db, "1001", "商品一") if _, err := AssociateShopeePdd(db, "1001", "https://p.pinduoduo.com/short", false); err == nil { t.Fatal("短链接应被拒绝") } var pddCount int db.QueryRow(`SELECT COUNT(*) FROM pdd_products`).Scan(&pddCount) product, _ := repository.GetShopeeProductByGoodsID(db, "1001") if pddCount != 0 || product.PddGoodsID != "" { t.Fatalf("失败后仍写入:pdd=%d, link=%q", pddCount, product.PddGoodsID) } } func TestAssociateShopeePdd_换商品必须确认且旧档案保留(t *testing.T) { db := newTestDB(t) seedShopeeProduct(t, db, "1001", "商品一") if _, err := AssociateShopeePdd(db, "1001", pddURLA, false); err != nil { t.Fatal(err) } if _, err := AssociateShopeePdd(db, "1001", pddURLB, false); !errors.Is(err, ErrPddAssociationReplaceRequired) { t.Fatalf("未确认换品错误 = %v", err) } product, _ := repository.GetShopeeProductByGoodsID(db, "1001") if product.PddGoodsID != "737116531267" { t.Fatalf("未确认时关联被改成 %q", product.PddGoodsID) } if _, err := AssociateShopeePdd(db, "1001", pddURLB, true); err != nil { t.Fatal(err) } product, _ = repository.GetShopeeProductByGoodsID(db, "1001") if product.PddGoodsID != "937122477375" { t.Fatalf("确认后关联 = %q", product.PddGoodsID) } old, _ := repository.GetPddProductByGoodsID(db, "737116531267") if old == nil { t.Fatal("换品不应删除旧 PDD 档案") } } func TestAssociateShopeePdd_软删除商品可复活(t *testing.T) { db := newTestDB(t) seedShopeeProduct(t, db, "1001", "商品一") repository.EnsurePddProduct(db, "737116531267", pddURLA) if _, err := repository.SoftDeletePddProducts(db, []string{"737116531267"}); err != nil { t.Fatal(err) } if _, err := AssociateShopeePdd(db, "1001", pddURLA, false); err != nil { t.Fatal(err) } p, _ := repository.GetPddProductByGoodsID(db, "737116531267") if p == nil || p.IsDeleted() { t.Fatal("关联应复活软删除的 PDD 商品") } } func TestCreateShopeePddCollectTask_按当前关联创建(t *testing.T) { db := newTestDB(t) seedShopeeProduct(t, db, "1001", "商品一") AssociateShopeePdd(db, "1001", pddURLA, false) result, err := CreateShopeePddCollectTask(db, "1001") if err != nil || result.Created != 1 { t.Fatalf("创建结果 = %+v, err=%v", result, err) } _, _, _, ok := collectTaskOf(t, db, "737116531267") if !ok { t.Fatal("没有创建采集任务") } }