import { expect, fixture, defineCE } from '@open-wc/testing'; import { LionLitElement, html } from '../src/LionLitElement.js'; describe('DomHelpersMixin', () => { describe('$id()', () => { it('provides access to element in Shadom DOM with "id" attribute', async () => { const tag = defineCE( class extends LionLitElement { render() { return html`
my element
`; } }, ); const element = await fixture(`<${tag}>`); expect(element.$id('myId').innerText).to.equal('my element'); }); it('memoizes element reference in cache', async () => { const tag = defineCE( class extends LionLitElement { render() { return html`
my element
`; } }, ); const element = await fixture(`<${tag}>`); element.$id('myId'); element.shadowRoot.innerHTML = ''; expect(element.$id('myId').innerText).to.equal('my element'); }); it('can be removed from cache (individually or completely) via _clearDomCache()', async () => { const tag = defineCE( class extends LionLitElement { render() { return html`
my element
`; } }, ); const element = await fixture(`<${tag}>`); element.$id('myId'); element.shadowRoot.innerHTML = ''; element._clearDomCache('$id', 'myId'); expect(element.$id('myId')).to.equal(undefined); const element2 = await fixture(`<${tag}>`); element.$id('myId'); element2.shadowRoot.innerHTML = ''; element2._clearDomCache(); expect(element2.$id('myId')).to.equal(undefined); }); }); describe('$name()', () => { it('provides access to element in Shadom DOM with "name" attribute', async () => { const tag = defineCE( class extends LionLitElement { render() { return html`
my element
`; } }, ); const element = await fixture(`<${tag}>`); expect(element.$name('myName').innerText).to.equal('my element'); }); it('memoizes element reference in cache', async () => { const tag = defineCE( class extends LionLitElement { render() { return html`
my element
`; } }, ); const element = await fixture(`<${tag}>`); element.$name('myName'); element.shadowRoot.innerHTML = ''; expect(element.$name('myName').innerText).to.equal('my element'); }); it('can be removed from cache (individually or completely) via _clearDomCache()', async () => { const tag = defineCE( class extends LionLitElement { render() { return html`
my element
`; } }, ); const element = await fixture(`<${tag}>`); element.$name('myName'); element.shadowRoot.innerHTML = ''; element._clearDomCache('$name', 'myName'); expect(element.$name('myName')).to.equal(undefined); const element2 = await fixture(`<${tag}>`); element.$name('myName'); element2.shadowRoot.innerHTML = ''; element2._clearDomCache(); expect(element2.$name('myName')).to.equal(undefined); }); }); describe('$$id()', () => { it('provides access to element in Light DOM with "id" attribute', async () => { const tag = defineCE( class extends LionLitElement { createRenderRoot() { return this; } render() { return html`
my element
`; } }, ); const element = await fixture(`<${tag}>`); expect(element.$$id('myId').innerText).to.equal('my element'); }); it('memoizes element reference in cache', async () => { const tag = defineCE( class extends LionLitElement { createRenderRoot() { return this; } render() { return html`
my element
`; } }, ); const element = await fixture(`<${tag}>`); element.$$id('myId'); element.innerHTML = ''; expect(element.$$id('myId').innerText).to.equal('my element'); }); it('can be removed from cache (individually or completely) via _clearDomCache()', async () => { const tag = defineCE( class extends LionLitElement { createRenderRoot() { return this; } render() { return html`
my element
`; } }, ); const element = await fixture(`<${tag}>`); element.$$id('myId'); element.innerHTML = ''; element._clearDomCache('$$id', 'myId'); expect(element.$$id('myId')).to.equal(undefined); const element2 = await fixture(`<${tag}>`); element.$$id('myId'); element2.innerHTML = ''; element2._clearDomCache(); expect(element2.$$id('myId')).to.equal(undefined); }); }); describe('$$slot()', () => { it('provides access to element in Light DOM with "slot" attribute', async () => { const tag = defineCE( class extends LionLitElement { render() { return html` `; } }, ); const element = await fixture(`<${tag}>
my element
`); expect(element.$$slot('mySlot').innerText).to.equal('my element'); }); it('retrieves the first named slot that is a direct child of the element', async () => { const tag = defineCE( class extends LionLitElement { render() { return html` `; } }, ); const tagNested = tag; // reuse the same component for nested slots with same slot names const fieldsetNested = await fixture(` <${tag}>
Get this slotA
<${tagNested}>
Don't get this slotA
Don't get this slotB
Don't get this slotC
Get this slotB (2nd in dom, but belongs to 'upper tag')
Don't get this slotB either (it only should get the first slot that is a direct child)
`); expect(fieldsetNested.$$slot('slotA').textContent).to.equal('Get this slotA'); expect(fieldsetNested.$$slot('slotB').textContent).to.equal( "Get this slotB (2nd in dom, but belongs to 'upper tag')", ); expect(fieldsetNested.$$slot('slotC')).to.equal(undefined); }); it('memoizes element reference in cache', async () => { const tag = defineCE( class extends LionLitElement { render() { return html` `; } }, ); const element = await fixture(`<${tag}>
my element
`); element.$$slot('mySlot'); element.innerHTML = ''; expect(element.$$slot('mySlot').innerText).to.equal('my element'); }); it('can be removed from cache (individually or completely) via _clearDomCache()', async () => { const tag = defineCE( class extends LionLitElement { render() { return html` `; } }, ); const element = await fixture(`<${tag}>
my element
`); element.$$slot('mySlot'); element.innerHTML = ''; element._clearDomCache('$$slot', 'mySlot'); expect(element.$$slot('mySlot')).to.equal(undefined); const element2 = await fixture(`<${tag}>
my element
`); element2.$$slot('mySlot'); element2.innerHTML = ''; element2._clearDomCache(); expect(element2.$$slot('mySlot')).to.equal(undefined); }); }); });