417 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			417 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			JavaScript
		
	
	
| 
 | |
| import { mount } from '@vue/test-utils'
 | |
| import { asyncExpect } from '@/tests/utils'
 | |
| import Table from '..'
 | |
| 
 | |
| 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 getTableOptions (props = {}, listeners = {}) {
 | |
|     return {
 | |
|       propsData: {
 | |
|         columns,
 | |
|         dataSource: data,
 | |
|         rowSelection: {},
 | |
|         ...props,
 | |
|       },
 | |
|       listeners: {
 | |
|         ...listeners,
 | |
|       },
 | |
|       sync: false,
 | |
|       attachedToDocument: true,
 | |
|     }
 | |
|   }
 | |
|   function renderedNames (wrapper) {
 | |
|     return wrapper.findAll({ name: 'TableRow' }).wrappers.map(row => {
 | |
|       return row.props().record.name
 | |
|     })
 | |
|   }
 | |
| 
 | |
|   function getStore (wrapper) {
 | |
|     return wrapper.vm._vnode.componentInstance.store
 | |
|   }
 | |
| 
 | |
|   it('select by checkbox', async () => {
 | |
|     const wrapper = mount(Table, getTableOptions())
 | |
|     const checkboxes = wrapper.findAll('input')
 | |
|     const checkboxAll = checkboxes.at(0)
 | |
|     checkboxAll.element.checked = true
 | |
|     checkboxAll.trigger('change')
 | |
|     await asyncExpect(() => {
 | |
|       expect(getStore(wrapper).getState()).toEqual({
 | |
|         selectedRowKeys: [0, 1, 2, 3],
 | |
|         selectionDirty: true,
 | |
|       })
 | |
|     })
 | |
|     checkboxes.at(1).element.checked = false
 | |
|     checkboxes.at(1).trigger('change')
 | |
|     await asyncExpect(() => {
 | |
|       expect(getStore(wrapper).getState()).toEqual({
 | |
|         selectedRowKeys: [1, 2, 3],
 | |
|         selectionDirty: true,
 | |
|       })
 | |
|     })
 | |
|     checkboxes.at(1).element.checked = true
 | |
|     checkboxes.at(1).trigger('change')
 | |
|     await asyncExpect(() => {
 | |
|       expect(getStore(wrapper).getState()).toEqual({
 | |
|         selectedRowKeys: [1, 2, 3, 0],
 | |
|         selectionDirty: true,
 | |
|       })
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   it('select by radio', async () => {
 | |
|     const wrapper = mount(Table, getTableOptions({ rowSelection: { type: 'radio' }}))
 | |
|     const radios = wrapper.findAll('input')
 | |
| 
 | |
|     expect(radios.length).toBe(4)
 | |
|     radios.at(0).element.checked = true
 | |
|     radios.at(0).trigger('change')
 | |
|     await asyncExpect(() => {
 | |
|       expect(getStore(wrapper).getState()).toEqual({
 | |
|         selectedRowKeys: [0],
 | |
|         selectionDirty: true,
 | |
|       })
 | |
|     })
 | |
|     radios.at(radios.length - 1).element.checked = true
 | |
|     radios.at(radios.length - 1).trigger('change')
 | |
|     await asyncExpect(() => {
 | |
|       expect(getStore(wrapper).getState()).toEqual({
 | |
|         selectedRowKeys: [3],
 | |
|         selectionDirty: true,
 | |
|       })
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   it('pass getCheckboxProps to checkbox', () => {
 | |
|     const rowSelection = {
 | |
|       getCheckboxProps: record => ({ props: {
 | |
|         disabled: record.name === 'Lucy',
 | |
|         name: record.name,
 | |
|       }}),
 | |
|     }
 | |
| 
 | |
|     const wrapper = mount(Table, getTableOptions({ rowSelection }))
 | |
|     const checkboxes = wrapper.findAll('input').wrappers
 | |
|     expect(checkboxes[1].vnode.data.attrs.disabled).toBe(false)
 | |
|     expect(checkboxes[1].vnode.data.attrs.name).toEqual(data[0].name)
 | |
|     expect(checkboxes[2].vnode.data.attrs.disabled).toBe(true)
 | |
|     expect(checkboxes[2].vnode.data.attrs.name).toEqual(data[1].name)
 | |
|   })
 | |
| 
 | |
|   it('works with pagination', async () => {
 | |
|     const wrapper = mount(Table, getTableOptions({ pagination: { pageSize: 2 }}))
 | |
| 
 | |
|     const checkboxAll = wrapper.find({ name: 'SelectionCheckboxAll' })
 | |
|     const pagers = wrapper.findAll({ name: 'Pager' })
 | |
|     checkboxAll.find('input').element.checked = true
 | |
|     checkboxAll.find('input').trigger('change')
 | |
|     await asyncExpect(() => {
 | |
|       expect(checkboxAll.vm.$data).toEqual({ checked: true, indeterminate: false })
 | |
|     })
 | |
|     pagers.at(1).trigger('click')
 | |
|     await asyncExpect(() => {
 | |
|       expect(checkboxAll.vm.$data).toEqual({ checked: false, indeterminate: false })
 | |
|     })
 | |
|     pagers.at(0).trigger('click')
 | |
|     await asyncExpect(() => {
 | |
|       expect(checkboxAll.vm.$data).toEqual({ checked: true, indeterminate: false })
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   // https://github.com/ant-design/ant-design/issues/4020
 | |
|   it('handles defaultChecked', async () => {
 | |
|     const rowSelection = {
 | |
|       getCheckboxProps: record => {
 | |
|         return {
 | |
|           props: {
 | |
|             defaultChecked: record.key === 0,
 | |
|           }}
 | |
|       },
 | |
|     }
 | |
| 
 | |
|     const wrapper = mount(Table, getTableOptions({ rowSelection }))
 | |
| 
 | |
|     await asyncExpect(() => {
 | |
|       const checkboxs = wrapper.findAll('input')
 | |
|       expect(checkboxs.at(1).vnode.data.domProps.checked).toBe(true)
 | |
|       expect(checkboxs.at(2).vnode.data.domProps.checked).toBe(false)
 | |
|       checkboxs.at(2).element.checked = true
 | |
|       checkboxs.at(2).trigger('change')
 | |
|     }, 0)
 | |
| 
 | |
|     await asyncExpect(() => {
 | |
|       const checkboxs = wrapper.findAll('input')
 | |
|       expect(checkboxs.at(1).vnode.data.domProps.checked).toBe(true)
 | |
|       expect(checkboxs.at(2).vnode.data.domProps.checked).toBe(true)
 | |
|     }, 1000)
 | |
|   })
 | |
| 
 | |
|   it('can be controlled', async () => {
 | |
|     const wrapper = mount(Table, getTableOptions({ rowSelection: { selectedRowKeys: [0] }}))
 | |
| 
 | |
|     expect(getStore(wrapper).getState()).toEqual({
 | |
|       selectedRowKeys: [0],
 | |
|       selectionDirty: false,
 | |
|     })
 | |
| 
 | |
|     wrapper.setProps({ rowSelection: { selectedRowKeys: [1] }})
 | |
|     await asyncExpect(() => {
 | |
|       expect(getStore(wrapper).getState()).toEqual({
 | |
|         selectedRowKeys: [1],
 | |
|         selectionDirty: false,
 | |
|       })
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   it('fires change & select events', async () => {
 | |
|     const handleChange = jest.fn()
 | |
|     const handleSelect = jest.fn()
 | |
|     const rowSelection = {
 | |
|       onChange: handleChange,
 | |
|       onSelect: handleSelect,
 | |
|     }
 | |
|     const wrapper = mount(Table, getTableOptions({ rowSelection }))
 | |
|     const checkboxs = wrapper.findAll('input')
 | |
|     checkboxs.at(checkboxs.length - 1).element.checked = true
 | |
|     checkboxs.at(checkboxs.length - 1).trigger('change')
 | |
|     await asyncExpect(() => {
 | |
|       expect(handleChange).toBeCalledWith([3], [{ key: 3, name: 'Jerry' }])
 | |
|       expect(handleSelect.mock.calls.length).toBe(1)
 | |
|       expect(handleSelect.mock.calls[0][0]).toEqual({ key: 3, name: 'Jerry' })
 | |
|       expect(handleSelect.mock.calls[0][1]).toEqual(true)
 | |
|       expect(handleSelect.mock.calls[0][2]).toEqual([{ key: 3, name: 'Jerry' }])
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   it('fires selectAll event', async () => {
 | |
|     const handleSelectAll = jest.fn()
 | |
|     const rowSelection = {
 | |
|       onSelectAll: handleSelectAll,
 | |
|     }
 | |
|     const wrapper = mount(Table, getTableOptions({ rowSelection }))
 | |
|     const checkboxs = wrapper.findAll('input')
 | |
|     checkboxs.at(0).element.checked = true
 | |
|     checkboxs.at(0).trigger('change')
 | |
|     await asyncExpect(() => {
 | |
|       expect(handleSelectAll).toBeCalledWith(true, data, data)
 | |
|     })
 | |
|     checkboxs.at(0).element.checked = false
 | |
|     checkboxs.at(0).trigger('change')
 | |
|     await asyncExpect(() => {
 | |
|       expect(handleSelectAll).toBeCalledWith(false, [], data)
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   it('render with default selection correctly', async () => {
 | |
|     const rowSelection = {
 | |
|       selections: true,
 | |
|     }
 | |
|     const wrapper = mount(Table, getTableOptions({ rowSelection }))
 | |
|     const dropdownWrapper = mount({
 | |
|       render () {
 | |
|         return wrapper.find({ name: 'Trigger' }).vm.getComponent()
 | |
|       },
 | |
|     }, { sync: false })
 | |
|     await asyncExpect(() => {
 | |
|       expect(dropdownWrapper.html()).toMatchSnapshot()
 | |
|     })
 | |
| 
 | |
|     await asyncExpect(() => {
 | |
| 
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   it('click select all selection', () => {
 | |
|     const handleSelectAll = jest.fn()
 | |
|     const rowSelection = {
 | |
|       onSelectAll: handleSelectAll,
 | |
|       selections: true,
 | |
|     }
 | |
|     const wrapper = mount(Table, getTableOptions({ rowSelection }))
 | |
| 
 | |
|     const dropdownWrapper = mount({
 | |
|       render () {
 | |
|         return wrapper.find({ name: 'Trigger' }).vm.getComponent()
 | |
|       },
 | |
|     }, { sync: false })
 | |
|     dropdownWrapper.findAll('.ant-dropdown-menu-item > div').at(0).trigger('click')
 | |
| 
 | |
|     expect(handleSelectAll).toBeCalledWith(true, data, data)
 | |
|   })
 | |
| 
 | |
|   it('fires selectInvert event', () => {
 | |
|     const handleSelectInvert = jest.fn()
 | |
|     const rowSelection = {
 | |
|       onSelectInvert: handleSelectInvert,
 | |
|       selections: true,
 | |
|     }
 | |
|     const wrapper = mount(Table, getTableOptions({ rowSelection }))
 | |
|     const checkboxes = wrapper.findAll('input')
 | |
|     checkboxes.at(1).element.checked = true
 | |
|     checkboxes.at(1).trigger('change')
 | |
|     const dropdownWrapper = mount({
 | |
|       render () {
 | |
|         return wrapper.find({ name: 'Trigger' }).vm.getComponent()
 | |
|       },
 | |
|     }, { sync: false })
 | |
|     const div = dropdownWrapper.findAll('.ant-dropdown-menu-item > div')
 | |
|     div.at(div.length - 1).trigger('click')
 | |
| 
 | |
|     expect(handleSelectInvert).toBeCalledWith([1, 2, 3])
 | |
|   })
 | |
| 
 | |
|   it('fires selection event', () => {
 | |
|     const handleSelectOdd = jest.fn()
 | |
|     const handleSelectEven = jest.fn()
 | |
|     const rowSelection = {
 | |
|       selections: [{
 | |
|         key: 'odd',
 | |
|         text: '奇数项',
 | |
|         onSelect: handleSelectOdd,
 | |
|       }, {
 | |
|         key: 'even',
 | |
|         text: '偶数项',
 | |
|         onSelect: handleSelectEven,
 | |
|       }],
 | |
|     }
 | |
|     const wrapper = mount(Table, getTableOptions({ rowSelection }))
 | |
| 
 | |
|     const dropdownWrapper = mount({
 | |
|       render () {
 | |
|         return wrapper.find({ name: 'Trigger' }).vm.getComponent()
 | |
|       },
 | |
|     }, { sync: false })
 | |
|     expect(dropdownWrapper.findAll('.ant-dropdown-menu-item').length).toBe(4)
 | |
| 
 | |
|     dropdownWrapper.findAll('.ant-dropdown-menu-item > div').at(2).trigger('click')
 | |
|     expect(handleSelectOdd).toBeCalledWith([0, 1, 2, 3])
 | |
| 
 | |
|     dropdownWrapper.findAll('.ant-dropdown-menu-item > div').at(3).trigger('click')
 | |
|     expect(handleSelectEven).toBeCalledWith([0, 1, 2, 3])
 | |
|   })
 | |
| 
 | |
|   it('could hide default selection options', () => {
 | |
|     const rowSelection = {
 | |
|       hideDefaultSelections: true,
 | |
|       selections: [{
 | |
|         key: 'odd',
 | |
|         text: '奇数项',
 | |
|       }, {
 | |
|         key: 'even',
 | |
|         text: '偶数项',
 | |
|       }],
 | |
|     }
 | |
|     const wrapper = mount(Table, getTableOptions({ rowSelection }))
 | |
|     const dropdownWrapper = mount({
 | |
|       render () {
 | |
|         return wrapper.find({ name: 'Trigger' }).vm.getComponent()
 | |
|       },
 | |
|     }, { sync: false })
 | |
|     expect(dropdownWrapper.findAll('.ant-dropdown-menu-item').length).toBe(2)
 | |
|   })
 | |
| 
 | |
|   it('handle custom selection onSelect correctly when hide default selection options', () => {
 | |
|     const handleSelectOdd = jest.fn()
 | |
|     const handleSelectEven = jest.fn()
 | |
|     const rowSelection = {
 | |
|       hideDefaultSelections: true,
 | |
|       selections: [{
 | |
|         key: 'odd',
 | |
|         text: '奇数项',
 | |
|         onSelect: handleSelectOdd,
 | |
|       }, {
 | |
|         key: 'even',
 | |
|         text: '偶数项',
 | |
|         onSelect: handleSelectEven,
 | |
|       }],
 | |
|     }
 | |
|     const wrapper = mount(Table, getTableOptions({ rowSelection }))
 | |
| 
 | |
|     const dropdownWrapper = mount({
 | |
|       render () {
 | |
|         return wrapper.find({ name: 'Trigger' }).vm.getComponent()
 | |
|       },
 | |
|     }, { sync: false })
 | |
|     expect(dropdownWrapper.findAll('.ant-dropdown-menu-item').length).toBe(2)
 | |
| 
 | |
|     dropdownWrapper.findAll('.ant-dropdown-menu-item > div').at(0).trigger('click')
 | |
|     expect(handleSelectOdd).toBeCalledWith([0, 1, 2, 3])
 | |
| 
 | |
|     dropdownWrapper.findAll('.ant-dropdown-menu-item > div').at(1).trigger('click')
 | |
|     expect(handleSelectEven).toBeCalledWith([0, 1, 2, 3])
 | |
|   })
 | |
| 
 | |
|   // https:// github.com/ant-design/ant-design/issues/4245
 | |
|   it('handles disabled checkbox correctly when dataSource changes', async () => {
 | |
|     const rowSelection = {
 | |
|       getCheckboxProps: record => {
 | |
|         return { props: { disabled: record.disabled }}
 | |
|       },
 | |
|     }
 | |
|     const wrapper = mount(Table, getTableOptions({ rowSelection }))
 | |
|     const newData = [
 | |
|       { key: 7, name: 'Jack', disabled: true },
 | |
|       { key: 8, name: 'Lucy', disabled: true },
 | |
|     ]
 | |
|     await asyncExpect(() => {
 | |
|       wrapper.setProps({ dataSource: newData })
 | |
|     })
 | |
|     await asyncExpect(() => {
 | |
|       wrapper.findAll('input').wrappers.forEach((checkbox) => {
 | |
|         expect(checkbox.vnode.data.attrs.disabled).toBe(true)
 | |
|       })
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   // https://github.com/ant-design/ant-design/issues/4779
 | |
|   it('should not switch pagination when select record', async () => {
 | |
|     const newData = []
 | |
|     for (let i = 0; i < 20; i += 1) {
 | |
|       newData.push({
 | |
|         key: i.toString(),
 | |
|         name: i.toString(),
 | |
|       })
 | |
|     }
 | |
|     const wrapper = mount(Table, getTableOptions({
 | |
|       rowSelection: {},
 | |
|       dataSource: newData,
 | |
|     }))
 | |
|     const pager = wrapper.findAll({ name: 'Pager' })
 | |
|     pager.at(pager.length - 1).trigger('click') // switch to second page
 | |
|     wrapper.findAll('input').at(0).element.checked = true
 | |
|     wrapper.findAll('input').at(0).trigger('change')
 | |
|     await asyncExpect(() => {
 | |
|       expect(renderedNames(wrapper)).toEqual(['10', '11', '12', '13', '14', '15', '16', '17', '18', '19'])
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   it('highlight selected row', async () => {
 | |
|     const wrapper = mount(Table, getTableOptions())
 | |
|     wrapper.findAll('input').at(1).element.checked = true
 | |
|     wrapper.findAll('input').at(1).trigger('change')
 | |
|     await asyncExpect(() => {
 | |
|       expect(wrapper.findAll('tbody tr').at(0).classes()).toContain('ant-table-row-selected')
 | |
|     })
 | |
|   })
 | |
| 
 | |
|   it('fix selection column on the left', async () => {
 | |
|     const wrapper = mount(Table, getTableOptions({
 | |
|       rowSelection: { fixed: true },
 | |
|     }))
 | |
|     await asyncExpect(() => {
 | |
|       expect(wrapper.html()).toMatchSnapshot()
 | |
|     })
 | |
|   })
 | |
| })
 |