import { html } from 'lit'; import { fixture, expect, aTimeout } from '@open-wc/testing'; import { sendKeys, sendMouse, resetMouse } from '@web/test-runner-commands'; import './ix-tooltip-test-harness.js'; import type { IxTooltipTestHarness } from './ix-tooltip-test-harness.js'; import { IxTooltip } from '../src/IxTooltip.js'; function getMiddleOfElement(element: HTMLElement) { const { x, y, width, height } = element.getBoundingClientRect(); return { x: Math.floor(x + window.scrollX + width / 2), y: Math.floor(y + window.scrollY + height / 2), }; } describe('IxTooltip', () => { let harnessEl: IxTooltipTestHarness; let tooltipEl: IxTooltip; beforeEach(async () => { harnessEl = await fixture(html` `); tooltipEl = harnessEl.querySelector('ix-tooltip'); }); afterEach(async () => { await resetMouse(); }); it('renders the test harness element and its DOM', async () => { expect(harnessEl).to.exist; expect(harnessEl.innerHTML).to.exist; }); it('renders the tooltip and its shadowDOM', async () => { expect(tooltipEl).to.exist; expect(tooltipEl.shadowRoot).to.exist; }); it('shows a tooltip on element tab focus, removes on esc', async () => { harnessEl.focus(); await sendKeys({ press: 'Tab', }); let toolTipText = document.activeElement?.getAttribute('data-tooltip'); expect(toolTipText).to.equal('tooltip text first element'); expect( tooltipEl.shadowRoot?.querySelector('ix-simple-tooltip')?.innerHTML, ).to.contain(toolTipText); await sendKeys({ press: 'Tab', }); toolTipText = document.activeElement?.getAttribute('data-tooltip'); expect(toolTipText).to.equal('tooltip text second element'); expect( tooltipEl.shadowRoot?.querySelector('ix-simple-tooltip')?.innerHTML, ).to.contain(toolTipText); await sendKeys({ press: 'Escape', }); expect(tooltipEl.shadowRoot?.querySelector('ix-simple-tooltip')).to.be.null; }); it('shows a tooltip on element mouse over, remove on mouse out', async () => { const triggerEls = harnessEl.querySelectorAll( '[data-tooltip]', ) as unknown as HTMLElement[]; let { x, y } = getMiddleOfElement(triggerEls[0]); await sendMouse({ type: 'move', position: [x, y] }); let toolTipText = triggerEls[0].getAttribute('data-tooltip'); expect(toolTipText).to.equal('tooltip text first element'); expect( tooltipEl.shadowRoot?.querySelector('ix-simple-tooltip')?.innerHTML, ).to.contain(toolTipText); ({ x, y } = getMiddleOfElement(triggerEls[1])); await sendMouse({ type: 'move', position: [x, y] }); toolTipText = triggerEls[1].getAttribute('data-tooltip'); expect(toolTipText).to.equal('tooltip text second element'); expect( tooltipEl.shadowRoot?.querySelector('ix-simple-tooltip')?.innerHTML, ).to.contain(toolTipText); await sendMouse({ type: 'move', position: [500, 500] }); expect(tooltipEl.shadowRoot?.querySelector('.wrapper')).to.have.class( 'hidding', ); await aTimeout(500); expect(tooltipEl.shadowRoot?.querySelector('.wrapper')).to.not.have.class( 'hidding', ); expect(tooltipEl.shadowRoot?.querySelector('ix-simple-tooltip')).to.be.null; }); });