feat: 规范 CSV 预检与安全入库 (#281)
This commit is contained in:
@@ -356,3 +356,44 @@ func TestValidateCatalogBatch_拒绝危险图片URL(t *testing.T) {
|
||||
t.Fatalf("合法图片被拒绝:%v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestPreviewCatalogBatch_只读且报告既有关联冲突(t *testing.T) {
|
||||
db := newCatalogTestDB(t)
|
||||
base := validCatalogBatch()
|
||||
raw, _ := json.Marshal(base)
|
||||
if _, err := ImportCatalogBatch(db, "script-a", base, raw); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
preview := validCatalogBatch()
|
||||
preview.BatchID = "preview-only"
|
||||
preview.DryRun = true
|
||||
preview.Associations[0].PddGoodsID = "P-2"
|
||||
preview.PddProducts[0].GoodsID = "P-2"
|
||||
preview.PddProducts[0].URL = "https://mobile.yangkeduo.com/goods.html?goods_id=P-2"
|
||||
got, err := ImportCatalogBatch(db, "script-a", preview, []byte("unused"))
|
||||
if err != nil || got.Status != "previewed" || len(got.Conflicts) != 1 {
|
||||
t.Fatalf("预检结果错误:%+v %v", got, err)
|
||||
}
|
||||
var runs, pdd int
|
||||
_ = db.QueryRow(`SELECT COUNT(*) FROM catalog_import_runs WHERE batch_id='preview-only'`).Scan(&runs)
|
||||
_ = db.QueryRow(`SELECT COUNT(*) FROM pdd_products WHERE goods_id='P-2'`).Scan(&pdd)
|
||||
if runs != 0 || pdd != 0 {
|
||||
t.Fatalf("预检写入了数据:runs=%d pdd=%d", runs, pdd)
|
||||
}
|
||||
}
|
||||
|
||||
func TestImportCatalogBatch_FillMissing不覆盖已有PDD和商品字段(t *testing.T) {
|
||||
db := newCatalogTestDB(t)
|
||||
base := validCatalogBatch()
|
||||
raw, _ := json.Marshal(base)
|
||||
if _, err := ImportCatalogBatch(db, "script-a", base, raw); err != nil { t.Fatal(err) }
|
||||
_, _ = db.Exec(`UPDATE shopee_products SET title='人工标题',main_sku_code='人工货号' WHERE goods_id='S-1'`)
|
||||
_, _ = db.Exec(`UPDATE pdd_products SET url='https://manual.example/P-1',title='已采集标题',shop_name='已采集店铺',collect_status='collected' WHERE goods_id='P-1'`)
|
||||
fill := validCatalogBatch(); fill.BatchID="no-overwrite"; fill.ShopeeProducts[0].Title="来源标题"; fill.ShopeeProducts[0].MainSKUCode="来源货号"; fill.PddProducts[0].URL="https://mobile.yangkeduo.com/goods.html?goods_id=P-1"; fill.PddProducts[0].Title="来源PDD标题"; fill.PddProducts[0].ShopName="来源PDD店铺"
|
||||
raw, _ = json.Marshal(fill)
|
||||
if _, err := ImportCatalogBatch(db, "thirdparty-csv", fill, raw); err != nil { t.Fatal(err) }
|
||||
var title, mainSKU, url, pddTitle, shop, status string
|
||||
_ = db.QueryRow(`SELECT title,main_sku_code FROM shopee_products WHERE goods_id='S-1'`).Scan(&title,&mainSKU)
|
||||
_ = db.QueryRow(`SELECT url,title,shop_name,collect_status FROM pdd_products WHERE goods_id='P-1'`).Scan(&url,&pddTitle,&shop,&status)
|
||||
if title!="人工标题" || mainSKU!="人工货号" || url!="https://manual.example/P-1" || pddTitle!="已采集标题" || shop!="已采集店铺" || status!="collected" { t.Fatalf("fill_missing 覆盖了已有字段:%q/%q/%q/%q/%q/%q",title,mainSKU,url,pddTitle,shop,status) }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user