package agent_execution_test import ( "testing" "time" "git.cin.su/m/Assistant/contracts/work" workdomain "git.cin.su/m/Assistant/modules/work/domain" ) func TestBuildDryRunDispatchProducesDeterministicCallbacks(t *testing.T) { now := time.UnixMilli(1_700_000_000_000) intent := work.AgentDispatchIntent{ DispatchID: "dispatch-1", IdempotencyKey: "idem-1", DelegationID: "delegation-1", RunID: "run-1", ImplementationID: "fake-worker", ImplementationRevision: 1, SourceRevision: "source-1", WorktreeID: "worktree-1", VerificationPlanRef: "verify-1", CreatedAtUnixMillis: now.UnixMilli(), } first, err := workdomain.BuildDryRunDispatch(intent, "worker-1", 7, now, 15*time.Minute) if err != nil { t.Fatal(err) } second, err := workdomain.BuildDryRunDispatch(intent, "worker-1", 7, now, 15*time.Minute) if err != nil { t.Fatal(err) } if first.CallbackCount() != 2 || first.Lease != second.Lease || first.Callbacks[0] != second.Callbacks[0] || first.Callbacks[1] != second.Callbacks[1] { t.Fatal("dry-run dispatch is not deterministic") } if first.Callbacks[1].Sequence != 2 || !first.LastObservedAt().Before(first.Lease.ExpiresAt) { t.Fatal("callback sequence or lease window is invalid") } } func TestBuildDryRunDispatchRejectsInvalidIntent(t *testing.T) { _, err := workdomain.BuildDryRunDispatch(work.AgentDispatchIntent{}, "worker-1", 1, time.UnixMilli(1_700_000_000_000), time.Minute) if err != workdomain.ErrDryRunDispatchRejected { t.Fatalf("expected rejection, got %v", err) } }