import { expect, fixture, html } from '@open-wc/testing';
import sinon from 'sinon';
import '../lion-switch-button.js';
describe('lion-switch-button', () => {
let el;
beforeEach(async () => {
el = await fixture(html``);
});
it('should be focusable', () => {
expect(el.tabIndex).to.equal(0);
expect(el.getAttribute('tabindex')).to.equal('0');
});
it('should not have a [type]', () => {
expect(el.hasAttribute('type')).to.be.false;
});
it('should have checked=false by default', () => {
expect(el.checked).to.equal(false);
expect(el.hasAttribute('checked')).to.be.false;
});
it('is hidden when attribute hidden is true', async () => {
el.hidden = true;
await el.updateComplete;
expect(el).not.to.be.displayed;
});
it('should toggle the value of "checked" on click', async () => {
expect(el.checked).to.be.false;
expect(el.hasAttribute('checked')).to.be.false;
el.click();
await el.updateComplete;
expect(el.checked).to.be.true;
expect(el.hasAttribute('checked')).to.be.true;
el.click();
await el.updateComplete;
expect(el.checked).to.be.false;
expect(el.hasAttribute('checked')).to.be.false;
});
it('can be disabled', async () => {
el.disabled = true;
expect(el.checked).to.be.false;
el.click();
await el.updateComplete;
expect(el.checked).to.be.false;
expect(el.hasAttribute('checked')).to.be.false;
el.disabled = true;
el.checked = true;
el.click();
await el.updateComplete;
expect(el.checked).to.be.true;
expect(el.hasAttribute('checked')).to.be.true;
});
it('should dispatch "checked-changed" event when toggled', () => {
const handlerSpy = sinon.spy();
el.addEventListener('checked-changed', handlerSpy);
el.click();
el.click();
expect(handlerSpy.callCount).to.equal(2);
const checkCall = call => {
expect(call.args).to.have.a.lengthOf(1);
const e = call.args[0];
expect(e).to.be.an.instanceof(Event);
expect(e.bubbles).to.be.true;
expect(e.composed).to.be.true;
};
checkCall(handlerSpy.getCall(0), true);
checkCall(handlerSpy.getCall(1), false);
});
it('should dispatch "checked-changed" event when checked changed', () => {
const handlerSpy = sinon.spy();
el.addEventListener('checked-changed', handlerSpy);
el.checked = true;
el.checked = false;
expect(handlerSpy.callCount).to.equal(2);
const checkCall = call => {
expect(call.args).to.have.a.lengthOf(1);
const e = call.args[0];
expect(e).to.be.an.instanceof(Event);
expect(e.bubbles).to.be.true;
expect(e.composed).to.be.true;
};
checkCall(handlerSpy.getCall(0), true);
checkCall(handlerSpy.getCall(1), false);
});
it('should not dispatch "checked-changed" event if disabled', () => {
const handlerSpy = sinon.spy();
el.disabled = true;
el.addEventListener('checked-changed', handlerSpy);
el.click();
expect(handlerSpy.called).to.be.false;
});
describe('a11y', () => {
it('should manage "aria-checked"', async () => {
expect(el.hasAttribute('aria-checked')).to.be.true;
expect(el.getAttribute('aria-checked')).to.equal('false');
el.click();
await el.updateComplete;
expect(el.getAttribute('aria-checked')).to.equal('true');
el.click();
await el.updateComplete;
expect(el.getAttribute('aria-checked')).to.equal('false');
el.checked = true;
await el.updateComplete;
expect(el.getAttribute('aria-checked')).to.equal('true');
el.checked = false;
await el.updateComplete;
expect(el.getAttribute('aria-checked')).to.equal('false');
el.setAttribute('checked', true);
await el.updateComplete;
expect(el.getAttribute('aria-checked')).to.equal('true');
el.removeAttribute('checked');
await el.updateComplete;
expect(el.getAttribute('aria-checked')).to.equal('false');
});
});
it('should manage "aria-disabled"', async () => {
el.disabled = true;
await el.updateComplete;
expect(el.getAttribute('aria-disabled')).to.equal('true');
el.disabled = false;
await el.updateComplete;
expect(el.getAttribute('aria-disabled')).to.equal('false');
});
});