/** @jsxImportSource preact */ import {afterEach, describe, expect, it} from 'vitest'; import {ModalWidget} from './modal-widget'; import {TabbedPanel} from './widget-containers'; import type {WidgetPanel} from './widget-containers'; const panel: WidgetPanel = { id: 'help', title: 'Help', content:
help content
}; afterEach(() => { document.body.innerHTML = ''; }); describe('ModalWidget', () => { it('shows a built-in trigger when button is enabled', () => { const root = document.createElement('div'); document.body.appendChild(root); const widget = new ModalWidget({ id: 'help', panel, button: true, icon: 'icon' }); widget.onRenderHTML(root); const triggerButton = root.querySelector('.deck-widget-icon-button'); expect(triggerButton).toBeTruthy(); const triggerWrapper = triggerButton?.parentElement; expect(triggerWrapper?.className).toContain('deck-widget-button'); }); it('hides the built-in trigger when button is disabled', () => { const root = document.createElement('div'); document.body.appendChild(root); const widget = new ModalWidget({ id: 'help-hidden-button', panel, button: false }); widget.onRenderHTML(root); expect(root.querySelector('button')).toBeNull(); }); it('closes the modal when Escape is pressed', () => { const root = document.createElement('div'); document.body.appendChild(root); const widget = new ModalWidget({ id: 'help-escape', panel, defaultOpen: true, button: true }); widget.onRenderHTML(root); expect(root.textContent).toContain('help content'); document.dispatchEvent(new KeyboardEvent('keydown', {key: 'Escape', bubbles: true})); expect(root.textContent).not.toContain('help content'); expect(root.querySelector('[aria-label="Close"]')).toBeNull(); }); it('renders a visible tab row when given a tabbed widget panel', () => { const root = document.createElement('div'); document.body.appendChild(root); const widget = new ModalWidget({ id: 'help-tabs', defaultOpen: true, panel: new TabbedPanel({ id: 'help-tabs-panel', panels: { first: { id: 'first', title: 'First', content:
first content
}, second: { id: 'second', title: 'Second', content:
second content
} } }), title: 'Help' }); widget.onRenderHTML(root); const tabRow = root.querySelector('[data-widget-tabs]'); expect(tabRow).toBeTruthy(); expect(tabRow?.textContent).toContain('First'); expect(tabRow?.textContent).toContain('Second'); }); it('raises its placement container above sibling widgets while open', () => { const placementContainer = document.createElement('div'); placementContainer.style.zIndex = '2'; const root = document.createElement('div'); placementContainer.appendChild(root); document.body.appendChild(placementContainer); const widget = new ModalWidget({ id: 'help-stacking', panel, defaultOpen: true, button: true }); widget.onRenderHTML(root); expect(placementContainer.style.zIndex).toBe('40'); widget.setProps({open: false}); expect(placementContainer.style.zIndex).toBe('2'); }); });