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'); }); }); });