console\.log\('hello world'\)<\/div>/);
+ });
+});
diff --git a/components/progress/__tests__/demo.test.js b/components/progress/__tests__/demo.test.js
new file mode 100644
index 0000000000..6beec6e434
--- /dev/null
+++ b/components/progress/__tests__/demo.test.js
@@ -0,0 +1,3 @@
+import demoTest from '../../../tests/shared/demoTest';
+
+demoTest('progress');
diff --git a/components/radio/__tests__/demo.test.js b/components/radio/__tests__/demo.test.js
new file mode 100644
index 0000000000..80dd304410
--- /dev/null
+++ b/components/radio/__tests__/demo.test.js
@@ -0,0 +1,3 @@
+import demoTest from '../../../tests/shared/demoTest';
+
+demoTest('radio');
diff --git a/components/radio/__tests__/group.test.js b/components/radio/__tests__/group.test.js
new file mode 100644
index 0000000000..4ad4ebaaf5
--- /dev/null
+++ b/components/radio/__tests__/group.test.js
@@ -0,0 +1,26 @@
+import React from 'react';
+import { shallow } from 'enzyme';
+import Radio from '../radio';
+import RadioGroup from '../group';
+
+describe('Radio', () => {
+ it('responses hover events', () => {
+ const onMouseEnter = jest.fn();
+ const onMouseLeave = jest.fn();
+
+ const wrapper = shallow(
+
+
+
+ );
+
+ wrapper.simulate('mouseenter');
+ expect(onMouseEnter).toHaveBeenCalled();
+
+ wrapper.simulate('mouseleave');
+ expect(onMouseLeave).toHaveBeenCalled();
+ });
+});
diff --git a/components/radio/__tests__/radio.test.js b/components/radio/__tests__/radio.test.js
new file mode 100644
index 0000000000..34746a84c5
--- /dev/null
+++ b/components/radio/__tests__/radio.test.js
@@ -0,0 +1,23 @@
+import React from 'react';
+import { shallow } from 'enzyme';
+import Radio from '../radio';
+
+describe('Radio', () => {
+ it('responses hover events', () => {
+ const onMouseEnter = jest.fn();
+ const onMouseLeave = jest.fn();
+
+ const wrapper = shallow(
+
+ );
+
+ wrapper.simulate('mouseenter');
+ expect(onMouseEnter).toHaveBeenCalled();
+
+ wrapper.simulate('mouseleave');
+ expect(onMouseLeave).toHaveBeenCalled();
+ });
+});
diff --git a/components/rate/__tests__/demo.test.js b/components/rate/__tests__/demo.test.js
new file mode 100644
index 0000000000..ddc04f61fd
--- /dev/null
+++ b/components/rate/__tests__/demo.test.js
@@ -0,0 +1,3 @@
+import demoTest from '../../../tests/shared/demoTest';
+
+demoTest('rate');
diff --git a/components/select/__tests__/demo.test.js b/components/select/__tests__/demo.test.js
new file mode 100644
index 0000000000..80444be801
--- /dev/null
+++ b/components/select/__tests__/demo.test.js
@@ -0,0 +1,3 @@
+import demoTest from '../../../tests/shared/demoTest';
+
+demoTest('select');
diff --git a/components/slider/__tests__/demo.test.js b/components/slider/__tests__/demo.test.js
new file mode 100644
index 0000000000..53042e86ef
--- /dev/null
+++ b/components/slider/__tests__/demo.test.js
@@ -0,0 +1,3 @@
+import demoTest from '../../../tests/shared/demoTest';
+
+demoTest('slider');
diff --git a/components/spin/__tests__/demo.test.js b/components/spin/__tests__/demo.test.js
new file mode 100644
index 0000000000..92b2ef7f3e
--- /dev/null
+++ b/components/spin/__tests__/demo.test.js
@@ -0,0 +1,3 @@
+import demoTest from '../../../tests/shared/demoTest';
+
+demoTest('spin');
diff --git a/components/steps/__tests__/demo.test.js b/components/steps/__tests__/demo.test.js
new file mode 100644
index 0000000000..4240dd9ddd
--- /dev/null
+++ b/components/steps/__tests__/demo.test.js
@@ -0,0 +1,3 @@
+import demoTest from '../../../tests/shared/demoTest';
+
+demoTest('steps');
diff --git a/components/switch/__tests__/demo.test.js b/components/switch/__tests__/demo.test.js
new file mode 100644
index 0000000000..212cd1b8ba
--- /dev/null
+++ b/components/switch/__tests__/demo.test.js
@@ -0,0 +1,3 @@
+import demoTest from '../../../tests/shared/demoTest';
+
+demoTest('switch');
diff --git a/components/table/__tests__/SelectionBox.test.js b/components/table/__tests__/SelectionBox.test.js
new file mode 100644
index 0000000000..6b501d4f3b
--- /dev/null
+++ b/components/table/__tests__/SelectionBox.test.js
@@ -0,0 +1,87 @@
+import React from 'react';
+import { mount } from 'enzyme';
+import createStore from '../createStore';
+import SelectionBox from '../SelectionBox';
+
+describe('SelectionBox', () => {
+ it('unchecked by selectedRowKeys ', () => {
+ const store = createStore({
+ selectedRowKeys: [],
+ selectionDirty: false,
+ });
+
+ const wrapper = mount(
+
{}}
+ defaultSelection={[]}
+ />
+ );
+
+ expect(wrapper.state()).toEqual({ checked: false });
+ });
+
+ it('checked by selectedRowKeys ', () => {
+ const store = createStore({
+ selectedRowKeys: ['1'],
+ selectionDirty: false,
+ });
+
+ const wrapper = mount(
+ {}}
+ defaultSelection={[]}
+ />
+ );
+
+ expect(wrapper.state()).toEqual({ checked: true });
+ });
+
+ it('checked by defaultSelection', () => {
+ const store = createStore({
+ selectedRowKeys: [],
+ selectionDirty: false,
+ });
+
+ const wrapper = mount(
+ {}}
+ defaultSelection={['1']}
+ />
+ );
+
+ expect(wrapper.state()).toEqual({ checked: true });
+ });
+
+ it('checked when store change', () => {
+ const store = createStore({
+ selectedRowKeys: [],
+ selectionDirty: false,
+ });
+
+ const wrapper = mount(
+ {}}
+ defaultSelection={[]}
+ />
+ );
+
+ store.setState({
+ selectedRowKeys: ['1'],
+ selectionDirty: true,
+ });
+
+ expect(wrapper.state()).toEqual({ checked: true });
+ });
+});
diff --git a/components/table/__tests__/Table.filter.test.js b/components/table/__tests__/Table.filter.test.js
new file mode 100644
index 0000000000..60ee846626
--- /dev/null
+++ b/components/table/__tests__/Table.filter.test.js
@@ -0,0 +1,141 @@
+import React from 'react';
+import { render, mount } from 'enzyme';
+import { renderToJson } from 'enzyme-to-json';
+import Table from '../table';
+
+describe('Table.filter', () => {
+ const filterFn = (value, record) => record.name === 'Lucy';
+ const column = {
+ title: 'Name',
+ dataIndex: 'name',
+ filters: [
+ { text: 'Boy', value: 'boy' },
+ { text: 'Girl', value: 'girl' },
+ {
+ text: 'Title',
+ value: 'title',
+ children: [
+ { text: 'Designer', value: 'designer' },
+ { text: 'Coder', value: 'coder' },
+ ],
+ },
+ ],
+ onFilter: filterFn,
+ };
+
+ const data = [
+ { key: 0, name: 'Jack' },
+ { key: 1, name: 'Lucy' },
+ { key: 2, name: 'Tom' },
+ { key: 3, name: 'Jerry' },
+ ];
+
+ function createTable(props) {
+ return (
+
+ );
+ }
+
+ it('renders filter correctly', () => {
+ const wrapper = render(createTable());
+
+ expect(renderToJson(wrapper)).toMatchSnapshot();
+ });
+
+ it('renders menu correctly', () => {
+ const wrapper = mount(createTable());
+ const dropdownWrapper = render(wrapper.find('Trigger').node.getComponent());
+ expect(renderToJson(dropdownWrapper)).toMatchSnapshot();
+ });
+
+ it('renders radio filter correctly', () => {
+ const wrapper = mount(createTable({
+ columns: [{
+ ...column,
+ filterMultiple: false,
+ }],
+ }));
+ const dropdownWrapper = render(wrapper.find('Trigger').node.getComponent());
+ expect(renderToJson(dropdownWrapper)).toMatchSnapshot();
+ });
+
+ it('renders custom content correctly', () => {
+ const filter = (
+
+ custom filter
+
+ );
+ const wrapper = mount(createTable({
+ columns: [{
+ ...column,
+ filterDropdown: filter,
+ }],
+ }));
+
+ const dropdownWrapper = render(wrapper.find('Trigger').node.getComponent());
+ expect(renderToJson(dropdownWrapper)).toMatchSnapshot();
+ });
+
+ it('can be controlled by filterDropdownVisible', () => {
+ const wrapper = mount(createTable({
+ columns: [{
+ ...column,
+ filterDropdownVisible: true,
+ }],
+ }));
+ const dropdown = wrapper.find('Dropdown').first();
+
+ expect(dropdown.props().visible).toBe(true);
+ wrapper.setProps({ columns: [{
+ ...column,
+ filterDropdownVisible: false,
+ }] });
+ expect(dropdown.props().visible).toBe(false);
+ });
+
+ it('fires change event when visible change', () => {
+ const handleChange = jest.fn();
+ const wrapper = mount(createTable({
+ columns: [{
+ ...column,
+ onFilterDropdownVisibleChange: handleChange,
+ }],
+ }));
+
+ wrapper.find('Dropdown').first().simulate('click');
+
+ expect(handleChange).toBeCalledWith(true);
+ });
+
+ it('can be controlled by filteredValue', () => {
+ const wrapper = mount(createTable({
+ columns: [{
+ ...column,
+ filteredValue: ['girl'],
+ }],
+ }));
+
+ expect(wrapper.find('tbody tr').length).toBe(1);
+ wrapper.setProps({ columns: [{
+ ...column,
+ filteredValue: [],
+ }] });
+ expect(wrapper.find('tbody tr').length).toBe(4);
+ });
+
+ it('fires change event', () => {
+ const handleChange = jest.fn();
+ const wrapper = mount(createTable({ onChange: handleChange }));
+ const dropdownWrapper = mount(wrapper.find('Trigger').node.getComponent());
+
+ dropdownWrapper.find('MenuItem').first().simulate('click');
+ dropdownWrapper.find('.confirm').simulate('click');
+
+ expect(handleChange).toBeCalledWith({}, { name: ['boy'] }, {});
+ });
+});
diff --git a/components/table/__tests__/Table.pagination.test.js b/components/table/__tests__/Table.pagination.test.js
new file mode 100644
index 0000000000..e9ac7fe52c
--- /dev/null
+++ b/components/table/__tests__/Table.pagination.test.js
@@ -0,0 +1,78 @@
+import React from 'react';
+import { render, mount } from 'enzyme';
+import { renderToJson } from 'enzyme-to-json';
+import Table from '../table';
+
+describe('Table.pagination', () => {
+ const columns = [{
+ title: 'Name',
+ dataIndex: 'name',
+ }];
+
+ const data = [
+ { key: 0, name: 'Jack' },
+ { key: 1, name: 'Lucy' },
+ { key: 2, name: 'Tom' },
+ { key: 3, name: 'Jerry' },
+ ];
+
+ const pagination = { pageSize: 2 };
+
+ function createTable(props) {
+ return (
+
+ );
+ }
+
+ function renderedNames(wrapper) {
+ return wrapper.find('TableRow').map(row => row.props().record.name);
+ }
+
+ it('renders pagination correctly', () => {
+ const wrapper = render(createTable());
+ expect(renderToJson(wrapper)).toMatchSnapshot();
+ });
+
+ it('paginate data', () => {
+ const wrapper = mount(createTable());
+
+ expect(renderedNames(wrapper)).toEqual(['Jack', 'Lucy']);
+ wrapper.find('Pager').last().simulate('click');
+ expect(renderedNames(wrapper)).toEqual(['Tom', 'Jerry']);
+ });
+
+
+ it('repaginates when pageSize change', () => {
+ const wrapper = mount(createTable());
+
+ wrapper.setProps({ pagination: { pageSize: 1 } });
+ expect(renderedNames(wrapper)).toEqual(['Jack']);
+ });
+
+ it('fires change event', () => {
+ const handleChange = jest.fn();
+ const noop = () => {};
+ const wrapper = mount(createTable({
+ pagination: { ...pagination, onChange: noop, onShowSizeChange: noop },
+ onChange: handleChange,
+ }));
+
+ wrapper.find('Pager').last().simulate('click');
+
+ expect(handleChange).toBeCalledWith(
+ {
+ current: 2,
+ onChange: noop,
+ onShowSizeChange: noop,
+ pageSize: 2,
+ },
+ {},
+ {}
+ );
+ });
+});
diff --git a/components/table/__tests__/Table.rowSelection.test.js b/components/table/__tests__/Table.rowSelection.test.js
new file mode 100644
index 0000000000..7ac98b2b76
--- /dev/null
+++ b/components/table/__tests__/Table.rowSelection.test.js
@@ -0,0 +1,166 @@
+import React from 'react';
+import { mount } from 'enzyme';
+import Table from '../table';
+
+describe('Table.rowSelection', () => {
+ const columns = [{
+ title: 'Name',
+ dataIndex: 'name',
+ }];
+
+ const data = [
+ { key: 0, name: 'Jack' },
+ { key: 1, name: 'Lucy' },
+ { key: 2, name: 'Tom' },
+ { key: 3, name: 'Jerry' },
+ ];
+
+ function createTable(props = {}) {
+ return (
+
+ );
+ }
+
+ it('select by checkbox', () => {
+ const wrapper = mount(createTable());
+ const checkboxes = wrapper.find('input');
+ const checkboxAll = checkboxes.first();
+
+ checkboxAll.simulate('change', { target: { checked: true } });
+ expect(wrapper.instance().store.getState()).toEqual({
+ selectedRowKeys: [0, 1, 2, 3],
+ selectionDirty: true,
+ });
+
+ checkboxes.at(1).simulate('change', { target: { checked: false } });
+ expect(wrapper.instance().store.getState()).toEqual({
+ selectedRowKeys: [1, 2, 3],
+ selectionDirty: true,
+ });
+
+ checkboxes.at(1).simulate('change', { target: { checked: true } });
+ expect(wrapper.instance().store.getState()).toEqual({
+ selectedRowKeys: [1, 2, 3, 0],
+ selectionDirty: true,
+ });
+ });
+
+ it('select by radio', () => {
+ const wrapper = mount(createTable({ rowSelection: { type: 'radio' } }));
+ const radios = wrapper.find('input');
+
+ expect(radios.length).toBe(4);
+
+ radios.first().simulate('change', { target: { checked: true } });
+ expect(wrapper.instance().store.getState()).toEqual({
+ selectedRowKeys: [0],
+ selectionDirty: true,
+ });
+
+ radios.last().simulate('change', { target: { checked: true } });
+ expect(wrapper.instance().store.getState()).toEqual({
+ selectedRowKeys: [3],
+ selectionDirty: true,
+ });
+ });
+
+ it('pass getCheckboxProps to checkbox', () => {
+ const rowSelection = {
+ getCheckboxProps: record => ({
+ disabled: record.name === 'Lucy',
+ }),
+ };
+
+ const wrapper = mount(createTable({ rowSelection }));
+ const checkboxes = wrapper.find('input');
+
+ expect(checkboxes.at(1).props().disabled).toBe(false);
+ expect(checkboxes.at(2).props().disabled).toBe(true);
+ });
+
+ it('works with pagination', () => {
+ const wrapper = mount(createTable({ pagination: { pageSize: 2 } }));
+
+ const checkboxAll = wrapper.find('SelectionCheckboxAll');
+ const pagers = wrapper.find('Pager');
+
+ checkboxAll.find('input').simulate('change', { target: { checked: true } });
+ expect(checkboxAll.node.state).toEqual({ checked: true, indeterminate: false });
+
+ pagers.at(1).simulate('click');
+ expect(checkboxAll.node.state).toEqual({ checked: false, indeterminate: false });
+
+ pagers.at(0).simulate('click');
+ expect(checkboxAll.node.state).toEqual({ checked: true, indeterminate: false });
+ });
+
+ // https://github.com/ant-design/ant-design/issues/4020
+ it('handles defaultChecked', () => {
+ const rowSelection = {
+ getCheckboxProps: record => ({
+ defaultChecked: record.key === 0,
+ }),
+ };
+
+ const wrapper = mount(createTable({ rowSelection }));
+
+ const checkboxs = wrapper.find('input');
+ expect(checkboxs.at(1).props().checked).toBe(true);
+ expect(checkboxs.at(2).props().checked).toBe(false);
+
+ checkboxs.at(2).simulate('change', { target: { checked: true } });
+ expect(checkboxs.at(1).props().checked).toBe(true);
+ expect(checkboxs.at(2).props().checked).toBe(true);
+ });
+
+ it('can be controlled', () => {
+ const wrapper = mount(createTable({ rowSelection: { selectedRowKeys: [0] } }));
+
+ expect(wrapper.instance().store.getState()).toEqual({
+ selectedRowKeys: [0],
+ selectionDirty: false,
+ });
+
+ wrapper.setProps({ rowSelection: { selectedRowKeys: [1] } });
+
+ expect(wrapper.instance().store.getState()).toEqual({
+ selectedRowKeys: [1],
+ selectionDirty: false,
+ });
+ });
+
+ it('fires change & select events', () => {
+ const handleChange = jest.fn();
+ const handleSelect = jest.fn();
+ const rowSelection = {
+ onChange: handleChange,
+ onSelect: handleSelect,
+ };
+ const wrapper = mount(createTable({ rowSelection }));
+
+ wrapper.find('input').last().simulate('change', { target: { checked: true } });
+
+ expect(handleChange).toBeCalledWith([3], [{ key: 3, name: 'Jerry' }]);
+ expect(handleSelect).toBeCalledWith(
+ { key: 3, name: 'Jerry' },
+ true,
+ [{ key: 3, name: 'Jerry' }]
+ );
+ });
+
+ it('fires selectAll event', () => {
+ const handleSelectAll = jest.fn();
+ const rowSelection = {
+ onSelectAll: handleSelectAll,
+ };
+ const wrapper = mount(createTable({ rowSelection }));
+
+ wrapper.find('input').first().simulate('change', { target: { checked: true } });
+ expect(handleSelectAll).toBeCalledWith(true, data, data);
+ });
+});
diff --git a/components/table/__tests__/Table.sorter.test.js b/components/table/__tests__/Table.sorter.test.js
new file mode 100644
index 0000000000..1680379305
--- /dev/null
+++ b/components/table/__tests__/Table.sorter.test.js
@@ -0,0 +1,71 @@
+import React from 'react';
+import { render, mount } from 'enzyme';
+import { renderToJson } from 'enzyme-to-json';
+import Table from '../table';
+
+describe('Table.sorter', () => {
+ const sorterFn = (a, b) => a.name[0].charCodeAt() - b.name[0].charCodeAt();
+
+ const column = {
+ title: 'Name',
+ dataIndex: 'name',
+ sorter: sorterFn,
+ };
+
+ const data = [
+ { key: 0, name: 'Jack' },
+ { key: 1, name: 'Lucy' },
+ { key: 2, name: 'Tom' },
+ { key: 3, name: 'Jerry' },
+ ];
+
+ function createTable(props) {
+ return (
+
+ );
+ }
+
+ function renderedNames(wrapper) {
+ return wrapper.find('TableRow').map(row => row.props().record.name);
+ }
+
+ it('renders sorter icon correctly', () => {
+ const wrapper = render(createTable());
+ expect(renderToJson(wrapper.find('thead'))).toMatchSnapshot();
+ });
+
+ it('sort records', () => {
+ const wrapper = mount(createTable());
+
+ wrapper.find('.ant-table-column-sorter-up').simulate('click');
+ expect(renderedNames(wrapper)).toEqual(['Jack', 'Jerry', 'Lucy', 'Tom']);
+
+ wrapper.find('.ant-table-column-sorter-down').simulate('click');
+ expect(renderedNames(wrapper)).toEqual(['Tom', 'Lucy', 'Jack', 'Jerry']);
+ });
+
+ it('can be controlled by sortOrder', () => {
+ const wrapper = mount(createTable({
+ columns: [{ ...column, sortOrder: 'ascend' }],
+ }));
+ expect(renderedNames(wrapper)).toEqual(['Jack', 'Jerry', 'Lucy', 'Tom']);
+ });
+
+ it('fires change event', () => {
+ const handleChange = jest.fn();
+ const wrapper = mount(createTable({ onChange: handleChange }));
+
+ wrapper.find('.ant-table-column-sorter-up').simulate('click');
+
+ const sorter = handleChange.mock.calls[0][2];
+ expect(sorter.column.dataIndex).toBe('name');
+ expect(sorter.order).toBe('ascend');
+ expect(sorter.field).toBe('name');
+ expect(sorter.columnKey).toBe('name');
+ });
+});
diff --git a/components/table/__tests__/Table.test.js b/components/table/__tests__/Table.test.js
new file mode 100644
index 0000000000..fc5778d078
--- /dev/null
+++ b/components/table/__tests__/Table.test.js
@@ -0,0 +1,63 @@
+import React from 'react';
+import { render, shallow } from 'enzyme';
+import { renderToJson } from 'enzyme-to-json';
+import Table from '../table';
+
+const { Column, ColumnGroup } = Table;
+
+describe('Table', () => {
+ it('renders JSX correctly', () => {
+ const data = [{
+ key: '1',
+ firstName: 'John',
+ lastName: 'Brown',
+ age: 32,
+ }, {
+ key: '2',
+ firstName: 'Jim',
+ lastName: 'Green',
+ age: 42,
+ }];
+
+ const wrapper = render(
+
+ );
+
+ expect(renderToJson(wrapper)).toMatchSnapshot();
+ });
+
+ it('updates columns when receiving props', () => {
+ const columns = [{
+ title: 'Name',
+ key: 'name',
+ dataIndex: 'name',
+ }];
+ const wrapper = shallow();
+ const newColumns = [{
+ title: 'Title',
+ key: 'title',
+ dataIndex: 'title',
+ }];
+ wrapper.setProps({ columns: newColumns });
+
+ expect(wrapper.instance().columns).toBe(newColumns);
+ });
+});
diff --git a/components/table/__tests__/demo.test.js b/components/table/__tests__/demo.test.js
new file mode 100644
index 0000000000..6e3d96d1b2
--- /dev/null
+++ b/components/table/__tests__/demo.test.js
@@ -0,0 +1,3 @@
+import demoTest from '../../../tests/shared/demoTest';
+
+demoTest('table');
diff --git a/components/tabs/__tests__/demo.test.js b/components/tabs/__tests__/demo.test.js
new file mode 100644
index 0000000000..c991dd50dd
--- /dev/null
+++ b/components/tabs/__tests__/demo.test.js
@@ -0,0 +1,3 @@
+import demoTest from '../../../tests/shared/demoTest';
+
+demoTest('tabs');
diff --git a/components/tag/__tests__/demo.test.js b/components/tag/__tests__/demo.test.js
new file mode 100644
index 0000000000..826b8a9d2e
--- /dev/null
+++ b/components/tag/__tests__/demo.test.js
@@ -0,0 +1,3 @@
+import demoTest from '../../../tests/shared/demoTest';
+
+demoTest('tag');
diff --git a/components/time-picker/__tests__/demo.test.js b/components/time-picker/__tests__/demo.test.js
new file mode 100644
index 0000000000..26bc8764c9
--- /dev/null
+++ b/components/time-picker/__tests__/demo.test.js
@@ -0,0 +1,3 @@
+import demoTest from '../../../tests/shared/demoTest';
+
+demoTest('time-picker');
diff --git a/components/time-picker/__tests__/index.test.js b/components/time-picker/__tests__/index.test.js
new file mode 100644
index 0000000000..6b0dedb336
--- /dev/null
+++ b/components/time-picker/__tests__/index.test.js
@@ -0,0 +1,16 @@
+import React from 'react';
+import { mount, render } from 'enzyme';
+import { renderToJson } from 'enzyme-to-json';
+import RcTimePicker from 'rc-time-picker/lib/TimePicker';
+import TimePicker from '..';
+
+describe('TimePicker', () => {
+ it('renders addon correctly', () => {
+ const addon = () => ();
+ const wrapper = mount();
+ const rcTimePicker = wrapper.find(RcTimePicker);
+ const addonWrapper = render(rcTimePicker.props().addon());
+
+ expect(renderToJson(addonWrapper)).toMatchSnapshot();
+ });
+});
diff --git a/components/timeline/__tests__/demo.test.js b/components/timeline/__tests__/demo.test.js
new file mode 100644
index 0000000000..c3607e93b6
--- /dev/null
+++ b/components/timeline/__tests__/demo.test.js
@@ -0,0 +1,3 @@
+import demoTest from '../../../tests/shared/demoTest';
+
+demoTest('timeline');
diff --git a/components/tooltip/__tests__/demo.test.js b/components/tooltip/__tests__/demo.test.js
new file mode 100644
index 0000000000..2ebb359ed9
--- /dev/null
+++ b/components/tooltip/__tests__/demo.test.js
@@ -0,0 +1,3 @@
+import demoTest from '../../../tests/shared/demoTest';
+
+demoTest('tooltip');
diff --git a/components/transfer/__tests__/demo.test.js b/components/transfer/__tests__/demo.test.js
new file mode 100644
index 0000000000..24d908fb42
--- /dev/null
+++ b/components/transfer/__tests__/demo.test.js
@@ -0,0 +1,3 @@
+import demoTest from '../../../tests/shared/demoTest';
+
+demoTest('transfer');
diff --git a/components/transfer/__tests__/search.test.js b/components/transfer/__tests__/search.test.js
new file mode 100644
index 0000000000..8bb27c5b6c
--- /dev/null
+++ b/components/transfer/__tests__/search.test.js
@@ -0,0 +1,16 @@
+import React from 'react';
+import { mount } from 'enzyme';
+import { mountToJson } from 'enzyme-to-json';
+import Search from '../search';
+
+describe('Search', () => {
+ it('should show cross icon when input value exists', () => {
+ const wrapper = mount();
+
+ expect(mountToJson(wrapper)).toMatchSnapshot();
+
+ wrapper.setProps({ value: 'a' });
+
+ expect(mountToJson(wrapper)).toMatchSnapshot();
+ });
+});
diff --git a/components/tree-select/__tests__/demo.test.js b/components/tree-select/__tests__/demo.test.js
new file mode 100644
index 0000000000..c59fb528de
--- /dev/null
+++ b/components/tree-select/__tests__/demo.test.js
@@ -0,0 +1,3 @@
+import demoTest from '../../../tests/shared/demoTest';
+
+demoTest('tree-select');
diff --git a/components/tree/__tests__/demo.test.js b/components/tree/__tests__/demo.test.js
new file mode 100644
index 0000000000..b7cd9eab87
--- /dev/null
+++ b/components/tree/__tests__/demo.test.js
@@ -0,0 +1,3 @@
+import demoTest from '../../../tests/shared/demoTest';
+
+demoTest('tree');
diff --git a/components/upload/__tests__/demo.test.js b/components/upload/__tests__/demo.test.js
new file mode 100644
index 0000000000..16ea9f2bde
--- /dev/null
+++ b/components/upload/__tests__/demo.test.js
@@ -0,0 +1,3 @@
+import demoTest from '../../../tests/shared/demoTest';
+
+demoTest('upload');