summaryrefslogtreecommitdiff
path: root/frontend/src/lib/draftGuard.test.ts
diff options
context:
space:
mode:
authorSomhairle H. Marisol <[email protected]>2026-09-17 14:32:37 +0800
committerSomhairle H. Marisol <[email protected]>2026-09-17 14:32:37 +0800
commit5c0ba37eda80d39e6ceca59bb1d5f4942f858995 (patch)
tree948723f9cedf7ccb0707fa6ee516bd30fe20fd10 /frontend/src/lib/draftGuard.test.ts
downloadstrategy-lab-5c0ba37eda80d39e6ceca59bb1d5f4942f858995.tar.gz
chore: establish Strategy Lab source baseline (development, not release)
Diffstat (limited to 'frontend/src/lib/draftGuard.test.ts')
-rw-r--r--frontend/src/lib/draftGuard.test.ts38
1 files changed, 38 insertions, 0 deletions
diff --git a/frontend/src/lib/draftGuard.test.ts b/frontend/src/lib/draftGuard.test.ts
new file mode 100644
index 0000000..a18de48
--- /dev/null
+++ b/frontend/src/lib/draftGuard.test.ts
@@ -0,0 +1,38 @@
+import { describe, expect, it } from 'vitest';
+import { unifiedDiffStats, ConflictResolver } from './draftGuard';
+
+describe('unifiedDiffStats', () => {
+ it('counts added and removed lines', () => {
+ const s = unifiedDiffStats('a\nb\n', 'a\nc\nd\n');
+ expect(s.added).toBe(2);
+ expect(s.removed).toBe(1);
+ });
+
+ it('is zero for identical inputs', () => {
+ const s = unifiedDiffStats('same', 'same');
+ expect(s.added).toBe(0);
+ expect(s.removed).toBe(0);
+ });
+});
+
+describe('ConflictResolver', () => {
+ const local = { generation: 1, code: 'x = 1\n' };
+
+ it('flags stale response: server generation ahead of local base', () => {
+ const r = new ConflictResolver(local);
+ const verdict = r.onServerState({ generation: 2, code: 'x = 2\n' }, local.generation);
+ expect(verdict.stale).toBe(true);
+ });
+
+ it('not stale when server generation equals local base generation', () => {
+ const r = new ConflictResolver(local);
+ const verdict = r.onServerState({ generation: 1, code: 'x = 1\n' }, local.generation);
+ expect(verdict.stale).toBe(false);
+ });
+
+ it('force-overwrite plan uses server generation to retry save', () => {
+ const r = new ConflictResolver(local);
+ const plan = r.retryPlan({ generation: 2, code: 'x = 2\n' } as const);
+ expect(plan).toEqual({ generation: 2, code: 'x = 1\n' });
+ });
+});