import { expect, html, fixture } from '@open-wc/testing';
import { spy } from 'sinon';
import { render } from 'lit-html';
import { live } from '../src/live.js';
describe('live', () => {
before(() => {
class LitHelpers extends HTMLElement {
set myProp(value) {
this._myProp = value;
}
get myProp() {
return this._myProp;
}
}
customElements.define('lit-helpers', LitHelpers);
});
describe('property bindings', () => {
let wrapper;
beforeEach(async () => {
wrapper = await fixture(document.createElement('div'));
});
function renderLive(value) {
render(html` `, wrapper);
return wrapper.firstElementChild;
}
it('can render a property', () => {
const element = renderLive('foo');
expect(element.myProp).to.equal('foo');
});
it('can change property values', () => {
const element = renderLive('foo');
renderLive('bar');
expect(element.myProp).to.equal('bar');
});
it('can render to null and undefined', () => {
const element = renderLive('foo');
renderLive(null);
expect(element.myProp).to.equal(null);
renderLive('bar');
expect(element.myProp).to.equal('bar');
renderLive(undefined);
expect(element.myProp).to.equal(undefined);
});
it('can change property values when the value on the element changes', () => {
const element = renderLive('foo');
element.myProp = 'bar';
renderLive('foo');
expect(element.myProp).to.equal('foo');
});
it('does not set property values when the value on the element did not change', () => {
const element = renderLive(undefined);
const myPropSpy = /** @type {*} */ (spy(element, 'myProp', ['get', 'set']));
renderLive('foo');
expect(myPropSpy.set.callCount).to.equal(1);
renderLive('bar');
expect(myPropSpy.set.callCount).to.equal(2);
renderLive('bar');
expect(myPropSpy.set.callCount).to.equal(2);
});
});
describe('attribute bindings', () => {
let wrapper;
beforeEach(async () => {
wrapper = await fixture(document.createElement('div'));
});
function renderLive(value) {
render(html`
`, wrapper);
return wrapper.firstElementChild;
}
it('can render an attribute', () => {
const element = renderLive('foo');
expect(element.getAttribute('my-attr')).to.equal('foo');
});
it('can change attribute values', () => {
const element = renderLive('foo');
renderLive('bar');
expect(element.getAttribute('my-attr')).to.equal('bar');
});
it('can render null and undefined', () => {
const element = renderLive('foo');
renderLive(null);
expect(element.getAttribute('my-attr')).to.equal('null');
renderLive('bar');
expect(element.getAttribute('my-attr')).to.equal('bar');
renderLive(undefined);
expect(element.getAttribute('my-attr')).to.equal('undefined');
});
it('can change attribute values when the value on the element changes', () => {
const element = renderLive('foo');
element.setAttribute('my-attr', 'bar');
renderLive('foo');
expect(element.getAttribute('my-attr')).to.equal('foo');
});
it('does not set attribute values when the value on the element did not change', () => {
const element = renderLive('');
const setAttribute = spy(element, 'setAttribute');
renderLive('foo');
expect(setAttribute.callCount).to.equal(1);
renderLive('bar');
expect(setAttribute.callCount).to.equal(2);
renderLive('bar');
expect(setAttribute.callCount).to.equal(2);
});
});
});