diff options
| author | Aman Kumar <145339995+amankumarsingh77@users.noreply.github.com> | 2026-10-11 23:28:39 +0530 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-10-11 23:28:39 +0530 |
| commit | 7833e2ecd5dc5fd9d7e63322680711d341d885ee (patch) | |
| tree | c54f93f6311eab70516e41637988751f12c9a513 /test | |
| parent | ff449d9f807bc2aa9b6d13aaa8602c37a6a72352 (diff) | |
fix: append browser state to the session only when it changes (#37)
persistState appended a browser-harness-state entry on every ownership callback, session_tree
and shutdown, so the append-only session file and Pi Web's "+N custom" chain grew without bound.
A snapshot is now written only when it differs from the last one persisted or restored.
Fixes #26
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Diffstat (limited to 'test')
| -rw-r--r-- | test/util/state-test.ts | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/test/util/state-test.ts b/test/util/state-test.ts new file mode 100644 index 0000000..a354ab0 --- /dev/null +++ b/test/util/state-test.ts @@ -0,0 +1,75 @@ +import { test, describe } from "node:test"; +import assert from "node:assert/strict"; +import type { ExtensionAPI } from "@mariozechner/pi-coding-agent"; +import { type BrowserState, createStatePersister, defaultState } from "../../src/state"; + +// Pi session JSONL is append-only, so every appendEntry is permanent. Issue #26: identical +// snapshots were appended on every ownership callback, session_tree and shutdown, growing the +// session file and the branch navigator's "+N custom" chain without bound. +const fakePi = (): { readonly pi: ExtensionAPI; readonly entries: ReadonlyArray<unknown> } => { + const entries: unknown[] = []; + const pi = { + appendEntry: (_customType: string, data?: unknown) => { + entries.push(data); + }, + } as unknown as ExtensionAPI; + return { pi, entries }; +}; + +const owned = (...ids: string[]): BrowserState => ({ namespace: "default", ownedTargetIds: ids }); + +describe("state persister", () => { + test("repeated identical snapshots produce one entry", () => { + const { pi, entries } = fakePi(); + const persister = createStatePersister(pi); + assert.equal(persister.persist(owned("a")), true); + assert.equal(persister.persist(owned("a")), false); + assert.equal(persister.persist(owned("a")), false); + assert.equal(entries.length, 1); + }); + + test("a changed snapshot is appended, and the same change twice is not", () => { + const { pi, entries } = fakePi(); + const persister = createStatePersister(pi); + persister.persist(owned("a")); + persister.persist(owned("a", "b")); + persister.persist(owned("a", "b")); + persister.persist(owned("a")); + assert.deepEqual(entries.map((e) => (e as BrowserState).ownedTargetIds), [["a"], ["a", "b"], ["a"]]); + }); + + test("tab order does not count as a change", () => { + const { pi, entries } = fakePi(); + const persister = createStatePersister(pi); + persister.persist(owned("a", "b")); + persister.persist(owned("b", "a")); + assert.equal(entries.length, 1); + }); + + test("a state restored from the session is not re-appended until it changes", () => { + const { pi, entries } = fakePi(); + const persister = createStatePersister(pi); + persister.markPersisted(owned("a")); + assert.equal(persister.persist(owned("a")), false); + assert.equal(entries.length, 0); + assert.equal(persister.persist(owned("a", "b")), true); + assert.equal(entries.length, 1); + }); + + test("the window ids are part of the comparison", () => { + const { pi, entries } = fakePi(); + const persister = createStatePersister(pi); + persister.persist({ ...owned("a"), harnessWindowTargetId: "w1", harnessWindowId: 7 }); + persister.persist({ ...owned("a"), harnessWindowTargetId: "w1", harnessWindowId: 7 }); + persister.persist({ ...owned("a"), harnessWindowTargetId: "w2", harnessWindowId: 8 }); + assert.equal(entries.length, 2); + }); + + test("the default state is persisted once, then skipped", () => { + const { pi, entries } = fakePi(); + const persister = createStatePersister(pi); + assert.equal(persister.persist(defaultState()), true); + assert.equal(persister.persist(defaultState()), false); + assert.equal(entries.length, 1); + }); +}); |
