package httpapi import ( "encoding/json" "testing" "knowledge-governance/internal/governance" ) // 搬运接线时,发布作业必须"先搬运":队列类型换成 handoff,释放作业的 ID 仍是基础 ID。 func TestLibraryQueueRequestGatesReleaseOnHandoff(t *testing.T) { jobID := "libsync-internal-1" snapshot := "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" id, queueType, payload, err := libraryQueueRequest(true, jobID, "internal", snapshot, librarySyncJobType) if err != nil { t.Fatal(err) } if queueType != libraryHandoffJobType { t.Fatalf("queue type = %q, want %q", queueType, libraryHandoffJobType) } if id != governance.LibraryHandoffQueueJobID(jobID) { t.Fatalf("handoff queue id = %q", id) } // jobs.id 是 varchar(36):交接用的队列作业号必须能真正插进去(曾因拼后缀超长而必失败)。 if len(id) > 36 { t.Fatalf("handoff queue id 长度 %d 超过 jobs.id 上限 36", len(id)) } var decoded map[string]string if err := json.Unmarshal(payload, &decoded); err != nil { t.Fatal(err) } if decoded["next_type"] != librarySyncJobType || decoded["target_snapshot_id"] != snapshot { t.Fatalf("handoff payload = %#v", decoded) } // 未接线:行为与今天完全一致(直接投递发布作业,ID 是基础 ID)。 id, queueType, payload, err = libraryQueueRequest(false, jobID, "internal", snapshot, libraryRestoreJobType) if err != nil { t.Fatal(err) } if queueType != libraryRestoreJobType || id != governance.QueueJobIDFor(jobID) { t.Fatalf("unconfigured queue request = %q %q", queueType, id) } decoded = map[string]string{} if err := json.Unmarshal(payload, &decoded); err != nil { t.Fatal(err) } if _, present := decoded["next_type"]; present { t.Fatal("release payload must not carry next_type when handoff is off") } }