Files
cmautobuy/admin/repository/catalog_import_test.go
T

79 lines
3.4 KiB
Go

package repository
import (
"database/sql"
"errors"
"fmt"
"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,
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,
last_conflict_at TEXT,shopee_created INTEGER NOT NULL DEFAULT 0,shopee_updated INTEGER NOT NULL DEFAULT 0,shopee_fields_filled INTEGER NOT NULL DEFAULT 0,shopee_fields_same_source_updated INTEGER NOT NULL DEFAULT 0,shopee_fields_manual_skipped INTEGER NOT NULL DEFAULT 0,shopee_fields_stale_skipped INTEGER NOT NULL DEFAULT 0,
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,
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)
}
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)
}
}