// Generated, do not edit. sha256:2430e966fcc2cdaaba7ffd7cbd0b894b46925aefa4dabedcc39e93d69f099382 import { describe, it, afterEach } from 'node:test'; import assert from 'node:assert/strict'; import { installDom } from '../helpers/mini-dom.mjs'; const dom = installDom(); const { openPopover, closePopover, isPopoverOpen } = await import('../../client/ui/popover.js'); const anchor = () => { const b = dom.document.createElement('button'); dom.document.body.appendChild(b); return b; }; const tick = () => new Promise(r => setTimeout(r, 0)); describe('openPopover', () => { afterEach(() => closePopover()); it('appends one element with the class to the body and reports it open', () => { const { el } = openPopover(anchor(), { className: 'popover new-menu' }); assert.equal(el.parentNode, dom.document.body); assert.equal(el.className, 'popover new-menu'); assert.equal(isPopoverOpen(), true); }); it('a second one closes the first, and calls its onClose', () => { let closed = 0; const first = openPopover(anchor(), { onClose: () => { closed++; } }); openPopover(anchor()); assert.equal(first.el.isConnected, false); assert.equal(closed, 1); assert.equal(dom.document.querySelectorAll('.popover').length, 1); }); it('Escape closes it', () => { const { el } = openPopover(anchor()); dom.key(dom.document.body, 'Escape'); assert.equal(el.isConnected, false); assert.equal(isPopoverOpen(), false); }); it('an outside click closes it, but only from the next tick; a click inside or on the anchor does not', async () => { const a = anchor(); const { el } = openPopover(a); el.innerHTML = 'in'; dom.click(dom.document.body); assert.equal(el.isConnected, true); await tick(); dom.click(el.querySelector('span')); dom.click(a); assert.equal(el.isConnected, true); dom.click(dom.document.body); assert.equal(el.isConnected, false); }); it('a popover closed within the same tick leaves no outside-click listener behind', async () => { const before = dom.document.listeners.length; openPopover(anchor()); closePopover(); await tick(); assert.equal(dom.document.listeners.length, before); const { el } = openPopover(anchor()); el.innerHTML = 'in'; await tick(); dom.click(el.querySelector('span')); assert.equal(el.isConnected, true); }); it('inside an open dialog it goes into the top overlay, not behind it in the body', () => { const o1 = dom.document.createElement('div'); o1.className = 'dialog-overlay'; const o2 = dom.document.createElement('div'); o2.className = 'dialog-overlay'; dom.document.body.append(o1, o2); const { el } = openPopover(anchor()); assert.equal(el.parentNode, o2); o1.remove(); o2.remove(); }); it('position() keeps it inside the window', () => { const a = anchor(); a.getBoundingClientRect = () => ({ left: 1270, top: 790, right: 1280, bottom: 800, width: 10, height: 10 }); const { el, position } = openPopover(a); Object.defineProperty(el, 'offsetWidth', { value: 200 }); Object.defineProperty(el, 'offsetHeight', { value: 100 }); position(); assert.equal(el.style.left, `${1280 - 8 - 200}px`); assert.equal(el.style.top, `${790 - 100 - 6}px`); }); it('closePopover without one open does nothing', () => { closePopover(); assert.equal(isPopoverOpen(), false); }); });