service.spec.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  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. openDetails: vi.fn(),
  16. closeDetails: vi.fn(),
  17. }
  18. }
  19. describe('LayoutService', () => {
  20. it('forwards the three panel actions to the attached set', () => {
  21. const service = new LayoutService()
  22. const panels = fakePanels()
  23. service.attachPanels(panels)
  24. service.toggleSidebar()
  25. service.openDetails()
  26. service.closeDetails()
  27. expect(panels.toggleSidebar).toHaveBeenCalledTimes(1)
  28. expect(panels.openDetails).toHaveBeenCalledTimes(1)
  29. expect(panels.closeDetails).toHaveBeenCalledTimes(1)
  30. expect(panels.setSidebar).not.toHaveBeenCalled()
  31. expect(panels.setDetails).not.toHaveBeenCalled()
  32. })
  33. it('fails loud before the root entry wired its actions', () => {
  34. const service = new LayoutService()
  35. expect(() => { service.toggleSidebar() }).toThrow(/panel actions not wired/)
  36. expect(() => { service.openDetails() }).toThrow(/panel actions not wired/)
  37. expect(() => { service.closeDetails() }).toThrow(/panel actions not wired/)
  38. })
  39. it('re-attach overwrites the stale action set (entry re-register)', () => {
  40. const service = new LayoutService()
  41. const stale = fakePanels()
  42. const fresh = fakePanels()
  43. service.attachPanels(stale)
  44. service.attachPanels(fresh)
  45. service.toggleSidebar()
  46. expect(stale.toggleSidebar).not.toHaveBeenCalled()
  47. expect(fresh.toggleSidebar).toHaveBeenCalledTimes(1)
  48. })
  49. })