2026-08-11 10:00:07 +08:00
package repository
import (
"database/sql"
"errors"
2026-08-11 10:11:15 +08:00
"fmt"
2026-08-11 10:00:07 +08:00
"testing"
_ "modernc.org/sqlite"
"cmautobuy/admin/model"
)
func TestCatalogImportRun_登记查询重放和冲突 ( t * testing . T ) {
db , err := sql . Open ( "sqlite" , ":memory:" )
if err != nil {
t . Fatal ( err )
}
defer db . Close ()
if _ , err := db . Exec ( `CREATE TABLE catalog_import_runs (
source TEXT NOT NULL,batch_id TEXT NOT NULL,request_hash TEXT NOT NULL,status TEXT NOT NULL,
2026-08-11 11:03:18 +08:00
request_count INTEGER NOT NULL,conflict_count INTEGER NOT NULL,observed_at TEXT,update_policy TEXT NOT NULL DEFAULT 'fill_missing',last_request_at TEXT NOT NULL,
2026-08-11 10:00:07 +08:00
last_conflict_at TEXT,shopee_created INTEGER NOT NULL DEFAULT 0,shopee_updated INTEGER NOT NULL DEFAULT 0,
2026-08-11 11:03:18 +08:00
sku_created INTEGER NOT NULL DEFAULT 0,sku_updated INTEGER NOT NULL DEFAULT 0,sku_filled INTEGER NOT NULL DEFAULT 0,sku_same_source_updated INTEGER NOT NULL DEFAULT 0,sku_skipped INTEGER NOT NULL DEFAULT 0,sku_manual_skipped INTEGER NOT NULL DEFAULT 0,sku_stale_skipped INTEGER NOT NULL DEFAULT 0,pdd_created INTEGER NOT NULL DEFAULT 0,
2026-08-11 10:00:07 +08:00
pdd_updated INTEGER NOT NULL DEFAULT 0,association_created INTEGER NOT NULL DEFAULT 0,
association_unchanged INTEGER NOT NULL DEFAULT 0,failure_count INTEGER NOT NULL DEFAULT 0,
error_summary TEXT,response_body TEXT,created_at TEXT NOT NULL,finished_at TEXT,
PRIMARY KEY(source,batch_id))` ); err != nil {
t . Fatal ( err )
}
run := model . CatalogImportRun { Source : "script-a" , BatchID : "batch-1" , RequestHash : "abc" ,
Status : model . CatalogImportProcessing , ObservedAt : "2026-08-11T00:00:00Z" ,
LastRequestAt : "2026-08-11T00:01:00Z" , CreatedAt : "2026-08-11T00:01:00Z" }
if err := InsertCatalogImportRun ( db , run ); err != nil {
t . Fatal ( err )
}
if err := InsertCatalogImportRun ( db , run ); ! errors . Is ( err , ErrCatalogImportRunExists ) {
t . Fatalf ( "重复批次应由唯一键拦截:%v" , err )
}
if err := RecordCatalogImportReplay ( db , run . Source , run . BatchID , "2026-08-11T00:02:00Z" ); err != nil {
t . Fatal ( err )
}
if err := RecordCatalogImportConflict ( db , run . Source , run . BatchID , "2026-08-11T00:03:00Z" ); err != nil {
t . Fatal ( err )
}
got , err := GetCatalogImportRun ( db , run . Source , run . BatchID )
if err != nil {
t . Fatal ( err )
}
if got . RequestCount != 3 || got . ConflictCount != 1 || got . LastConflictAt == "" {
t . Fatalf ( "批次计数不正确:%+v" , got )
}
2026-08-11 10:11:15 +08:00
other := run
other . Source , other . BatchID = "script-b" , "batch-2"
if err := InsertCatalogImportRun ( db , other ); err != nil {
t . Fatal ( err )
}
list , total , err := ListCatalogImportRuns ( db , "script-a" , model . CatalogImportProcessing , 20 , 0 )
if err != nil || total != 1 || len ( list ) != 1 || list [ 0 ]. BatchID != "batch-1" {
t . Fatalf ( "分页筛选错误:total=%d list=%+v err=%v" , total , list , err )
}
sources , err := ListCatalogImportSources ( db )
if err != nil || len ( sources ) != 2 {
t . Fatalf ( "来源列表错误:%v %v" , sources , err )
}
for i := 3 ; i <= 1001 ; i ++ {
bulk := run
bulk . Source = "script-b"
bulk . BatchID = fmt . Sprintf ( "batch-%04d" , i )
if err := InsertCatalogImportRun ( db , bulk ); err != nil {
t . Fatal ( err )
}
}
page , total , err := ListCatalogImportRuns ( db , "script-b" , "" , 20 , 20 )
if err != nil || total != 1000 || len ( page ) != 20 {
t . Fatalf ( "1000 条数据库分页错误:total=%d rows=%d err=%v" , total , len ( page ), err )
}
2026-08-11 10:00:07 +08:00
}