194 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			194 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
| import Vue from 'vue';
 | |
| import { mount } from '@vue/test-utils';
 | |
| import { asyncExpect } from '@/tests/utils';
 | |
| import Table from '..';
 | |
| 
 | |
| 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 getTableOptions(props = {}, columnProps = {}, listeners = {}) {
 | |
|     return {
 | |
|       propsData: {
 | |
|         columns: [
 | |
|           {
 | |
|             ...column,
 | |
|             ...columnProps,
 | |
|           },
 | |
|         ],
 | |
|         dataSource: data,
 | |
|         pagination: false,
 | |
|         ...props,
 | |
|       },
 | |
|       listeners: {
 | |
|         ...listeners,
 | |
|       },
 | |
|       sync: false,
 | |
|       attachedToDocument: true,
 | |
|     };
 | |
|   }
 | |
| 
 | |
|   function renderedNames(wrapper) {
 | |
|     return wrapper.findAll({ name: 'TableRow' }).wrappers.map(row => {
 | |
|       return row.props().record.name;
 | |
|     });
 | |
|   }
 | |
| 
 | |
|   it('renders sorter icon correctly', done => {
 | |
|     const wrapper = mount(Table, getTableOptions());
 | |
|     Vue.nextTick(() => {
 | |
|       expect(wrapper.find('thead').html()).toMatchSnapshot();
 | |
|       done();
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('default sort order ascend', done => {
 | |
|     const wrapper = mount(
 | |
|       Table,
 | |
|       getTableOptions(
 | |
|         {},
 | |
|         {
 | |
|           defaultSortOrder: 'ascend',
 | |
|         },
 | |
|       ),
 | |
|     );
 | |
|     Vue.nextTick(() => {
 | |
|       expect(renderedNames(wrapper)).toEqual(['Jack', 'Jerry', 'Lucy', 'Tom']);
 | |
|       done();
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('default sort order descend', done => {
 | |
|     const wrapper = mount(
 | |
|       Table,
 | |
|       getTableOptions(
 | |
|         {},
 | |
|         {
 | |
|           defaultSortOrder: 'descend',
 | |
|         },
 | |
|       ),
 | |
|     );
 | |
|     Vue.nextTick(() => {
 | |
|       expect(renderedNames(wrapper)).toEqual(['Tom', 'Lucy', 'Jack', 'Jerry']);
 | |
|       done();
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('sort records', async () => {
 | |
|     const wrapper = mount(Table, getTableOptions());
 | |
|     await asyncExpect(() => {
 | |
|       // descent
 | |
|       wrapper.find('.ant-table-column-sorters').trigger('click');
 | |
|     });
 | |
|     await asyncExpect(() => {
 | |
|       expect(wrapper.find('.ant-table-tbody').text()).toEqual(
 | |
|         ['Jack', 'Jerry', 'Lucy', 'Tom'].join(''),
 | |
|       );
 | |
| 
 | |
|       // ascent
 | |
|       wrapper.find('.ant-table-column-sorters').trigger('click');
 | |
|     });
 | |
|     await asyncExpect(() => {
 | |
|       expect(wrapper.find('.ant-table-tbody').text()).toEqual(
 | |
|         ['Tom', 'Lucy', 'Jack', 'Jerry'].join(''),
 | |
|       );
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('can be controlled by sortOrder', done => {
 | |
|     const wrapper = mount(
 | |
|       Table,
 | |
|       getTableOptions({
 | |
|         columns: [{ ...column, sortOrder: 'ascend' }],
 | |
|       }),
 | |
|     );
 | |
|     Vue.nextTick(() => {
 | |
|       expect(renderedNames(wrapper)).toEqual(['Jack', 'Jerry', 'Lucy', 'Tom']);
 | |
|       done();
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('fires change event', async () => {
 | |
|     const handleChange = jest.fn();
 | |
|     const wrapper = mount(Table, getTableOptions({}, {}, { change: handleChange }));
 | |
| 
 | |
|     wrapper.find('.ant-table-column-sorters').trigger('click');
 | |
|     await asyncExpect(() => {
 | |
|       const sorter1 = handleChange.mock.calls[0][2];
 | |
|       expect(sorter1.column.dataIndex).toBe('name');
 | |
|       expect(sorter1.order).toBe('ascend');
 | |
|       expect(sorter1.field).toBe('name');
 | |
|       expect(sorter1.columnKey).toBe('name');
 | |
|     });
 | |
|     wrapper.find('.ant-table-column-sorters').trigger('click');
 | |
|     await asyncExpect(() => {
 | |
|       const sorter2 = handleChange.mock.calls[1][2];
 | |
|       expect(sorter2.column.dataIndex).toBe('name');
 | |
|       expect(sorter2.order).toBe('descend');
 | |
|       expect(sorter2.field).toBe('name');
 | |
|       expect(sorter2.columnKey).toBe('name');
 | |
|     });
 | |
| 
 | |
|     wrapper.find('.ant-table-column-sorters').trigger('click');
 | |
|     await asyncExpect(() => {
 | |
|       const sorter3 = handleChange.mock.calls[2][2];
 | |
|       expect(sorter3.column).toBe(undefined);
 | |
|       expect(sorter3.order).toBe(undefined);
 | |
|       expect(sorter3.field).toBe(undefined);
 | |
|       expect(sorter3.columnKey).toBe(undefined);
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   it('works with grouping columns in controlled mode', done => {
 | |
|     const columns = [
 | |
|       {
 | |
|         title: 'group',
 | |
|         key: 'group',
 | |
|         children: [
 | |
|           {
 | |
|             title: 'Name',
 | |
|             dataIndex: 'name',
 | |
|             key: 'name',
 | |
|             sorter: sorterFn,
 | |
|             sortOrder: 'descend',
 | |
|           },
 | |
|           {
 | |
|             title: 'Age',
 | |
|             dataIndex: 'age',
 | |
|             key: 'age',
 | |
|           },
 | |
|         ],
 | |
|       },
 | |
|     ];
 | |
|     const testData = [
 | |
|       { key: 0, name: 'Jack', age: 11 },
 | |
|       { key: 1, name: 'Lucy', age: 20 },
 | |
|       { key: 2, name: 'Tom', age: 21 },
 | |
|       { key: 3, name: 'Jerry', age: 22 },
 | |
|     ];
 | |
|     const wrapper = mount(Table, {
 | |
|       propsData: {
 | |
|         columns,
 | |
|         dataSource: testData,
 | |
|       },
 | |
|       sync: false,
 | |
|     });
 | |
|     Vue.nextTick(() => {
 | |
|       expect(renderedNames(wrapper)).toEqual(['Tom', 'Lucy', 'Jack', 'Jerry']);
 | |
|       done();
 | |
|     });
 | |
|   });
 | |
| });
 |