172 lines
4.6 KiB
JavaScript
172 lines
4.6 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()
|
|
})
|
|
})
|
|
})
|