service.spec.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. /**
  2. * LayoutService behavior: the cross-plugin panel-action face. Geometry
  3. * lives in the entry store (layout-store.spec.ts) — here we assert the
  4. * delegation seam: attachPanels wiring, the three actions forwarding, the
  5. * unwired fail-loud, and re-attach overwriting a stale action set.
  6. */
  7. import { describe, expect, it, vi } from 'vitest'
  8. import { LayoutService } from '@deepseek-ai/dsh-client-ui-layout/src/client/service.ts'
  9. import type { PanelActions } from '@deepseek-ai/dsh-client-ui-layout/src/client/service.ts'
  10. function fakePanels(): PanelActions {
  11. return {
  12. setSidebar: vi.fn(),
  13. setDetails: vi.fn(),
  14. toggleSidebar: vi.fn(),
  15. setNarrow: vi.fn(),
  16. openDetails: vi.fn(),
  17. closeDetails: vi.fn(),
  18. }
  19. }
  20. describe('LayoutService', () => {
  21. it('forwards the three panel actions to the attached set', () => {
  22. const service = new LayoutService()
  23. const panels = fakePanels()
  24. service.attachPanels(panels)
  25. service.toggleSidebar()
  26. service.openDetails()
  27. service.closeDetails()
  28. expect(panels.toggleSidebar).toHaveBeenCalledTimes(1)
  29. expect(panels.openDetails).toHaveBeenCalledTimes(1)
  30. expect(panels.closeDetails).toHaveBeenCalledTimes(1)
  31. expect(panels.setSidebar).not.toHaveBeenCalled()
  32. expect(panels.setDetails).not.toHaveBeenCalled()
  33. })
  34. it('fails loud before the root entry wired its actions', () => {
  35. const service = new LayoutService()
  36. expect(() => { service.toggleSidebar() }).toThrow(/panel actions not wired/)
  37. expect(() => { service.openDetails() }).toThrow(/panel actions not wired/)
  38. expect(() => { service.closeDetails() }).toThrow(/panel actions not wired/)
  39. })
  40. it('re-attach overwrites the stale action set (entry re-register)', () => {
  41. const service = new LayoutService()
  42. const stale = fakePanels()
  43. const fresh = fakePanels()
  44. service.attachPanels(stale)
  45. service.attachPanels(fresh)
  46. service.toggleSidebar()
  47. expect(stale.toggleSidebar).not.toHaveBeenCalled()
  48. expect(fresh.toggleSidebar).toHaveBeenCalledTimes(1)
  49. })
  50. })