import * as React from 'react'; import { keyboardKey } from '@fluentui/keyboard-key'; import { isConformant } from 'test/specs/commonTests'; import { mountWithProvider } from 'test/utils'; import { HierarchicalTree } from 'src/components/HierarchicalTree/HierarchicalTree'; import { hierarchicalTreeTitleClassName } from 'src/components/HierarchicalTree/HierarchicalTreeTitle'; import { hierarchicalTreeItemClassName } from 'src/components/HierarchicalTree/HierarchicalTreeItem'; import { ReactWrapper, CommonWrapper } from 'enzyme'; const items = [ { key: '1', title: '1', items: [ { key: '11', title: '11', }, { key: '12', title: '12', items: [ { key: '121', title: '121', }, ], }, ], }, { key: '2', title: '2', items: [ { key: '21', title: '21', items: [ { key: '211', title: '211', }, ], }, { key: '22', title: '22', }, ], }, { key: '3', title: '3', }, ]; const getTitles = (wrapper: ReactWrapper): CommonWrapper => wrapper.find(`.${hierarchicalTreeTitleClassName}`).filterWhere(n => typeof n.type() === 'string'); const getItems = (wrapper: ReactWrapper): CommonWrapper => wrapper.find(`.${hierarchicalTreeItemClassName}`).filterWhere(n => typeof n.type() === 'string'); const checkOpenTitles = (wrapper: ReactWrapper, expected: string[]): void => { const titles = getTitles(wrapper); expect(titles.length).toEqual(expected.length); expected.forEach((expectedTitle, index) => { expect(titles.at(index).getDOMNode().textContent).toEqual(expectedTitle); }); }; describe('HierarchialTree', () => { isConformant(HierarchicalTree, { constructorName: 'HierarchicalTree', autoControlledProps: ['activeIndex'], }); describe('activeIndex', () => { it('should contain index of item open at click', () => { const wrapper = mountWithProvider(); getTitles(wrapper) .at(0) // title 1 .simulate('click'); checkOpenTitles(wrapper, ['1', '11', '12', '2', '3']); getTitles(wrapper) .at(3) // title 2 .simulate('click'); checkOpenTitles(wrapper, ['1', '11', '12', '2', '21', '22', '3']); }); it('should have index of item removed when closed at click', () => { const wrapper = mountWithProvider(); getTitles(wrapper) .at(0) // title 1 .simulate('click'); checkOpenTitles(wrapper, ['1', '2', '21', '22', '3']); }); it('should contain only one index at a time if exclusive', () => { const wrapper = mountWithProvider(); getTitles(wrapper) .at(0) // title 1 .simulate('click'); checkOpenTitles(wrapper, ['1', '11', '12', '2', '3']); getTitles(wrapper) .at(3) // title 2 .simulate('click'); checkOpenTitles(wrapper, ['1', '2', '21', '22', '3']); }); it('should contain index of item open by ArrowRight', () => { const wrapper = mountWithProvider(); getTitles(wrapper) .at(0) // title 1 .simulate('keydown', { keyCode: keyboardKey.ArrowRight }); checkOpenTitles(wrapper, ['1', '11', '12', '2', '3']); }); it('should have index of item removed if closed by ArrowLeft', () => { const wrapper = mountWithProvider(); getItems(wrapper) .at(0) // title 1 .simulate('keydown', { keyCode: keyboardKey.ArrowLeft }); checkOpenTitles(wrapper, ['1', '2', '21', '22', '3']); }); it('should have all TreeItems with a subtree open on asterisk key', () => { const wrapper = mountWithProvider(); getTitles(wrapper) .at(0) // title 1 .simulate('keydown', { keyCode: keyboardKey['*'] }); checkOpenTitles(wrapper, ['1', '11', '12', '2', '21', '22', '3']); }); it('should expand subtrees only on current level on asterisk key', () => { const wrapper = mountWithProvider(); getTitles(wrapper) .at(1) // title 11 .simulate('keydown', { keyCode: keyboardKey['*'] }); checkOpenTitles(wrapper, ['1', '11', '12', '121', '2', '3']); }); it('should not be changed on asterisk key if all siblings are already expanded', () => { const wrapper = mountWithProvider(); getTitles(wrapper) .at(0) // title 1 .simulate('keydown', { keyCode: keyboardKey['*'] }); checkOpenTitles(wrapper, ['1', '11', '12', '2', '21', '22', '3']); }); }); });