批准 dataset 分类入库;SKIP LOCKED 分批;销毁默认 fail closed。restore 演练拒绝共享 env DSN。 Co-authored-by: Cursor <cursoragent@cursor.com>
54 lines
1.6 KiB
Go
54 lines
1.6 KiB
Go
package dataset
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
"time"
|
|
|
|
"chat-agent-system/internal/artifactvault"
|
|
)
|
|
|
|
func TestPauseResumeAndReplayCounts(t *testing.T) {
|
|
ctx := context.Background()
|
|
now := time.Now().UTC()
|
|
body := []byte("# pause resume body")
|
|
enum := NewMemoryEnumerator()
|
|
enum.Seed(artifactvault.KindApproved, []artifactvault.Candidate{
|
|
{Kind: artifactvault.KindApproved, SourcePK: 1, LogicalID: "doc_a", SnapshotID: 2, ApprovedAt: &now, Payload: body, EventID: "approved:doc_a:2"},
|
|
{Kind: artifactvault.KindApproved, SourcePK: 2, LogicalID: "doc_b", SnapshotID: 3, ApprovedAt: &now, Payload: body, EventID: "approved:doc_b:3"},
|
|
})
|
|
mem := artifactvault.NewMemoryRegistry()
|
|
run := NewMemoryRunner(enum, mem)
|
|
job := NewJob("pause", "dev", "scratch", 38)
|
|
|
|
st, err := run.RunBatch(ctx, job, artifactvault.KindApproved, 0, 1)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if st.Scanned != 1 {
|
|
t.Fatalf("first batch scanned=%d", st.Scanned)
|
|
}
|
|
job.Pause()
|
|
if _, err := run.RunBatch(ctx, job, artifactvault.KindApproved, 0, 1); err == nil {
|
|
t.Fatal("paused job must refuse batches")
|
|
}
|
|
if err := job.Resume(); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
st, err = run.RunBatch(ctx, job, artifactvault.KindApproved, 0, 50)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if st.Scanned != 2 || st.Succeeded != 2 || mem.Coverage(ctx).Required != 2 {
|
|
t.Fatalf("resume stats=%+v required=%d", st, mem.Coverage(ctx).Required)
|
|
}
|
|
job.Checkpoints = map[string]Checkpoint{}
|
|
st, err = run.RunBatch(ctx, job, artifactvault.KindApproved, 0, 50)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if mem.Coverage(ctx).Required != 2 {
|
|
t.Fatalf("replay duplicated artifacts %d stats=%+v", mem.Coverage(ctx).Required, st)
|
|
}
|
|
}
|