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}>${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}>${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}>${tag}>`);
element.$id('myId');
element.shadowRoot.innerHTML = '';
element._clearDomCache('$id', 'myId');
expect(element.$id('myId')).to.equal(undefined);
const element2 = await fixture(`<${tag}>${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}>${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}>${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}>${tag}>`);
element.$name('myName');
element.shadowRoot.innerHTML = '';
element._clearDomCache('$name', 'myName');
expect(element.$name('myName')).to.equal(undefined);
const element2 = await fixture(`<${tag}>${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}>${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}>${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}>${tag}>`);
element.$$id('myId');
element.innerHTML = '';
element._clearDomCache('$$id', 'myId');
expect(element.$$id('myId')).to.equal(undefined);
const element2 = await fixture(`<${tag}>${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
${tag}>`);
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
${tagNested}>
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)
${tag}>`);
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
${tag}>`);
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
${tag}>`);
element.$$slot('mySlot');
element.innerHTML = '';
element._clearDomCache('$$slot', 'mySlot');
expect(element.$$slot('mySlot')).to.equal(undefined);
const element2 = await fixture(`<${tag}>
my element
${tag}>`);
element2.$$slot('mySlot');
element2.innerHTML = '';
element2._clearDomCache();
expect(element2.$$slot('mySlot')).to.equal(undefined);
});
});
});