50 lines
1.8 KiB
Go
50 lines
1.8 KiB
Go
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)
|
|
}
|
|
}
|