| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- // @vitest-environment jsdom
- /** Content identity isolates terminal bindings across browser windows and Session scopes. */
- import { afterEach, expect, it, vi } from 'vitest'
- import type { SessionId } from '@deepseek-ai/dsh-session/types'
- import type { WebTerminalId } from '../src/types.ts'
- import { TerminalBindings } from '../src/client/bindings.ts'
- const session = 'session' as SessionId
- const first = 'first' as WebTerminalId
- const second = 'second' as WebTerminalId
- afterEach(() => { vi.unstubAllGlobals(); vi.restoreAllMocks(); localStorage.clear() })
- it('preserves other windows records through interleaved writes, closes and reloads', () => {
- const a = new TerminalBindings()
- const b = new TerminalBindings()
- expect(b.get(session, 'b')).toBeUndefined()
- a.set(session, 'a', first)
- b.set(session, 'b', second)
- a.delete(session, 'a')
- const reloaded = new TerminalBindings()
- expect(reloaded.get(session, 'a')).toBeUndefined()
- expect(reloaded.get(session, 'b')).toBe(second)
- expect(localStorage.length).toBe(1)
- expect(b.get(session, 'b')).toBe(second)
- a.set('session.with.dot' as SessionId, 'b', first)
- expect(new TerminalBindings().get(session, 'b')).toBe(second)
- expect(new TerminalBindings().get('session.with.dot' as SessionId, 'b')).toBe(first)
- })
- it.each(['{broken', 'null', '42', '"not/a/terminal"'])('rejects malformed saved identity %s', (value) => {
- const bindings = new TerminalBindings()
- bindings.set(session, 'content', first)
- const key = localStorage.key(0)!
- localStorage.setItem(key, value)
- expect(new TerminalBindings().get(session, 'content')).toBeUndefined()
- })
- it('keeps current-window values usable when storage is absent or inaccessible', () => {
- const a = new TerminalBindings()
- vi.spyOn(Storage.prototype, 'getItem').mockImplementation(() => { throw new Error('Storage blocked') })
- expect(a.get(session, 'missing')).toBeUndefined()
- vi.spyOn(console, 'error').mockImplementation(() => {})
- vi.spyOn(Storage.prototype, 'setItem').mockImplementation(() => { throw new Error('Storage full') })
- vi.spyOn(Storage.prototype, 'removeItem').mockImplementation(() => { throw new Error('Storage blocked') })
- a.set(session, 'a', first)
- expect(a.get(session, 'a')).toBe(first)
- a.delete(session, 'a')
- expect(a.get(session, 'a')).toBeUndefined()
- vi.stubGlobal('localStorage', undefined)
- a.set(session, 'b', second)
- expect(a.get(session, 'b')).toBe(second)
- a.clear()
- expect(a.get(session, 'b')).toBeUndefined()
- a.delete(session, 'b')
- })
|