| 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 |