返回 DeepSeek-Reasonix
automation-drafts.test.ts
根目录 / desktop / frontend / src / __tests__ / automation-drafts.test.ts
1 import assert from "node:assert/strict";
2 import { useAutomationDraftStore as store, automationDraftDirty } from "../store/automationDrafts";
3 import type { HeartbeatTask } from "../custom/features/heartbeat/heartbeat.types";
4 const task: HeartbeatTask = { id: "a", title: "Original", prompt: "Saved prompt", interval: "30m", enabled: true, createdAt: 1 };
5 store.setState({ entries: {} });
6 store.getState().ensure(task);
7 assert.equal(automationDraftDirty(store.getState().entries.a), false);
8 store.getState().edit("a", (draft) => ({ ...draft, title: "Local" }));
9 store.getState().ui("a", { frequency: "cron", tab: "history" });
10 store.getState().reconcile([{ ...task, prompt: "External", topicId: "run", lastRunAt: 10 }]);
11 let entry = store.getState().entries.a;
12 assert.equal(entry.draft.title, "Local");
13 assert.equal(entry.draft.prompt, "External");
14 assert.equal(entry.draft.topicId, "run");
15 assert.equal(entry.frequency, "cron");
16 assert.equal(entry.tab, "history");
17 assert.deepEqual(entry.conflicts, []);
18 store.getState().reconcile([{ ...task, title: "Remote", prompt: "External", topicId: "run" }]);
19 assert.deepEqual(store.getState().entries.a.conflicts, ["title"]);
20 store.getState().reconcile([{ ...task, title: "Remote", prompt: "External", topicId: "new-run" }]);
21 assert.deepEqual(store.getState().entries.a.conflicts, ["title"], "repeated refresh must not erase unresolved conflicts");
22 store.getState().discard("a");
23 assert.equal(store.getState().entries.a.draft.title, "Remote");
24 assert.deepEqual(store.getState().entries.a.conflicts, []);
25 store.getState().edit("a", (draft) => ({ ...draft, prompt: "Keep this" }));
26 const version = store.getState().begin("a")!;
27 assert.equal(store.getState().begin("a"), null);
28 store.getState().edit("a", (draft) => ({ ...draft, prompt: "Wrong" }));
29 assert.equal(store.getState().entries.a.draft.prompt, "Keep this");
30 store.getState().finish("a", version - 1, task);
31 assert.equal(store.getState().entries.a.busy, true);
32 store.getState().finish("a", version);
33 assert.equal(store.getState().entries.a.error, true);
34 assert.equal(store.getState().entries.a.draft.prompt, "Keep this");
35 store.getState().reconcile([]);
36 assert.equal(store.getState().entries.a.missing, true);
37 assert.equal(store.getState().entries.a.draft.prompt, "Keep this");
38 store.getState().ensure({ ...task, id: "new", createdAt: undefined }, true);
39 store.getState().reconcile([]);
40 assert.equal(store.getState().entries.new.missing, false);
41 assert.equal(store.getState().entries.new.baseline, null);
42 store.getState().discard("new");
43 assert.equal(store.getState().entries.new, undefined);
44 console.log("PASS automation draft merge, conflict, engine state, locking, stale completion and deletion contracts");
45
45 lines TYPESCRIPT