UNPKG

@ustack/uskin

Version:

A graceful framework which provides developers another chance to build an amazing site.

399 lines (335 loc) 9.58 kB
import React from 'react'; import {mount} from 'enzyme'; import Table from '../js/components/table/index'; describe('test table', () => { let column; let data; let checkboxOnChange; let checkboxInitialize; let table; beforeEach(() => { column = [{ title: 'ID', key: 'id', width: '150px', dataIndex: 'id', sortBy: 'number', filter: [{ name: 'id大于等于4', key: '1', filter: function(item) { if (item.id >= 4) { return true; } return false; } }, { name: 'id小于4', key: '2', filter: function(item) { if (item.id < 4) { return true; } return false; } }] }, { title: 'Category', key: 'category', width: '120px', dataIndex: 'category', sortBy: 'string' }, { title: 'Flavor', key: 'flavor', width: '70px', dataIndex: 'flavor', sortBy: 'string' }, { title: 'Level', key: 'level', dataIndex: 'level', filter: [{ name: 'level 1', key: '1', filter: function(item) { return item.level.localeCompare('First Level') === 0; } }, { name: 'level 2', key: '2', filter: function(item) { return item.level.localeCompare('Second Level') === 0; } }, { name: 'level 3', key: '3', filter: function(item) { return item.level.localeCompare('Third Level') === 0; } }, { name: 'level 4', key: '4', filter: function(item) { return item.level.localeCompare('Fourth Level') === 0; } }], sortBy: function(item1, item2) { let weight = ['First Level', 'Second Level', 'Third Level', 'Fourth Level']; if (weight.indexOf(item1.level) > weight.indexOf(item2.level)) { return 1; } else if (weight.indexOf(item1.level) < weight.indexOf(item2.level)) { return -1; } else { return 0; } } }, { title: 'CPU', key: 'cpu', dataIndex: 'cpu', sortBy: 'number', width: '50px' }, { title: 'Price', key: 'price', dataIndex: 'price', sortBy: 'number' }, { title: 'Double Price', key: 'double_price', sortBy: function(item1, item2) { if (item1.price * 2 > item2.price * 2) { return 1; } else if (item1.price * 2 < item2.price * 2) { return -1; } else { return 0; } }, render: function(col, item, index) { return <div style={{color: '#f78913'}}>{item.price * 2}</div>; } }, { title: 'Data Print', key: 'data_print', printData: function(col, item, e) { console.log('event:', e, 'GET COLUMN:', col, ' DATA:', item); }, render: function(col, item, index) { if (item.id > 4) { return <div>Printing Disabled</div>; } else { return ( <div style={{fontWeight: 500, cursor: 'pointer'}} onClick={this.printData.bind(this, col, item)}>{'Print ID ' + item.id} </div> ); } } }]; data = [{ id: 1, category: 'Micro-1', flavor: 'Micro', level: 'First Level', cpu: '1', price: '0.056' }, { id: 2, category: 'Standard-3', flavor: 'Standard', level: 'Second Level', cpu: '3', price: '0.444' }, { id: 3, category: 'Micro-2', flavor: 'Micro', level: 'Third Level', cpu: '5', price: '0.056' }, { id: 4, category: 'Standard-2', flavor: 'Standard', level: 'Fourth Level', cpu: '4', price: '0.444' }, { id: 5, category: 'Micro-3', flavor: 'Micro', level: 'Second Level', cpu: '1', price: '0.056' }, { id: 6, category: 'Standard-1', flavor: 'Standard', level: 'Third Level', cpu: '7', price: '0.444' }]; checkboxOnChange = jest.genMockFunction(); checkboxInitialize = jest.genMockFunction(); table = mount( <Table column={column} data={data} dataKey="id" checkbox={true} checkboxInitialize={checkboxInitialize} checkboxOnChange={checkboxOnChange} striped={true} hover={true} /> ); table.instance().resizeCol = () => {}; }); describe('test render', () => { beforeEach(() => { checkboxOnChange = jest.genMockFunction(); checkboxInitialize = (item) => (item.flavor === 'Micro'); table = mount( <Table column={column} data={data} dataKey="id" checkbox={true} checkboxInitialize={checkboxInitialize} checkboxOnChange={checkboxOnChange} striped={true} hover={true} /> ); table.instance().resizeCol = () => {}; }); it('should render a table', () => { const checkboxNodes = table.find('input'); const columnNodes = table.find('.table-header').children(); const rowNodes = table.find('.row'); const selectedRow = table.find('.row.selected'); expect(checkboxNodes.length).toBe(data.length + 1); expect(columnNodes.length).toBe(column.length + 1); expect(rowNodes.length).toBe(data.length); expect(selectedRow.length).toBe(data.filter(checkboxInitialize).length); }); it('should render a table without listener', () => { table = mount( <Table column={column} data={data} dataKey="id" checkbox={true} /> ); table.instance().resizeCol = () => {}; const columnNodes = table.find('.table-header').children(); const rowNodes = table.find('.row'); let key = 0; let checked = true; const checkbox = table.find('input').at(key + 1); checkbox.simulate('change', { target: { value: data[key].id, checked: checked } }); const selectedRow = table.find('.row.selected'); expect(selectedRow.length).toBe(1); expect(columnNodes.length).toBe(column.length + 1); expect(rowNodes.length).toBe(data.length); }); it('should update data when receive new props', () => { //when table has no filter, sortCol let newData = [{ id: 1, category: 'Micro-1', flavor: 'Micro', level: 'First Level', cpu: '4', price: '2.3333' }]; table.setProps({ data: newData, dataKey: 'id' }); const rowNodes = table.find('.row'); expect(rowNodes.length).toBe(newData.length); //when table has filter, sortCol //test }); it('should unmount the table', () => { spyOn(table.node, 'componentWillUnmount').and.callThrough(); table.unmount(); expect(table.node.componentWillUnmount).toHaveBeenCalled(); }); }); describe('test provided api', () => { it('should be loading', () => { let isLoading = true; table.node.loading(isLoading); const tbody = table.find('.table-body'); expect(table.state().loading).toBe(isLoading); expect(tbody.props().style.display).toBe('none'); }); it('should clear state', () => { checkboxOnChange = jest.genMockFunction(); checkboxInitialize = (item) => (item.flavor === 'Micro'); table = mount( <Table column={column} data={data} dataKey="id" checkbox={true} checkboxInitialize={checkboxInitialize} checkboxOnChange={checkboxOnChange} striped={true} hover={true} /> ); table.instance().resizeCol = () => {}; expect(table.find('.row.selected').length).toBe(data.filter(checkboxInitialize).length); table.node.clearState(); expect(table.find('.row.selected').length).toBe(0); }); }); describe('test checkbox', () => { it('should check a row', () => { let key = 0; let checked = true; const checkbox = table.find('input').at(key + 1); checkbox.simulate('change', { target: { value: data[key].id, checked: checked } }); expect(checkboxOnChange).toBeCalled(); expect(checkboxOnChange.mock.calls[0]).toEqual([checked, data[key], [data[key]]]); checkbox.simulate('change', { target: { value: data[key].id, checked: !checked } }); expect(checkboxOnChange.mock.calls[1]).toEqual([!checked, data[key], []]); }); it('should check all rows', () => { let keyValue = 'null'; let checked = true; const checkbox = table.find('input').at(0); checkbox.simulate('change', { target: { value: keyValue, checked: checked } }); let checkedRows = table.find('.row.selected'); expect(checkedRows.length).toBe(data.length); expect(checkboxOnChange.mock.calls[0]).toEqual([checked, undefined, data]); checkbox.simulate('change', { target: { value: keyValue, checked: !checked } }); checkedRows = table.find('.row.selected'); expect(checkedRows.length).toBe(0); expect(checkboxOnChange.mock.calls[1]).toEqual([!checked, undefined, []]); }); }); });