conversation-store.client.spec.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // @vitest-environment jsdom
  2. import { beforeEach, describe, expect, it } from 'vitest'
  3. import type { SessionId } from '@deepseek-ai/dsh-session/types'
  4. import { createConversationStore, readConversationViewPreference } from '../src/client/stores.ts'
  5. const KEY = 'dsh.conversation'
  6. beforeEach(() => {
  7. localStorage.clear()
  8. })
  9. describe('createConversationStore', () => {
  10. it('owns draft, selected View, and one-shot View requests', () => {
  11. const store = createConversationStore().create()
  12. expect(store.store.getSnapshot()).toEqual({ draft: '', view: null, viewRequest: null })
  13. store.actions.setDraft('hello')
  14. store.actions.setView('chat')
  15. expect(store.store.getSnapshot()).toEqual({
  16. draft: 'hello',
  17. view: 'chat',
  18. viewRequest: null,
  19. })
  20. store.actions.openView('trajectory', 'call-1')
  21. expect(store.store.getSnapshot()).toMatchObject({
  22. view: 'trajectory',
  23. viewRequest: { view: 'trajectory', focus: 'call-1' },
  24. })
  25. store.actions.completeViewRequest()
  26. expect(store.store.getSnapshot().viewRequest).toBeNull()
  27. })
  28. it('persists per Session scope and clears the persisted value', () => {
  29. const first = createConversationStore().create('sess-1')
  30. first.actions.setDraft('draft for one')
  31. first.actions.setView('chat')
  32. expect(localStorage.getItem(`${KEY}.sess-1`)).not.toBeNull()
  33. expect(localStorage.getItem(`${KEY}.sess-2`)).toBeNull()
  34. const restored = createConversationStore().create('sess-1')
  35. expect(restored.store.getSnapshot()).toMatchObject({
  36. draft: 'draft for one',
  37. view: 'chat',
  38. })
  39. first.clearPersisted()
  40. expect(localStorage.getItem(`${KEY}.sess-1`)).toBeNull()
  41. })
  42. it('creates independent live instances', () => {
  43. const handle = createConversationStore()
  44. const first = handle.create()
  45. const second = handle.create()
  46. first.actions.setDraft('only first')
  47. expect(second.store.getSnapshot().draft).toBe('')
  48. })
  49. it('reads only a usable persisted View preference', () => {
  50. const sessionId = 'sess-1' as SessionId
  51. const store = createConversationStore().create(sessionId)
  52. store.actions.setView('trajectory')
  53. expect(readConversationViewPreference(sessionId)).toBe('trajectory')
  54. localStorage.setItem(`${KEY}.${sessionId}`, '{invalid')
  55. expect(readConversationViewPreference(sessionId)).toBeNull()
  56. })
  57. })