rsuite
Version:
A suite of react components
309 lines (254 loc) • 9.76 kB
JavaScript
import React from 'react';
import ReactTestUtils from 'react-dom/test-utils';
import { findDOMNode } from 'react-dom';
import { globalKey, getDOMNode, getInstance } from '@test/testUtils';
import Dropdown from '../CheckPicker';
import Button from '../../Button';
const namespace = `${globalKey}-picker`;
const classPrefix = `${namespace}-check`;
const groupClassName = `.${classPrefix}-menu-group`;
const itemFocusClassName = '.rs-check-item-focus';
const itemActiveClassName = '.rs-checkbox-checked';
const cleanClassName = `.${namespace}-toggle-clean`;
const placeholderClassName = `.${namespace}-toggle-placeholder`;
const valueClassName = `.${namespace}-value-list`;
const data = [
{
label: 'Eugenia',
value: 'Eugenia',
role: 'Master'
},
{
label: <span>Kariane</span>,
value: 'Kariane',
role: 'Master'
},
{
label: 'Louisa',
value: 'Louisa',
role: 'Master'
}
];
describe('CheckPicker', () => {
it('Should clean selected default value', () => {
const instance = getDOMNode(<Dropdown defaultOpen data={data} defaultValue={['Eugenia']} />);
ReactTestUtils.Simulate.click(instance.querySelector(cleanClassName));
expect(instance.querySelector(placeholderClassName).innerText).to.equal('Select');
});
it('Should not clean selected value', () => {
const instance = getDOMNode(<Dropdown defaultOpen data={data} value={['Eugenia']} />);
ReactTestUtils.Simulate.click(instance.querySelector(cleanClassName));
expect(instance.querySelector(valueClassName).innerText).to.equal('Eugenia');
});
it('Should output a dropdown', () => {
const Title = 'Title';
const instance = getDOMNode(<Dropdown>{Title}</Dropdown>);
assert.ok(instance.className.match(/\bpicker-check\b/));
});
it('Should output a button', () => {
const instance = getInstance(<Dropdown toggleComponentClass="button" />);
assert.ok(ReactTestUtils.findRenderedDOMComponentWithTag(instance, 'button'));
});
it('Should be disabled', () => {
const instance = getDOMNode(<Dropdown disabled />);
assert.ok(instance.className.match(/\bdisabled\b/));
});
it('Should be block', () => {
const instance = getDOMNode(<Dropdown block />);
assert.ok(instance.className.match(/\bblock\b/));
});
it('Should active item by `value`', () => {
const value = ['Louisa'];
const instance = getInstance(<Dropdown defaultOpen data={data} value={value} />);
const menu = findDOMNode(instance.menuContainerRef.current);
assert.equal(getDOMNode(instance).querySelector(valueClassName).innerText, 'Louisa');
assert.equal(menu.querySelector(itemActiveClassName).innerText, value);
});
it('Should active item by `defaultValue`', () => {
const value = ['Louisa'];
const instance = getInstance(<Dropdown defaultOpen data={data} defaultValue={value} />);
const menu = findDOMNode(instance.menuContainerRef.current);
assert.equal(getDOMNode(instance).querySelector(valueClassName).innerText, 'Louisa');
assert.equal(menu.querySelector(itemActiveClassName).innerText, value);
});
it('Should render a group', () => {
const instance = getInstance(<Dropdown defaultOpen groupBy="role" data={data} />);
const menu = findDOMNode(instance.menuContainerRef.current);
assert.ok(menu.querySelector(groupClassName));
});
it('Should have a placeholder', () => {
const instance = getDOMNode(<Dropdown className="custom" placeholder="test" />);
assert.equal(instance.querySelector(placeholderClassName).innerText, 'test');
});
it('Should render value by `renderValue`', () => {
const instance = getDOMNode(
<Dropdown
placeholder="test"
data={[{ label: '1', value: '1' }, { label: '2', value: '2' }]}
value={['1', '2']}
renderValue={value => value.join(',')}
/>
);
assert.equal(instance.querySelector('.rs-picker-toggle-value').innerText, '1,2');
});
it('Should render a placeholder when value error', () => {
const instance = getDOMNode(
<Dropdown
placeholder="test"
data={[{ label: '1', value: '1' }, { label: '2', value: '2' }]}
value={['4']}
/>
);
assert.equal(instance.querySelector(placeholderClassName).innerText, 'test');
});
it('Should call `onChange` callback', done => {
const doneOp = () => {
done();
};
const instance = getInstance(
<Dropdown defaultOpen onChange={doneOp} data={[{ label: '1', value: '1' }]} />
);
const menu = findDOMNode(instance.menuContainerRef.current);
ReactTestUtils.Simulate.change(menu.querySelectorAll('input')[0]);
});
it('Should call `onClean` callback', done => {
const doneOp = () => {
done();
};
const instance = getDOMNode(
<Dropdown data={data} defaultValue={['Eugenia']} onClean={doneOp} />
);
ReactTestUtils.Simulate.click(instance.querySelector('.rs-picker-toggle-clean'));
});
it('Should call `onOpen` callback', done => {
const doneOp = key => {
done();
};
let picker = null;
getDOMNode(
<Dropdown
ref={ref => {
picker = ref;
}}
onOpen={doneOp}
data={data}
/>
);
picker.open();
});
it('Should call `onClose` callback', done => {
const doneOp = key => {
done();
};
let picker = null;
getDOMNode(
<Dropdown
defaultOpen
ref={ref => {
picker = ref;
}}
onClose={doneOp}
data={data}
/>
);
picker.close();
});
it('Should output a clean button', () => {
const instance = getDOMNode(<Dropdown data={data} defaultValue={['Louisa']} />);
assert.ok(instance.querySelector(cleanClassName));
});
it('Should focus item by keyCode=40 ', done => {
const instance = getInstance(<Dropdown defaultOpen data={data} defaultValue={['Eugenia']} />);
const menu = findDOMNode(instance.menuContainerRef.current);
const toggle = instance.getToggleInstance().toggleRef.current;
ReactTestUtils.Simulate.keyDown(toggle, { keyCode: 40 });
if (menu.querySelector(itemFocusClassName).innerText === 'Kariane') {
done();
}
});
it('Should focus item by keyCode=38 ', done => {
const instance = getInstance(<Dropdown defaultOpen data={data} defaultValue={['Kariane']} />);
const menuDOM = findDOMNode(instance.menuContainerRef.current);
ReactTestUtils.Simulate.keyDown(instance.getToggleInstance().toggleRef.current, {
keyCode: 38
});
if (menuDOM.querySelector(itemFocusClassName).innerText === 'Eugenia') {
done();
}
});
it('Should call `onChange` by keyCode=13 ', done => {
const doneOp = () => {
done();
};
const instance = getInstance(
<Dropdown defaultOpen data={data} onChange={doneOp} defaultValue={['Kariane']} />
);
const toggle = instance.getToggleInstance().toggleRef.current;
ReactTestUtils.Simulate.keyDown(toggle, { keyCode: 13 });
});
it('Should call `onSelect` by keyCode=13 ', done => {
const doneOp = (value, item) => {
if (value.length === 2 && item.value === 'Louisa') {
done();
}
};
const instance = getInstance(
<Dropdown defaultOpen data={data} onSelect={doneOp} defaultValue={['Kariane']} />
);
const toggle = instance.getToggleInstance().toggleRef.current;
ReactTestUtils.Simulate.keyDown(toggle, { keyCode: 40 });
ReactTestUtils.Simulate.keyDown(toggle, { keyCode: 13 });
});
it('Should call onBlur callback', done => {
const doneOp = () => {
done();
};
const instance = getInstance(<Dropdown data={data} onBlur={doneOp} />);
const toggle = instance.getToggleInstance().toggleRef.current;
ReactTestUtils.Simulate.blur(toggle);
});
it('Should call onFocus callback', done => {
const doneOp = () => {
done();
};
const instance = getInstance(<Dropdown data={data} onFocus={doneOp} />);
const toggle = instance.getToggleInstance().toggleRef.current;
ReactTestUtils.Simulate.focus(toggle);
});
it('Should have a custom className', () => {
const instance = getInstance(
<Dropdown className="custom" defaultOpen data={[{ label: '', value: '1' }]} />
);
assert.include(getDOMNode(instance).className, 'custom');
expect(findDOMNode(instance.menuContainerRef.current).className).to.not.include('custom');
});
it('Should have a custom style', () => {
const fontSize = '12px';
const instance = getDOMNode(<Dropdown style={{ fontSize }} />);
assert.equal(instance.style.fontSize, fontSize);
});
it('Allow `label` to be an empty string', () => {
const instance = getInstance(
<Dropdown placeholder="test" data={[{ label: '', value: '1' }]} value={['1']} defaultOpen />
);
const menu = findDOMNode(instance.menuContainerRef.current).querySelector(
'.rs-checkbox-checked'
);
assert.equal(menu.innerText, '');
});
it('Should have a custom className prefix', () => {
const instance = getDOMNode(<Dropdown classPrefix="custom-prefix" />);
assert.ok(instance.className.match(/\bcustom-prefix\b/));
});
it('Should be sticky', () => {
const instance = getInstance(
<Dropdown placeholder="test" sticky data={data} value={['Kariane']} defaultOpen />
);
const menu = findDOMNode(instance.menuContainerRef.current).querySelector('.rs-checkbox');
assert.equal(menu.innerText, 'Kariane');
});
it('Should render a button by toggleComponentClass={Button}', () => {
const instance = getInstance(<Dropdown open data={data} toggleComponentClass={Button} />);
ReactTestUtils.findRenderedDOMComponentWithClass(instance, 'rs-btn');
});
});