package service import ( "database/sql" "testing" "cmautobuy/admin/model" ) func insertLiveTask(t *testing.T, db *sql.DB, taskID, clientID string) { t.Helper() now := model.NowISO() _, err := db.Exec(`INSERT INTO tasks (task_id,task_type,status,execution_mode,assigned_client,pdd_goods_url, pdd_goods_id,pdd_options,quantity,max_price_cent,live_confirmed_by, live_confirmed_at,created_at,updated_at) VALUES (?,'purchase','assigned','live',?,'https://example.invalid/1','1', '{"color":"黑色"}',1,100,'USER-1',?,?,?)`, taskID, clientID, now, now, now) if err != nil { t.Fatal(err) } } func TestClaimNextTask_按客户端真实采购能力隔离(t *testing.T) { db := newTestDB(t) insertLiveTask(t, db, "TASK-LIVE", "CLIENT-1") if task, err := ClaimNextTask(db, "CLIENT-1", []string{"purchase"}, "dry_run"); err != nil || task != nil { t.Fatalf("dry_run 客户端不应看见 live 任务: task=%+v err=%v", task, err) } task, err := ClaimNextTask(db, "CLIENT-1", []string{"purchase"}, "live") if err != nil || task == nil || task.ExecutionMode != model.TaskExecutionLive { t.Fatalf("live 客户端应领到 live 任务: task=%+v err=%v", task, err) } } func TestTaskExecutionMode_取消和重派不改变模式(t *testing.T) { db := newTestDB(t) insertLiveTask(t, db, "TASK-IMMUTABLE", "CLIENT-1") if _, err := db.Exec(`UPDATE tasks SET status='cancelled',updated_at=? WHERE task_id='TASK-IMMUTABLE'`, model.NowISO()); err != nil { t.Fatal(err) } if _, err := db.Exec(`UPDATE tasks SET status='assigned',assigned_client='CLIENT-2',updated_at=? WHERE task_id='TASK-IMMUTABLE'`, model.NowISO()); err != nil { t.Fatal(err) } var mode string if err := db.QueryRow(`SELECT execution_mode FROM tasks WHERE task_id='TASK-IMMUTABLE'`).Scan(&mode); err != nil || mode != "live" { t.Fatalf("取消/重派后模式=%q err=%v", mode, err) } }