import React from 'react'; //import { shallow, mount } from 'enzyme'; import { shallow } from 'enzyme'; import assert from 'assert'; import _ from 'lodash'; import { common } from '../../util/generic-tests'; import Collapsible from './Collapsible'; import { Motion } from 'react-motion'; //import { MOSTLY_STABLE_DELAY } from '../../util/constants'; describe('Collapsible', () => { common(Collapsible, { selectRoot: (wrapper: any) => wrapper.find(Motion).shallow(), } as any); describe('render', () => { it('should render a root element wrapping a content element', () => { const wrapper = shallow(); const motionWrapper = wrapper.find(Motion).shallow(); assert.strictEqual( motionWrapper.find('.lucid-Collapsible').length, 1, 'must render root element' ); assert.strictEqual( motionWrapper.find('.lucid-Collapsible > .lucid-Collapsible-content') .length, 1, 'must render a content element' ); assert.strictEqual( motionWrapper .find('.lucid-Collapsible > .lucid-Collapsible-content') .children().length, 0, 'must not render children' ); }); }); describe('props', () => { /* * In order to test `isExpanded` it is simplest to render one instance of * the component and alternate values for `isExpanded`. This is because the * max height can be captured in the initial render and be used in later * assertions between transitions. * */ describe('isExpanded', () => { /* let wrapper: any; let testDomElement; // only needed for the skipped tests: beforeEach(() => { testDomElement = document.createElement('div'); document.body.appendChild(testDomElement); }); afterEach(() => { if (wrapper) { wrapper.unmount(); } wrapper = null; testDomElement.parentNode.removeChild(testDomElement); }); */ it('should default to true', () => { assert.strictEqual(true, _.get(Collapsible.defaultProps, 'isExpanded')); }); /* it.skip('should transition the container height when the prop alternates between boolean values [mostly stable]', (done) => { wrapper = mount( -- Content to test height changes. -- , { attachTo: testDomElement }); let startingHeight; _.delay(() => { startingHeight = testDomElement.getBoundingClientRect().height; assert(startingHeight > 0); wrapper.setProps({ ...wrapper.props(), isExpanded: false, }); _.delay(() => { const currentHeight = testDomElement.getBoundingClientRect().height; assert.strictEqual(0, currentHeight); wrapper.setProps({ ...wrapper.props(), isExpanded: true, }); _.delay(() => { const currentHeight = testDomElement.getBoundingClientRect().height; assert.strictEqual(currentHeight, startingHeight); done(); }, MOSTLY_STABLE_DELAY); }, MOSTLY_STABLE_DELAY); }, MOSTLY_STABLE_DELAY); }); */ }); /* * `isAnimated` is implmented in a special way: There's an property on the * component instance (`this`) with the same name which controls which * value is send to Motion. It's important to attach this to the component * rather than only use the prop so that the initial render is never * animated. After some time is given for the initial render the value of * the instance property will match the value given in the props for * `isAnimated` so that subsequent re-renders can be animated if desired. * */ describe('isAnimated', () => { /* let wrapper: any; let testDomElement; /* only needed for the skipped tests: beforeEach(() => { testDomElement = document.createElement('div'); document.body.appendChild(testDomElement); }); afterEach(() => { if (wrapper) { wrapper.unmount(); } wrapper = null; testDomElement.parentNode.removeChild(testDomElement); }); */ it('should default to true', () => { assert.strictEqual(true, _.get(Collapsible.defaultProps, 'isAnimated')); }); /* it.skip('should set value of instance property `isAnimated` after initial render [mostly stable]', (done) => { wrapper = mount( -- Content to test height changes. -- , { attachTo: testDomElement }); assert.strictEqual(false, wrapper.instance().isAnimated, 'must always be false initially'); _.delay(() => { assert.strictEqual(true, wrapper.instance().isAnimated, 'must be true to match prop value'); done(); }, MOSTLY_STABLE_DELAY); }); it.skip('should set value of instance property `isAnimated` after initial render [mostly stable]', (done) => { wrapper = mount( -- Content to test height changes. -- , { attachTo: testDomElement }); assert.strictEqual(false, wrapper.instance().isAnimated, 'must always be false initially'); _.delay(() => { assert.strictEqual(false, wrapper.instance().isAnimated, 'must be false to match prop value'); done(); }, MOSTLY_STABLE_DELAY); }); */ }); describe('isMountControlled', () => { /* let wrapper: any; let testDomElement; // only needed for the skipped tests: beforeEach(() => { testDomElement = document.createElement('div'); document.body.appendChild(testDomElement); }); afterEach(() => { if (wrapper) { wrapper.unmount(); } wrapper = null; testDomElement.parentNode.removeChild(testDomElement); }); */ it('should default to true', () => { assert.strictEqual( true, _.get(Collapsible.defaultProps, 'isMountControlled') ); }); /* it.skip('should not render children after initial render when true and collapsed [mostly stable]', (done) => { wrapper = mount(
I will be unmounted on collapse
, { attachTo: testDomElement }); _.delay(() => { assert.strictEqual(0, wrapper.find('.test-mounted-content').length, 'must not render content when collapsed'); done(); }, MOSTLY_STABLE_DELAY); }); it.skip('should render children after initial render when true and expanded [mostly stable]', (done) => { wrapper = mount(
I will be unmounted on collapse
, { attachTo: testDomElement }); _.delay(() => { assert.strictEqual(1, wrapper.find('.test-mounted-content').length, 'must render content when expanded'); done(); }, MOSTLY_STABLE_DELAY); }); it.skip('should render children after initial render when false and collapsed [mostly stable]', (done) => { wrapper = mount(
I will be unmounted on collapse
, { attachTo: testDomElement }); _.delay(() => { assert.strictEqual(1, wrapper.find('.test-mounted-content').length, 'must render hidden content when collapsed'); done(); }, MOSTLY_STABLE_DELAY); }); it.skip('should render children after initial render when false and expanded [mostly stable]', (done) => { wrapper = mount(
I will be unmounted on collapse
, { attachTo: testDomElement }); _.delay(() => { assert.strictEqual(1, wrapper.find('.test-mounted-content').length, 'must render content when expanded'); done(); }, MOSTLY_STABLE_DELAY); }); */ }); describe('rootType', () => { it('should default to `div`', () => { assert.strictEqual('div', _.get(Collapsible.defaultProps, 'rootType')); }); it('should render a root container of the passed in type', () => { const wrapper = shallow(); const motionWrapper = wrapper.find(Motion).shallow(); assert.strictEqual( motionWrapper.find('section.lucid-Collapsible').length, 1, 'must render root element of the specified type' ); }); }); }); });