Why: GET .../surfaces returns SurfaceMeta without identity; writing it into surfaces let PreviewPane crash on x.identity.surfaceId after refresh. Evidence: npx vitest run (118 passed), including surfaceKey.test.ts Impact: openConversation fetches SurfaceSnapshot via surfaceGet; find paths use surfaceKey; Meta no longer enters the surfaces projection Refs: fix/surface-list-hydrate Co-authored-by: Cursor <cursoragent@cursor.com>
41 lines
1.1 KiB
TypeScript
41 lines
1.1 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import type { SurfaceSnapshot } from '../src/contracts'
|
|
import { mergeSurfacesByRevision, surfaceKey } from '../src/surfaceKey'
|
|
|
|
function snap(id: string, revision: number): SurfaceSnapshot {
|
|
return {
|
|
identity: {
|
|
surfaceId: id,
|
|
owner: 'o',
|
|
pluginId: 'p',
|
|
},
|
|
compat: { schemaVersion: 1, catalogVersion: '1' },
|
|
revision,
|
|
activationEpoch: 0,
|
|
spec: { title: id, nodes: [] },
|
|
}
|
|
}
|
|
|
|
describe('surfaceKey', () => {
|
|
it('reads nested identity and skips missing', () => {
|
|
expect(surfaceKey(snap('s1', 1))).toBe('s1')
|
|
expect(surfaceKey(undefined)).toBeNull()
|
|
expect(surfaceKey({} as SurfaceSnapshot)).toBeNull()
|
|
expect(surfaceKey({ identity: {} } as SurfaceSnapshot)).toBeNull()
|
|
})
|
|
})
|
|
|
|
describe('mergeSurfacesByRevision', () => {
|
|
it('keeps higher revision and drops dirty entries', () => {
|
|
const dirty = { revision: 99 } as SurfaceSnapshot
|
|
const merged = mergeSurfacesByRevision(
|
|
[snap('a', 1), dirty],
|
|
[snap('a', 3), snap('b', 1)],
|
|
)
|
|
expect(merged.map(s => [surfaceKey(s), s.revision])).toEqual([
|
|
['a', 3],
|
|
['b', 1],
|
|
])
|
|
})
|
|
})
|