summaryrefslogtreecommitdiff
path: root/frontend/src/lib/draftGuard.test.ts
blob: a18de48a141138327b16f9f2bd131d955196c7ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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' });
  });
});