import _, { forEach, has, noop } from 'lodash'; import React from 'react'; import assert from 'assert'; import sinon from 'sinon'; import { mount, shallow } from 'enzyme'; import { common, controls } from '../../util/generic-tests'; import Switch from './Switch'; describe('Switch', () => { common(Switch); controls(Switch, { callbackName: 'onSelect', controlSelector: '.lucid-Switch-native', eventType: 'click', }); const booleanValues = [true, false]; describe('props', () => { describe('isDisabled', () => { it('sets the `disabled` attribute of the native check box element.', () => { _.forEach(booleanValues, (testValue) => { const wrapper = shallow(); assert.equal( wrapper.find('input[type="checkbox"]').prop('disabled'), testValue ); }); }); }); describe('isSelected', () => { it('sets the `checked` attribute of the native check box element.', () => { _.forEach(booleanValues, (testValue) => { const wrapper = shallow(); assert.equal( wrapper.find('input[type="checkbox"]').prop('checked'), testValue ); }); }); }); describe('pass throughs', () => { let wrapper: any; const className = 'wut'; beforeEach(() => { const defaultProps = Switch.defaultProps; const props = { ...defaultProps, isDisabled: true, isSelected: true, style: { fontWeight: 'bold' }, onSelect: noop, isIncludeExclude: true, className, initialState: { test: true }, callbackId: 1, 'data-testid': 10, ...{ foo: 1, bar: 2, baz: 3, qux: 4, quux: 5, }, }; wrapper = shallow(); }); afterEach(() => { wrapper.unmount(); }); it('passes through all props not defined in `propTypes` to the native input element.', () => { const inputProps = wrapper.find('.lucid-Switch-native').props(); // 'className', 'onChange', 'checked', 'disabled' and 'type' // all appear becuase they are directly passed on the root element as a prop // It should pass `foo`, `bar`, `baz`, `qux`, and `quux` through // to the native input. _.forEach( [ 'foo', 'bar', 'baz', 'qux', 'quux', 'onChange', 'checked', 'disabled', 'type', 'className', 'data-testid', ], (prop) => { expect(has(inputProps, prop)).toBe(true); } ); }); it('omits the component specific props defined in `propTypes` (plus, in addition, `children`, `initialState`, and `callbackId`) from the root element', () => { const inputProps = wrapper.find('.lucid-Switch-native').props(); forEach( [ 'isDisabled', 'isSelected', 'onSelect', 'style', 'isIncludeExclude', 'initialState', 'callbackId', 'children', ], (prop) => { expect(has(inputProps, prop)).toBe(false); } ); }); }); }); }); describe('Switch', () => { function simulateEvent(reactElement: any, selector: any, event: any) { mount(reactElement).find(selector).simulate(event); } function verifyArgumentsWhenFalse(event: any) { _.forEach( ['', '-native', '-visualization-container', '-visualization-handle'], (classSubString) => { const onSelect: any = sinon.spy(); simulateEvent( , `.lucid-Switch${classSubString}`, event ); assert.equal(onSelect.args[0][0], true); assert((_.last(onSelect.args[0]) as any).event); } ); } function verifyArgumentsWhenTrue(event: any) { _.forEach( ['', '-native', '-visualization-container', '-visualization-handle'], (classSubString) => { const onSelect: any = sinon.spy(); simulateEvent( , `.lucid-Switch${classSubString}`, event ); assert.equal(onSelect.args[0][0], false); assert((_.last(onSelect.args[0]) as any).event); } ); } function verifyOnSelect(event: any) { _.forEach( ['', '-native', '-visualization-container', '-visualization-handle'], (classSubString) => { const onSelect: any = sinon.spy(); simulateEvent( , `.lucid-Switch${classSubString}`, event ); assert(onSelect.calledOnce); } ); } describe('user clicks on the rendered control', () => { it('calls the function passed in as the `onSelect` prop...', () => { verifyOnSelect('click'); }); it('...and when `isSelected` is true passes along false as the first argument and a React synthetic event as the second argument.', () => { verifyArgumentsWhenTrue('click'); }); it('...and when `isSelected` is false passes along true as the first argument and a React synthetic event as the second argument.', () => { verifyArgumentsWhenFalse('click'); }); }); describe('user taps on the rendered control', () => { it('calls the function passed in as the `onSelect` prop...', () => { verifyOnSelect('touchend'); }); it('...and when `isSelected` is true passes along false as the first argument and a React synthetic event as the second argument.', () => { verifyArgumentsWhenTrue('touchend'); }); it('...and when `isSelected` is false passes along true as the first argument and a React synthetic event as the second argument.', () => { verifyArgumentsWhenFalse('touchend'); }); }); });