aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorAman Kumar <145339995+amankumarsingh77@users.noreply.github.com>2026-10-11 23:28:39 +0530
committerGitHub <noreply@github.com>2026-10-11 23:28:39 +0530
commit7833e2ecd5dc5fd9d7e63322680711d341d885ee (patch)
treec54f93f6311eab70516e41637988751f12c9a513 /test
parentff449d9f807bc2aa9b6d13aaa8602c37a6a72352 (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.ts75
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);
+ });
+});