import * as sinon from 'sinon';
import {SidebarElement} from '../src';
describe('Instance creation', () => {
beforeEach(() => {
document.body.innerHTML = '';
});
test('Should create instance', () => {
document.body.innerHTML = '
';
const sidebarjs = new SidebarElement();
expect(sidebarjs).toBeDefined();
expect(sidebarjs.component).toBeInstanceOf(HTMLDivElement);
expect(sidebarjs.container).toBeInstanceOf(HTMLDivElement);
expect(sidebarjs.backdrop).toBeInstanceOf(HTMLDivElement);
expect(sidebarjs.component.hasAttribute('sidebarjs')).toBe(true);
expect(sidebarjs.container.hasAttribute('sidebarjs-container')).toBe(true);
expect(sidebarjs.backdrop.hasAttribute('sidebarjs-backdrop')).toBe(true);
});
test('Should not create instance', () => {
expect(() => new SidebarElement()).toThrowError('You must define an element with [sidebarjs] attribute');
});
describe('Transclude', () => {
test('Should transclude content', () => {
const spy = sinon.spy(SidebarElement.prototype as any, 'transcludeContent');
document.body.innerHTML = 'Hello
';
const sidebarjs = new SidebarElement();
expect(sidebarjs.container.innerHTML).toBe('Hello');
expect(sidebarjs.component.hasAttribute('sidebarjs')).toBe(true);
expect(sidebarjs.container.hasAttribute('sidebarjs-container')).toBe(true);
expect(sidebarjs.backdrop.hasAttribute('sidebarjs-backdrop')).toBe(true);
expect(spy.called).toBe(true);
expect(spy.calledOnce).toBe(true);
spy.restore();
});
test('Should not transclude content with all custom HTMLElement params in config', () => {
const spy = sinon.spy(SidebarElement.prototype as any, 'transcludeContent');
document.body.innerHTML = `
`;
const element = document.querySelector('[sidebarjs]')!;
const sidebarjs = new SidebarElement({
backdrop: element.children[1] as HTMLElement,
component: element as HTMLElement,
container: element.children[0] as HTMLElement,
});
expect(sidebarjs.container.innerHTML).toBe('Hello');
expect(sidebarjs.container.nodeName).toBe('SECTION');
expect(sidebarjs.backdrop.nodeName).toBe('SECTION');
expect(sidebarjs.component.hasAttribute('sidebarjs')).toBe(true);
expect(sidebarjs.container.hasAttribute('custom-container')).toBe(true);
expect(sidebarjs.backdrop.hasAttribute('custom-backdrop')).toBe(true);
expect(sidebarjs.container.hasAttribute('sidebarjs-container')).toBe(false);
expect(sidebarjs.backdrop.hasAttribute('sidebarjs-backdrop')).toBe(false);
expect(spy.called).toBe(false);
spy.restore();
});
test('Should transclude content if has not all custom HTMLElement params in config', () => {
const spy = sinon.spy(SidebarElement.prototype as any, 'transcludeContent');
document.body.innerHTML = `
`;
const component = document.querySelector('[sidebarjs]');
const container = document.querySelector('[custom-container]');
const sidebarjs = new SidebarElement({
component: component as HTMLElement,
container: container as HTMLElement,
/* backdrop: element.children[1], */
});
expect(sidebarjs.container.innerText).not.toBe('Hello');
expect(sidebarjs.container.innerText).toBeFalsy();
expect(sidebarjs.container.children[0].outerHTML).toBe('');
expect(sidebarjs.container.children[1].outerHTML).toBe('');
expect(spy.called).toBe(true);
expect(spy.calledOnce).toBe(true);
spy.restore();
});
});
describe('Native Swipe', () => {
test('Should has native gestures', () => {
document.body.innerHTML = '';
const sidebarjs = new SidebarElement();
expect(sidebarjs.nativeSwipe).toBe(true);
expect(sidebarjs.nativeSwipeOpen).toBe(true);
});
test('Should not has nativeSwipe', () => {
document.body.innerHTML = '';
const sidebarjs = new SidebarElement({nativeSwipe: false});
expect(sidebarjs.nativeSwipe).toBe(false);
expect(sidebarjs.nativeSwipeOpen).toBe(true);
});
test('Should not has nativeSwipeOpen', () => {
document.body.innerHTML = '';
const sidebarjs = new SidebarElement({nativeSwipeOpen: false});
expect(sidebarjs.nativeSwipe).toBe(true);
expect(sidebarjs.nativeSwipeOpen).toBe(false);
});
test('Should not has native gestures', () => {
document.body.innerHTML = '';
const sidebarjs = new SidebarElement({nativeSwipe: false, nativeSwipeOpen: false});
expect(sidebarjs.nativeSwipe).toBe(false);
expect(sidebarjs.nativeSwipeOpen).toBe(false);
});
});
describe('Backdrop opacity', () => {
test('Should has default opacity', () => {
document.body.innerHTML = 'Hello
';
const sidebarjs = new SidebarElement();
sidebarjs.open();
expect(sidebarjs.backdrop.style.opacity).toBe('0.3');
expect(sidebarjs.backdrop.getAttribute('style')).toBe('opacity: 0.3;');
});
test('Should has custom opacity', () => {
document.body.innerHTML = 'Hello
';
const sidebarjs = new SidebarElement({backdropOpacity: .8});
sidebarjs.open();
expect(sidebarjs.backdrop.style.opacity).toBe('0.8');
expect(sidebarjs.backdrop.getAttribute('style')).toBe('opacity: 0.8;');
});
test('Should has not opacity', () => {
document.body.innerHTML = 'Hello
';
const sidebarjs = new SidebarElement({backdropOpacity: 0});
sidebarjs.open();
expect(sidebarjs.backdrop.style.opacity).toBe('0');
expect(sidebarjs.backdrop.getAttribute('style')).toBe('opacity: 0;');
});
test('Should has full opacity', () => {
document.body.innerHTML = 'Hello
';
const sidebarjs = new SidebarElement({backdropOpacity: 1});
sidebarjs.open();
expect(sidebarjs.backdrop.style.opacity).toBe('1');
expect(sidebarjs.backdrop.getAttribute('style')).toBe('opacity: 1;');
});
});
describe('OnChanges functions', () => {
test('Should trigger onOpen', () => {
document.body.innerHTML = 'Hello
';
let n = 0;
const sidebarjs = new SidebarElement(({
onOpen() {
n = 1;
},
}));
sidebarjs.open();
// emulate trigger transitionend event
sidebarjs['_onTransitionEnd']();
expect(n).toBe(1);
});
test('Should trigger onClose', () => {
document.body.innerHTML = 'Hello
';
let n = 0;
const sidebarjs = new SidebarElement(({
onClose() {
n = 1;
},
}));
sidebarjs.open();
// emulate trigger transitionend event
sidebarjs['_onTransitionEnd']();
sidebarjs.close();
// emulate trigger transitionend event
sidebarjs['_onTransitionEnd']();
expect(n).toBe(1);
});
test('Should trigger onChangeVisibility', () => {
document.body.innerHTML = 'Hello
';
let n = 0;
let changes: any = null;
const sidebarjs = new SidebarElement(({
onChangeVisibility(changesEvent) {
changes = changesEvent;
++n;
},
}));
sidebarjs.open();
// emulate trigger transitionend event
sidebarjs['_onTransitionEnd']();
expect(n).toBe(1);
expect(changes).toEqual({isVisible: true});
sidebarjs.close();
// emulate trigger transitionend event
sidebarjs['_onTransitionEnd']();
expect(n).toBe(2);
expect(changes).toEqual({isVisible: false});
});
test('Should trigger all onChanges functions', () => {
document.body.innerHTML = 'Hello
';
let n = 0;
let isOpenFired = false;
let isCloseFired = false;
let changes: any = null;
const sidebarjs = new SidebarElement(({
onOpen() {
isOpenFired = true;
isCloseFired = false;
},
onClose() {
isOpenFired = false;
isCloseFired = true;
},
onChangeVisibility(changesEvent) {
changes = changesEvent;
++n;
},
}));
sidebarjs.open();
// emulate trigger transitionend event
sidebarjs['_onTransitionEnd']();
expect(n).toBe(1);
expect(isOpenFired).toBe(true);
expect(isCloseFired).toBe(false);
expect(changes).toEqual({isVisible: true});
sidebarjs.close();
// emulate trigger transitionend event
sidebarjs['_onTransitionEnd']();
expect(n).toBe(2);
expect(isOpenFired).toBe(false);
expect(isCloseFired).toBe(true);
expect(changes).toEqual({isVisible: false});
sidebarjs.toggle();
// emulate trigger transitionend event
sidebarjs['_onTransitionEnd']();
expect(n).toBe(3);
expect(isOpenFired).toBe(true);
expect(isCloseFired).toBe(false);
expect(changes).toEqual({isVisible: true});
});
});
describe('Style manipulation', () => {
test('Should add styles', () => {
document.body.innerHTML = '';
const sidebarjs = new SidebarElement();
const elem = document.createElement('div');
sidebarjs['applyStyle'](elem, 'transform', `translate(0, 0)`);
expect(elem.style.webkitTransform).toBe('');
expect(elem.style.transform).toBeDefined();
expect(elem.style.transform).toBe('translate(0, 0)');
});
test('Should add styles vendor prefix', () => {
document.body.innerHTML = '';
const sidebarjs = new SidebarElement();
const elem = document.createElement('div');
sidebarjs['applyStyle'](elem, 'transform', `translate(0, 0)`, true);
expect(elem.style.webkitTransform).toBeDefined();
expect(elem.style.webkitTransform).toBe('translate(0, 0)');
expect(elem.style.transform).toBeDefined();
expect(elem.style.transform).toBe('translate(0, 0)');
});
test('Should remove styles ', () => {
document.body.innerHTML = '';
const sidebarjs = new SidebarElement();
const elem = document.createElement('div');
sidebarjs['applyStyle'](elem, 'transform', `translate(0, 0)`);
expect(elem.style.transform).toBeDefined();
expect(elem.style.transform).toBe('translate(0, 0)');
sidebarjs['clearStyle'](elem);
expect(elem.style.transform).toBe('');
});
});
});