pulsar/spec/panel-spec.js
2019-05-31 18:33:56 +02:00

115 lines
3.7 KiB
JavaScript

const Panel = require('../src/panel');
describe('Panel', () => {
class TestPanelItem {
getElement() {
if (!this.element) {
this.element = document.createElement('div');
this.element.tabIndex = -1;
this.element.className = 'test-root';
}
return this.element;
}
}
it("adds the item's element as a child of the panel", () => {
const panel = new Panel({ item: new TestPanelItem() }, atom.views);
const element = panel.getElement();
expect(element.tagName.toLowerCase()).toBe('atom-panel');
expect(element.firstChild).toBe(panel.getItem().getElement());
});
describe('destroying the panel', () => {
it('removes the element when the panel is destroyed', () => {
const panel = new Panel({ item: new TestPanelItem() }, atom.views);
const element = panel.getElement();
const jasmineContent = document.getElementById('jasmine-content');
jasmineContent.appendChild(element);
expect(element.parentNode).toBe(jasmineContent);
panel.destroy();
expect(element.parentNode).not.toBe(jasmineContent);
});
it('does not try to remove the element twice', () => {
const item = new TestPanelItem();
const panel = new Panel({ item }, atom.views);
const element = panel.getElement();
const jasmineContent = document.getElementById('jasmine-content');
jasmineContent.appendChild(element);
item.getElement().focus();
expect(item.getElement()).toHaveFocus();
// Avoid this error:
// NotFoundError: Failed to execute 'remove' on 'Element':
// The node to be removed is no longer a child of this node.
// Perhaps it was moved in a 'blur' event handler?
item.getElement().addEventListener('blur', () => panel.destroy());
panel.destroy();
});
});
describe('changing panel visibility', () => {
it('notifies observers added with onDidChangeVisible', () => {
const panel = new Panel({ item: new TestPanelItem() }, atom.views);
const spy = jasmine.createSpy();
panel.onDidChangeVisible(spy);
panel.hide();
expect(panel.isVisible()).toBe(false);
expect(spy).toHaveBeenCalledWith(false);
spy.reset();
panel.show();
expect(panel.isVisible()).toBe(true);
expect(spy).toHaveBeenCalledWith(true);
panel.destroy();
expect(panel.isVisible()).toBe(false);
expect(spy).toHaveBeenCalledWith(false);
});
it('initially renders panel created with visible: false', () => {
const panel = new Panel(
{ visible: false, item: new TestPanelItem() },
atom.views
);
const element = panel.getElement();
expect(element.style.display).toBe('none');
});
it('hides and shows the panel element when Panel::hide() and Panel::show() are called', () => {
const panel = new Panel({ item: new TestPanelItem() }, atom.views);
const element = panel.getElement();
expect(element.style.display).not.toBe('none');
panel.hide();
expect(element.style.display).toBe('none');
panel.show();
expect(element.style.display).not.toBe('none');
});
});
describe('when a class name is specified', () => {
it('initially renders panel created with visible: false', () => {
const panel = new Panel(
{ className: 'some classes', item: new TestPanelItem() },
atom.views
);
const element = panel.getElement();
expect(element).toHaveClass('some');
expect(element).toHaveClass('classes');
});
});
describe('creating an atom-panel via markup', () => {
it('does not throw an error', () => {
document.createElement('atom-panel');
});
});
});