service.client.spec.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. import { describe, expect, it, vi } from 'vitest'
  2. import { LayoutController } from '@deepseek-ai/dsh-client-ui-layout/src/client/service.ts'
  3. import type { PanelActions } from '@deepseek-ai/dsh-client-ui-layout/src/client/service.ts'
  4. function fakePanels(): PanelActions {
  5. return {
  6. setSidebar: vi.fn(),
  7. setDetails: vi.fn(),
  8. toggleSidebar: vi.fn(),
  9. setNarrow: vi.fn(),
  10. openDetails: vi.fn(),
  11. closeDetails: vi.fn(),
  12. }
  13. }
  14. describe('LayoutController', () => {
  15. it('forwards the three panel actions to the attached set', () => {
  16. const service = new LayoutController()
  17. const panels = fakePanels()
  18. service.attachPanels(panels)
  19. service.toggleSidebar()
  20. service.openDetails()
  21. service.closeDetails()
  22. expect(panels.toggleSidebar).toHaveBeenCalledTimes(1)
  23. expect(panels.openDetails).toHaveBeenCalledTimes(1)
  24. expect(panels.closeDetails).toHaveBeenCalledTimes(1)
  25. expect(panels.setSidebar).not.toHaveBeenCalled()
  26. expect(panels.setDetails).not.toHaveBeenCalled()
  27. })
  28. it('fails loud before the root entry wired its actions', () => {
  29. const service = new LayoutController()
  30. expect(() => { service.toggleSidebar() }).toThrow(/panel actions not wired/)
  31. expect(() => { service.openDetails() }).toThrow(/panel actions not wired/)
  32. expect(() => { service.closeDetails() }).toThrow(/panel actions not wired/)
  33. })
  34. it('re-attach overwrites the stale action set (entry re-register)', () => {
  35. const service = new LayoutController()
  36. const stale = fakePanels()
  37. const fresh = fakePanels()
  38. service.attachPanels(stale)
  39. service.attachPanels(fresh)
  40. service.toggleSidebar()
  41. expect(stale.toggleSidebar).not.toHaveBeenCalled()
  42. expect(fresh.toggleSidebar).toHaveBeenCalledTimes(1)
  43. })
  44. })