| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- /**
- * Debug and Preview Panel Width Persistence Tests
- * Tests for GitHub issue #22745: Panel width persistence bug fix
- */
-
- import '@testing-library/jest-dom'
-
- type PanelWidthSource = 'user' | 'system'
-
- // Mock localStorage for testing
- const createMockLocalStorage = () => {
- const storage: Record<string, string> = {}
- return {
- getItem: jest.fn((key: string) => storage[key] || null),
- setItem: jest.fn((key: string, value: string) => {
- storage[key] = value
- }),
- removeItem: jest.fn((key: string) => {
- delete storage[key]
- }),
- clear: jest.fn(() => {
- Object.keys(storage).forEach(key => delete storage[key])
- }),
- get storage() { return { ...storage } },
- }
- }
-
- // Preview panel width logic
- const createPreviewPanelManager = () => {
- const storageKey = 'debug-and-preview-panel-width'
-
- return {
- updateWidth: (width: number, source: PanelWidthSource = 'user') => {
- const newValue = Math.max(400, Math.min(width, 800))
- if (source === 'user')
- localStorage.setItem(storageKey, `${newValue}`)
-
- return newValue
- },
- getStoredWidth: () => {
- const stored = localStorage.getItem(storageKey)
- return stored ? Number.parseFloat(stored) : 400
- },
- }
- }
-
- describe('Debug and Preview Panel Width Persistence', () => {
- let mockLocalStorage: ReturnType<typeof createMockLocalStorage>
-
- beforeEach(() => {
- mockLocalStorage = createMockLocalStorage()
- Object.defineProperty(globalThis, 'localStorage', {
- value: mockLocalStorage,
- writable: true,
- })
- })
-
- afterEach(() => {
- jest.clearAllMocks()
- })
-
- describe('Preview Panel Width Management', () => {
- it('should save user resize to localStorage', () => {
- const manager = createPreviewPanelManager()
-
- const result = manager.updateWidth(450, 'user')
-
- expect(result).toBe(450)
- expect(localStorage.setItem).toHaveBeenCalledWith('debug-and-preview-panel-width', '450')
- })
-
- it('should not save system compression to localStorage', () => {
- const manager = createPreviewPanelManager()
-
- const result = manager.updateWidth(300, 'system')
-
- expect(result).toBe(400) // Respects minimum width
- expect(localStorage.setItem).not.toHaveBeenCalled()
- })
-
- it('should behave identically to Node Panel', () => {
- const manager = createPreviewPanelManager()
-
- // Both user and system operations should behave consistently
- manager.updateWidth(500, 'user')
- expect(localStorage.setItem).toHaveBeenCalledWith('debug-and-preview-panel-width', '500')
-
- manager.updateWidth(200, 'system')
- expect(localStorage.getItem('debug-and-preview-panel-width')).toBe('500')
- })
- })
-
- describe('Dual Panel Scenario', () => {
- it('should maintain independence from Node Panel', () => {
- localStorage.setItem('workflow-node-panel-width', '600')
- localStorage.setItem('debug-and-preview-panel-width', '450')
-
- const manager = createPreviewPanelManager()
-
- // System compresses preview panel
- manager.updateWidth(200, 'system')
-
- // Only preview panel storage key should be unaffected
- expect(localStorage.getItem('debug-and-preview-panel-width')).toBe('450')
- expect(localStorage.getItem('workflow-node-panel-width')).toBe('600')
- })
-
- it('should handle F12 scenario consistently', () => {
- const manager = createPreviewPanelManager()
-
- // User sets preference
- manager.updateWidth(500, 'user')
- expect(localStorage.getItem('debug-and-preview-panel-width')).toBe('500')
-
- // F12 opens causing viewport compression
- manager.updateWidth(180, 'system')
-
- // User preference preserved
- expect(localStorage.getItem('debug-and-preview-panel-width')).toBe('500')
- })
- })
-
- describe('Consistency with Node Panel', () => {
- it('should enforce same minimum width rules', () => {
- const manager = createPreviewPanelManager()
-
- // Same 400px minimum as Node Panel
- const result = manager.updateWidth(300, 'user')
- expect(result).toBe(400)
- expect(localStorage.setItem).toHaveBeenCalledWith('debug-and-preview-panel-width', '400')
- })
-
- it('should use same source parameter pattern', () => {
- const manager = createPreviewPanelManager()
-
- // Default to 'user' when source not specified
- manager.updateWidth(500)
- expect(localStorage.setItem).toHaveBeenCalledWith('debug-and-preview-panel-width', '500')
-
- // Explicit 'system' source
- manager.updateWidth(300, 'system')
- expect(localStorage.setItem).toHaveBeenCalledTimes(1) // Only user call
- })
- })
- })
|