You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.spec.tsx 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /**
  2. * Debug and Preview Panel Width Persistence Tests
  3. * Tests for GitHub issue #22745: Panel width persistence bug fix
  4. */
  5. import '@testing-library/jest-dom'
  6. type PanelWidthSource = 'user' | 'system'
  7. // Mock localStorage for testing
  8. const createMockLocalStorage = () => {
  9. const storage: Record<string, string> = {}
  10. return {
  11. getItem: jest.fn((key: string) => storage[key] || null),
  12. setItem: jest.fn((key: string, value: string) => {
  13. storage[key] = value
  14. }),
  15. removeItem: jest.fn((key: string) => {
  16. delete storage[key]
  17. }),
  18. clear: jest.fn(() => {
  19. Object.keys(storage).forEach(key => delete storage[key])
  20. }),
  21. get storage() { return { ...storage } },
  22. }
  23. }
  24. // Preview panel width logic
  25. const createPreviewPanelManager = () => {
  26. const storageKey = 'debug-and-preview-panel-width'
  27. return {
  28. updateWidth: (width: number, source: PanelWidthSource = 'user') => {
  29. const newValue = Math.max(400, Math.min(width, 800))
  30. if (source === 'user')
  31. localStorage.setItem(storageKey, `${newValue}`)
  32. return newValue
  33. },
  34. getStoredWidth: () => {
  35. const stored = localStorage.getItem(storageKey)
  36. return stored ? Number.parseFloat(stored) : 400
  37. },
  38. }
  39. }
  40. describe('Debug and Preview Panel Width Persistence', () => {
  41. let mockLocalStorage: ReturnType<typeof createMockLocalStorage>
  42. beforeEach(() => {
  43. mockLocalStorage = createMockLocalStorage()
  44. Object.defineProperty(globalThis, 'localStorage', {
  45. value: mockLocalStorage,
  46. writable: true,
  47. })
  48. })
  49. afterEach(() => {
  50. jest.clearAllMocks()
  51. })
  52. describe('Preview Panel Width Management', () => {
  53. it('should save user resize to localStorage', () => {
  54. const manager = createPreviewPanelManager()
  55. const result = manager.updateWidth(450, 'user')
  56. expect(result).toBe(450)
  57. expect(localStorage.setItem).toHaveBeenCalledWith('debug-and-preview-panel-width', '450')
  58. })
  59. it('should not save system compression to localStorage', () => {
  60. const manager = createPreviewPanelManager()
  61. const result = manager.updateWidth(300, 'system')
  62. expect(result).toBe(400) // Respects minimum width
  63. expect(localStorage.setItem).not.toHaveBeenCalled()
  64. })
  65. it('should behave identically to Node Panel', () => {
  66. const manager = createPreviewPanelManager()
  67. // Both user and system operations should behave consistently
  68. manager.updateWidth(500, 'user')
  69. expect(localStorage.setItem).toHaveBeenCalledWith('debug-and-preview-panel-width', '500')
  70. manager.updateWidth(200, 'system')
  71. expect(localStorage.getItem('debug-and-preview-panel-width')).toBe('500')
  72. })
  73. })
  74. describe('Dual Panel Scenario', () => {
  75. it('should maintain independence from Node Panel', () => {
  76. localStorage.setItem('workflow-node-panel-width', '600')
  77. localStorage.setItem('debug-and-preview-panel-width', '450')
  78. const manager = createPreviewPanelManager()
  79. // System compresses preview panel
  80. manager.updateWidth(200, 'system')
  81. // Only preview panel storage key should be unaffected
  82. expect(localStorage.getItem('debug-and-preview-panel-width')).toBe('450')
  83. expect(localStorage.getItem('workflow-node-panel-width')).toBe('600')
  84. })
  85. it('should handle F12 scenario consistently', () => {
  86. const manager = createPreviewPanelManager()
  87. // User sets preference
  88. manager.updateWidth(500, 'user')
  89. expect(localStorage.getItem('debug-and-preview-panel-width')).toBe('500')
  90. // F12 opens causing viewport compression
  91. manager.updateWidth(180, 'system')
  92. // User preference preserved
  93. expect(localStorage.getItem('debug-and-preview-panel-width')).toBe('500')
  94. })
  95. })
  96. describe('Consistency with Node Panel', () => {
  97. it('should enforce same minimum width rules', () => {
  98. const manager = createPreviewPanelManager()
  99. // Same 400px minimum as Node Panel
  100. const result = manager.updateWidth(300, 'user')
  101. expect(result).toBe(400)
  102. expect(localStorage.setItem).toHaveBeenCalledWith('debug-and-preview-panel-width', '400')
  103. })
  104. it('should use same source parameter pattern', () => {
  105. const manager = createPreviewPanelManager()
  106. // Default to 'user' when source not specified
  107. manager.updateWidth(500)
  108. expect(localStorage.setItem).toHaveBeenCalledWith('debug-and-preview-panel-width', '500')
  109. // Explicit 'system' source
  110. manager.updateWidth(300, 'system')
  111. expect(localStorage.setItem).toHaveBeenCalledTimes(1) // Only user call
  112. })
  113. })
  114. })