rsuite
Version:
A suite of react components
174 lines (153 loc) • 6.08 kB
JavaScript
import React from 'react';
import { findDOMNode } from 'react-dom';
import ReactTestUtils from 'react-dom/test-utils';
import Dropdown from '../Dropdown';
import Button from '../../Button';
import { innerText } from '@test/testUtils';
describe('Dropdown', () => {
it('Should render a Dropdown', () => {
const instance = ReactTestUtils.renderIntoDocument(
<Dropdown>
<Dropdown.Item>1</Dropdown.Item>
<Dropdown.Item>2</Dropdown.Item>
{null}
<div>abc</div>
</Dropdown>
);
assert.include(findDOMNode(instance).className, 'rs-dropdown');
});
it('Should be disabled', () => {
const instance = ReactTestUtils.renderIntoDocument(
<Dropdown disabled>
<Dropdown.Item>1</Dropdown.Item>
<Dropdown.Item>2</Dropdown.Item>
</Dropdown>
);
assert.include(findDOMNode(instance).className, 'rs-dropdown-disabled');
});
it('Should hava a custom className in toggle', () => {
const instance = ReactTestUtils.renderIntoDocument(
<Dropdown toggleClassName="custom-toggle">
<Dropdown.Item>1</Dropdown.Item>
<Dropdown.Item>2</Dropdown.Item>
</Dropdown>
);
assert.ok(findDOMNode(instance).querySelector('.rs-dropdown-toggle.custom-toggle'));
});
it('Should have a className for placement', () => {
const instance = ReactTestUtils.renderIntoDocument(
<Dropdown placement="topStart">
<Dropdown.Item>1</Dropdown.Item>
<Dropdown.Item>2</Dropdown.Item>
</Dropdown>
);
assert.include(findDOMNode(instance).className, 'rs-dropdown-placement-top-start');
});
it('Should have a title', () => {
const instance = ReactTestUtils.renderIntoDocument(
<Dropdown title="abc">
<Dropdown.Item eventKey={1}>1</Dropdown.Item>
<Dropdown.Item eventKey={2}>2</Dropdown.Item>
</Dropdown>
);
assert.equal(innerText(findDOMNode(instance).querySelector('.rs-dropdown-toggle')), 'abc');
});
it('Should render custom component', () => {
const instance = ReactTestUtils.renderIntoDocument(<Dropdown toggleComponentClass={'div'} />);
assert.equal(findDOMNode(instance).querySelector('.rs-dropdown-toggle').tagName, 'DIV');
});
it('Should render a Button', () => {
const instance = ReactTestUtils.renderIntoDocument(
<Dropdown toggleComponentClass={Button} size="xs" appearance="link" />
);
const toggle = findDOMNode(instance).querySelector('.rs-dropdown-toggle');
assert.include(toggle.className, 'rs-btn-link');
assert.include(toggle.className, 'rs-btn-xs');
assert.equal(toggle.tagName, 'A');
});
it('Should not show caret', () => {
const instance = ReactTestUtils.renderIntoDocument(<Dropdown noCaret />);
assert.ok(!findDOMNode(instance).querySelector('.rs-dropdown-toggle-caret'));
});
it('Should call onSelect callback', done => {
const doneOp = eventKey => {
if (eventKey === 2) {
done();
}
};
const instance = ReactTestUtils.renderIntoDocument(
<Dropdown onSelect={doneOp}>
<Dropdown.Item eventKey={1}>1</Dropdown.Item>
<Dropdown.Item eventKey={2}>2</Dropdown.Item>
</Dropdown>
);
ReactTestUtils.Simulate.click(findDOMNode(instance).querySelectorAll('.rs-dropdown-menu a')[1]);
});
it('Should call onToggle callback', done => {
const doneOp = () => {
done();
};
const instance = ReactTestUtils.renderIntoDocument(
<Dropdown onToggle={doneOp}>
<Dropdown.Item eventKey={1}>1</Dropdown.Item>
<Dropdown.Item eventKey={2}>2</Dropdown.Item>
</Dropdown>
);
ReactTestUtils.Simulate.click(findDOMNode(instance).querySelector('.rs-dropdown-toggle'));
});
it('Should call onOpen callback', done => {
const doneOp = () => {
done();
};
const instance = ReactTestUtils.renderIntoDocument(
<Dropdown onOpen={doneOp}>
<Dropdown.Item eventKey={1}>1</Dropdown.Item>
<Dropdown.Item eventKey={2}>2</Dropdown.Item>
</Dropdown>
);
ReactTestUtils.Simulate.click(findDOMNode(instance).querySelector('.rs-dropdown-toggle'));
});
it('Should call onClose callback', done => {
const doneOp = () => {
done();
};
const instance = ReactTestUtils.renderIntoDocument(
<Dropdown onClose={doneOp}>
<Dropdown.Item eventKey={1}>1</Dropdown.Item>
<Dropdown.Item eventKey={2}>2</Dropdown.Item>
</Dropdown>
);
const btn = findDOMNode(instance).querySelector('.rs-dropdown-toggle');
ReactTestUtils.Simulate.click(btn);
ReactTestUtils.Simulate.click(btn);
});
it('Should not call onToggle callback when set disabled', () => {
const onToggleSpy = sinon.spy();
const instance = ReactTestUtils.renderIntoDocument(
<Dropdown onToggle={onToggleSpy} disabled>
<Dropdown.Item eventKey={1}>1</Dropdown.Item>
<Dropdown.Item eventKey={2}>2</Dropdown.Item>
</Dropdown>
);
ReactTestUtils.Simulate.click(findDOMNode(instance).querySelector('.rs-dropdown-toggle'));
assert.ok(!onToggleSpy.calledOnce);
});
it('Should have a custom style in Menu', () => {
const fontSize = '12px';
const instance = ReactTestUtils.renderIntoDocument(<Dropdown menuStyle={{ fontSize }} />);
assert.equal(findDOMNode(instance).querySelector('.rs-dropdown-menu').style.fontSize, fontSize);
});
it('Should have a custom className', () => {
const instance = ReactTestUtils.renderIntoDocument(<Dropdown className="custom" />);
assert.include(findDOMNode(instance).className, 'custom');
});
it('Should have a custom style', () => {
const fontSize = '12px';
const instance = ReactTestUtils.renderIntoDocument(<Dropdown style={{ fontSize }} />);
assert.equal(findDOMNode(instance).style.fontSize, fontSize);
});
it('Should have a custom className prefix', () => {
const instance = ReactTestUtils.renderIntoDocument(<Dropdown classPrefix="custom-prefix" />);
assert.ok(findDOMNode(instance).className.match(/\bcustom-prefix\b/));
});
});