From fc0b99e8a07767d706f84840e8286321cc3dab58 Mon Sep 17 00:00:00 2001 From: AllenFang Date: Mon, 28 May 2018 18:05:33 +0800 Subject: [PATCH] patch tests for react-bootstrap-table-next --- package.json | 4 +- .../test/context.test.js | 430 ++++++++++++++++++ .../test/bootstrap-table.test.js | 23 +- .../test/container.test.js | 209 --------- .../test/contexts/data-context.test.js | 130 ++++++ .../test/contexts/index.test.js | 196 ++++++++ .../test/contexts/selection-context.test.js | 258 +++++++++++ .../test/contexts/sort-context.test.js | 255 +++++++++++ .../test/props-resolver/index.test.js | 16 +- .../props-resolver/remote-resolver.test.js | 76 +++- .../test/row-selection/wrapper.test.js | 224 --------- .../test/sort/wrapper.test.js | 230 ---------- .../test/store/index.test.js | 109 ----- .../test/store/mutate.test.js | 32 ++ .../test/store/rows.test.js | 29 +- .../test/store/selection.test.js | 113 ++--- .../test/store/sort.test.js | 73 +-- .../test/test-helpers/mock-component.js | 11 - 18 files changed, 1472 insertions(+), 946 deletions(-) create mode 100644 packages/react-bootstrap-table2-editor/test/context.test.js delete mode 100644 packages/react-bootstrap-table2/test/container.test.js create mode 100644 packages/react-bootstrap-table2/test/contexts/data-context.test.js create mode 100644 packages/react-bootstrap-table2/test/contexts/index.test.js create mode 100644 packages/react-bootstrap-table2/test/contexts/selection-context.test.js create mode 100644 packages/react-bootstrap-table2/test/contexts/sort-context.test.js delete mode 100644 packages/react-bootstrap-table2/test/row-selection/wrapper.test.js delete mode 100644 packages/react-bootstrap-table2/test/sort/wrapper.test.js delete mode 100644 packages/react-bootstrap-table2/test/store/index.test.js create mode 100644 packages/react-bootstrap-table2/test/store/mutate.test.js diff --git a/package.json b/package.json index d159c7b..15e5f9e 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,7 @@ "pretest": "yarn lint --cache", "test": "jest", "test:coverage": "jest --coverage", - "test:watch": "jest --watch", + "test:watch": "jest --coverage --watch", "storybook": "cd ./packages/react-bootstrap-table2-example && yarn storybook", "gh-pages:clean": "cd ./packages/react-bootstrap-table2-example && yarn gh-pages:clean", "gh-pages:build": "cd ./packages/react-bootstrap-table2-example && yarn gh-pages:build", @@ -86,7 +86,7 @@ }, "jest": { "collectCoverageFrom": [ - "packages/*/src/*.js", + "packages/*/src/**/*.js", "packages/*/index.js" ], "roots": [ diff --git a/packages/react-bootstrap-table2-editor/test/context.test.js b/packages/react-bootstrap-table2-editor/test/context.test.js new file mode 100644 index 0000000..89af0ce --- /dev/null +++ b/packages/react-bootstrap-table2-editor/test/context.test.js @@ -0,0 +1,430 @@ +import 'jsdom-global/register'; +import React from 'react'; +import { shallow } from 'enzyme'; +import _ from 'react-bootstrap-table-next/src/utils'; +import dataOperator from 'react-bootstrap-table-next/src/store/operators'; +import BootstrapTable from 'react-bootstrap-table-next/src/bootstrap-table'; + +import { + CLICK_TO_CELL_EDIT, + DBCLICK_TO_CELL_EDIT, + DELAY_FOR_DBCLICK +} from '../src/const'; +import createCellEditContext from '../src/context'; +import cellEditFactory from '../index'; + +describe('CellEditContext', () => { + let wrapper; + let cellEdit; + let CellEditContext; + + const data = [{ + id: 1, + name: 'A' + }, { + id: 2, + name: 'B' + }]; + + const keyField = 'id'; + + const columns = [{ + dataField: 'id', + text: 'ID' + }, { + dataField: 'name', + text: 'Name' + }]; + + const defaultCellEdit = { + mode: CLICK_TO_CELL_EDIT + }; + + const defaultSelectRow = undefined; + + const mockBase = jest.fn((props => ( + + ))); + + const handleCellChange = jest.fn(); + + function shallowContext( + customCellEdit = defaultCellEdit, + enableRemote = false, + selectRow = defaultSelectRow + ) { + mockBase.mockReset(); + handleCellChange.mockReset(); + CellEditContext = createCellEditContext( + _, + dataOperator, + jest.fn().mockReturnValue(enableRemote), + handleCellChange + ); + cellEdit = cellEditFactory(customCellEdit); + return ( + + + { + cellEditProps => mockBase(cellEditProps) + } + + + ); + } + + describe('default render', () => { + beforeEach(() => { + wrapper = shallow(shallowContext()); + wrapper.render(); + }); + + it('should have correct Provider property after calling createCellEditContext', () => { + expect(CellEditContext.Provider).toBeDefined(); + }); + + it('should have correct Consumer property after calling createCellEditContext', () => { + expect(CellEditContext.Consumer).toBeDefined(); + }); + + it('should have correct state.ridx', () => { + expect(wrapper.state().ridx).toBeNull(); + }); + + it('should have correct state.cidx', () => { + expect(wrapper.state().cidx).toBeNull(); + }); + + it('should have correct state.message', () => { + expect(wrapper.state().message).toBeNull(); + }); + + it('should pass correct cell editing props to children element', () => { + expect(wrapper.length).toBe(1); + expect(JSON.stringify(mockBase.mock.calls[0])).toEqual(JSON.stringify([{ + cellEdit: { + ...defaultCellEdit, + CLICK_TO_CELL_EDIT, + DBCLICK_TO_CELL_EDIT, + DELAY_FOR_DBCLICK, + ...wrapper.state(), + nonEditableRows: [] + } + }])); + }); + }); + + describe('componentWillReceiveProps', () => { + const initialState = { ridx: 1, cidx: 1, message: 'test' }; + describe('if nextProps.cellEdit is not existing', () => { + beforeEach(() => { + wrapper = shallow(shallowContext()); + wrapper.setState(initialState); + wrapper.render(); + wrapper.instance().componentWillReceiveProps({}); + }); + + it('should not set state.message', () => { + expect(wrapper.state().message).toBe(initialState.message); + }); + + it('should not set state.ridx', () => { + expect(wrapper.state().ridx).toBe(initialState.ridx); + }); + + it('should not set state.cidx', () => { + expect(wrapper.state().cidx).toBe(initialState.cidx); + }); + }); + + describe('if nextProps.cellEdit is existing but remote cell editing is disable', () => { + beforeEach(() => { + wrapper = shallow(shallowContext()); + wrapper.setState(initialState); + wrapper.render(); + wrapper.instance().componentWillReceiveProps({ + cellEdit: cellEditFactory(defaultCellEdit) + }); + }); + + it('should not set state.message', () => { + expect(wrapper.state().message).toBe(initialState.message); + }); + + it('should not set state.ridx', () => { + expect(wrapper.state().ridx).toBe(initialState.ridx); + }); + + it('should not set state.cidx', () => { + expect(wrapper.state().cidx).toBe(initialState.cidx); + }); + }); + + describe('if nextProps.cellEdit is existing and remote cell editing is enable', () => { + describe('if nextProps.cellEdit.options.errorMessage is defined', () => { + let message; + beforeEach(() => { + message = 'validation fail'; + wrapper = shallow(shallowContext(defaultCellEdit, true)); + wrapper.setState(initialState); + wrapper.render(); + wrapper.instance().componentWillReceiveProps({ + cellEdit: cellEditFactory({ + ...defaultCellEdit, + errorMessage: message + }) + }); + wrapper.update(); + }); + + it('should set state.message', () => { + expect(wrapper.state('message')).toBe(message); + }); + + it('should not set state.ridx', () => { + expect(wrapper.state().ridx).toBe(initialState.ridx); + }); + + it('should not set state.cidx', () => { + expect(wrapper.state().cidx).toBe(initialState.cidx); + }); + }); + + describe('if nextProps.cellEdit.options.errorMessage is not defined', () => { + beforeEach(() => { + wrapper = shallow(shallowContext(defaultCellEdit, true)); + wrapper.setState(initialState); + wrapper.instance().componentWillReceiveProps({ + cellEdit: cellEditFactory({ ...defaultCellEdit }) + }); + wrapper.update(); + }); + + it('should not set state.message', () => { + expect(wrapper.state('message')).toBe(initialState.message); + }); + + it('should set correct state.ridx', () => { + expect(wrapper.state().ridx).toBeNull(); + }); + + it('should set correct state.cidx', () => { + expect(wrapper.state().cidx).toBeNull(); + }); + }); + }); + }); + + describe('handleCellUpdate', () => { + const row = data[1]; + const column = columns[1]; + const newValue = 'This is new value'; + const oldValue = row[column.dataField]; + + describe('if cellEdit.beforeSaveCell prop is defined', () => { + const beforeSaveCell = jest.fn(); + + beforeEach(() => { + beforeSaveCell.mockReset(); + wrapper = shallow(shallowContext({ + ...defaultCellEdit, + beforeSaveCell + })); + wrapper.instance().handleCellUpdate( + row, + column, + newValue + ); + }); + + it('should call cellEdit.beforeSaveCell correctly', () => { + expect(beforeSaveCell).toHaveBeenCalledTimes(1); + expect(beforeSaveCell).toHaveBeenCalledWith(oldValue, newValue, row, column); + }); + }); + + describe('when remote cell editing is enable', () => { + const afterSaveCell = jest.fn(); + beforeEach(() => { + afterSaveCell.mockReset(); + wrapper = shallow(shallowContext({ + ...defaultCellEdit, + afterSaveCell + }, true)); + wrapper.instance().handleCellUpdate( + row, + column, + newValue + ); + }); + + it('should call handleCellChange correctly', () => { + expect(handleCellChange).toHaveBeenCalledTimes(1); + expect(handleCellChange).toHaveBeenCalledWith(row[keyField], column.dataField, newValue); + }); + + it('should not call cellEdit.afterSaveCell even if it is defined', () => { + expect(afterSaveCell).toHaveBeenCalledTimes(0); + }); + }); + + describe('when remote cell editing is disable', () => { + const afterSaveCell = jest.fn(); + + beforeEach(() => { + afterSaveCell.mockReset(); + wrapper = shallow(shallowContext({ + ...defaultCellEdit, + afterSaveCell + })); + wrapper.setState({ + ridx: 1, + cidx: 1 + }); + wrapper.instance().handleCellUpdate( + row, + column, + newValue + ); + }); + + it('should not call handleCellChange correctly', () => { + expect(handleCellChange).toHaveBeenCalledTimes(0); + }); + + it('should set state correctly', () => { + expect(wrapper.state('ridx')).toBeNull(); + expect(wrapper.state('cidx')).toBeNull(); + expect(wrapper.state('message')).toBeNull(); + }); + + it('should call cellEdit.afterSaveCell if it is defined', () => { + expect(afterSaveCell).toHaveBeenCalledTimes(1); + }); + }); + }); + + describe('completeEditing', () => { + const initialState = { ridx: 1, cidx: 1, message: 'test' }; + + beforeEach(() => { + wrapper = shallow(shallowContext()); + wrapper.setState(initialState); + wrapper.render(); + wrapper.instance().completeEditing(); + }); + + it('should set state correctly', () => { + expect(wrapper.state().ridx).toBeNull(); + expect(wrapper.state().cidx).toBeNull(); + expect(wrapper.state().message).toBeNull(); + }); + }); + + describe('startEditing', () => { + const ridx = 0; + const cidx = 1; + + describe('if selectRow prop is not defined', () => { + beforeEach(() => { + wrapper = shallow(shallowContext()); + wrapper.render(); + wrapper.instance().startEditing(ridx, cidx); + }); + + it('should set state correctly', () => { + expect(wrapper.state().ridx).toEqual(ridx); + expect(wrapper.state().cidx).toEqual(cidx); + }); + }); + + describe('if selectRow prop is defined', () => { + describe('and selectRow.clickToEdit is enable', () => { + beforeEach(() => { + wrapper = shallow(shallowContext( + defaultCellEdit, + false, + { + ...defaultSelectRow, + clickToEdit: true + } + )); + wrapper.render(); + wrapper.instance().startEditing(ridx, cidx); + }); + + it('should set state correctly', () => { + expect(wrapper.state().ridx).toEqual(ridx); + expect(wrapper.state().cidx).toEqual(cidx); + }); + }); + + describe('and selectRow.clickToSelect is disable', () => { + beforeEach(() => { + wrapper = shallow(shallowContext( + defaultCellEdit, + false, + { + ...defaultSelectRow, + clickToSelect: false + } + )); + wrapper.render(); + wrapper.instance().startEditing(ridx, cidx); + }); + + it('should set state correctly', () => { + expect(wrapper.state().ridx).toEqual(ridx); + expect(wrapper.state().cidx).toEqual(cidx); + }); + }); + + describe('and selectRow.clickToEdit & selectRow.clickToSelect is enable', () => { + beforeEach(() => { + wrapper = shallow(shallowContext( + defaultCellEdit, + false, + { + ...defaultSelectRow, + clickToEdit: false, + clickToSelect: true + } + )); + wrapper.render(); + wrapper.instance().startEditing(ridx, cidx); + }); + + it('should not set state', () => { + expect(wrapper.state().ridx).toBeNull(); + expect(wrapper.state().cidx).toBeNull(); + }); + }); + }); + }); + + describe('escapeEditing', () => { + const initialState = { ridx: 1, cidx: 1 }; + + beforeEach(() => { + wrapper = shallow(shallowContext()); + wrapper.setState(initialState); + wrapper.instance().escapeEditing(); + }); + + it('should set state correctly', () => { + expect(wrapper.state().ridx).toBeNull(); + expect(wrapper.state().cidx).toBeNull(); + }); + }); +}); diff --git a/packages/react-bootstrap-table2/test/bootstrap-table.test.js b/packages/react-bootstrap-table2/test/bootstrap-table.test.js index b1d4062..4991018 100644 --- a/packages/react-bootstrap-table2/test/bootstrap-table.test.js +++ b/packages/react-bootstrap-table2/test/bootstrap-table.test.js @@ -2,7 +2,6 @@ import React from 'react'; import { shallow } from 'enzyme'; import Caption from '../src/caption'; -import Store from '../src/store'; import Header from '../src/header'; import Body from '../src/body'; import BootstrapTable from '../src/bootstrap-table'; @@ -25,13 +24,10 @@ describe('BootstrapTable', () => { name: 'B' }]; - const store = new Store('id'); - store.data = data; - describe('simplest table', () => { beforeEach(() => { wrapper = shallow( - ); + ); }); it('should render successfully', () => { @@ -41,11 +37,6 @@ describe('BootstrapTable', () => { expect(wrapper.find(Body).length).toBe(1); }); - it('should have correct default state', () => { - expect(wrapper.state().data).toBeDefined(); - expect(wrapper.state().data).toEqual(store.data); - }); - it("should only have classes 'table' and 'table-bordered' as default", () => { expect(wrapper.find('table').prop('className')).toBe('table table-bordered'); }); @@ -64,7 +55,6 @@ describe('BootstrapTable', () => { keyField="id" columns={ columns } data={ data } - store={ store } classes={ classes } />); }); @@ -83,7 +73,6 @@ describe('BootstrapTable', () => { keyField="id" columns={ columns } data={ data } - store={ store } wrapperClasses={ classes } />); }); @@ -102,7 +91,6 @@ describe('BootstrapTable', () => { keyField="id" columns={ columns } data={ data } - store={ store } id={ id } />); }); @@ -115,7 +103,7 @@ describe('BootstrapTable', () => { describe('when hover props is true', () => { beforeEach(() => { wrapper = shallow( - ); + ); }); it('should have table-hover class on table', () => { @@ -126,7 +114,7 @@ describe('BootstrapTable', () => { describe('when striped props is true', () => { beforeEach(() => { wrapper = shallow( - ); + ); }); it('should have table-striped class on table', () => { @@ -137,7 +125,7 @@ describe('BootstrapTable', () => { describe('when condensed props is true', () => { beforeEach(() => { wrapper = shallow( - ); + ); }); it('should have table-condensed class on table', () => { @@ -148,7 +136,7 @@ describe('BootstrapTable', () => { describe('when bordered props is false', () => { beforeEach(() => { wrapper = shallow( - ); + ); }); it('should not have table-condensed class on table', () => { @@ -160,7 +148,6 @@ describe('BootstrapTable', () => { beforeEach(() => { wrapper = shallow( test } keyField="id" columns={ columns } diff --git a/packages/react-bootstrap-table2/test/container.test.js b/packages/react-bootstrap-table2/test/container.test.js deleted file mode 100644 index 8ceb5a5..0000000 --- a/packages/react-bootstrap-table2/test/container.test.js +++ /dev/null @@ -1,209 +0,0 @@ -/* eslint react/prefer-stateless-function: 0 */ -/* eslint react/no-multi-comp: 0 */ -import React from 'react'; -import { shallow } from 'enzyme'; - -import BootstrapTable from '../src/bootstrap-table'; -import Container from '../index.js'; - -describe('container', () => { - let wrapper; - - const keyField = 'id'; - - const columns = [{ - dataField: keyField, - text: 'ID' - }, { - dataField: 'name', - text: 'Name' - }]; - - const data = [{ - id: 1, - name: 'A' - }, { - id: 2, - name: 'B' - }]; - - describe('initialization', () => { - beforeEach(() => { - wrapper = shallow( - - ); - }); - - it('should initialize BaseComponent', () => { - expect(wrapper.instance().BaseComponent.name).toBe('BootstrapTable'); - }); - - it('should render BootstrapTable successfully', () => { - expect(wrapper.find(BootstrapTable)).toHaveLength(1); - }); - - it('should creating store successfully', () => { - const store = wrapper.instance().store; - expect(store).toBeDefined(); - expect(store.data).toEqual(data); - expect(store.keyField).toEqual(keyField); - }); - }); - - describe('when cellEdit prop is defined', () => { - const wrapperFactory = Base => class CellEditWrapper extends React.Component { - render() { return ; } - }; - - const cellEdit = { - wrapperFactory, - options: { - mode: 'click' - } - }; - - beforeEach(() => { - wrapper = shallow( - - ); - }); - - it('should initialize BaseComponent correctly', () => { - expect(wrapper.instance().BaseComponent.name).toBe('CellEditWrapper'); - }); - - it('should render CellEditWrapper component successfully', () => { - expect(wrapper.find('CellEditWrapper')).toHaveLength(1); - }); - - it('should render BootstrapTable component successfully', () => { - expect(wrapper.dive().find(BootstrapTable)).toHaveLength(1); - }); - }); - - describe('when selectRow prop is defined', () => { - const selectRow = { - mode: 'checkbox' - }; - - beforeEach(() => { - wrapper = shallow( - - ); - }); - - it('should initialize BaseComponent correctly', () => { - expect(wrapper.instance().BaseComponent.name).toBe('RowSelectionWrapper'); - }); - - it('should render BootstrapTable component successfully', () => { - expect(wrapper.dive().find(BootstrapTable)).toHaveLength(1); - }); - - it('should render RowSelectionWrapper component successfully', () => { - expect(wrapper.find('RowSelectionWrapper').length).toBe(1); - }); - }); - - describe('when pagination prop is defined', () => { - const wrapperFactory = Base => class PaginationWrapper extends React.Component { - render() { return ; } - }; - const pagination = { - wrapperFactory - }; - - beforeEach(() => { - wrapper = shallow( - - ); - }); - - it('should initialize BaseComponent correctly', () => { - expect(wrapper.instance().BaseComponent.name).toBe('PaginationWrapper'); - }); - - it('should render BootstrapTable component successfully', () => { - expect(wrapper.dive().find(BootstrapTable)).toHaveLength(1); - }); - - it('should render PaginationWrapper component successfully', () => { - expect(wrapper.find('PaginationWrapper').length).toBe(1); - }); - }); - - describe('when filter prop is defined', () => { - const wrapperFactory = Base => class FilterWrapper extends React.Component { - render() { return ; } - }; - - const filter = { wrapperFactory }; - - beforeEach(() => { - wrapper = shallow( - - ); - }); - - it('should initialize BaseComponent correctly', () => { - expect(wrapper.instance().BaseComponent.name).toBe('FilterWrapper'); - }); - - it('should render BootstrapTable component successfully', () => { - expect(wrapper.dive().find(BootstrapTable)).toHaveLength(1); - }); - - it('should render FilterWrapper component successfully', () => { - expect(wrapper.find('FilterWrapper').length).toBe(1); - }); - }); - - describe('when any column.sort is defined', () => { - beforeEach(() => { - const columnsWithSort = [{ - dataField: keyField, - text: 'ID', - sort: true - }]; - wrapper = shallow( - - ); - }); - - it('should initialize BaseComponent correctly', () => { - expect(wrapper.instance().BaseComponent.name).toBe('SortWrapper'); - }); - - it('should render BootstrapTable component successfully', () => { - expect(wrapper.dive().find(BootstrapTable)).toHaveLength(1); - }); - - it('should render SortWrapper component successfully', () => { - expect(wrapper.find('SortWrapper').length).toBe(1); - }); - }); -}); diff --git a/packages/react-bootstrap-table2/test/contexts/data-context.test.js b/packages/react-bootstrap-table2/test/contexts/data-context.test.js new file mode 100644 index 0000000..0761640 --- /dev/null +++ b/packages/react-bootstrap-table2/test/contexts/data-context.test.js @@ -0,0 +1,130 @@ +import 'jsdom-global/register'; +import React from 'react'; +import { shallow } from 'enzyme'; + +import BootstrapTable from '../../src/bootstrap-table'; +import createDataContext from '../../src/contexts/data-context'; + +describe('DataContext', () => { + let wrapper; + + const data = [{ + id: 1, + name: 'A' + }, { + id: 2, + name: 'B' + }]; + + const columns = [{ + dataField: 'id', + text: 'ID' + }, { + dataField: 'name', + text: 'Name' + }]; + + const mockBase = jest.fn((props => ( + + ))); + + const DataContext = createDataContext(); + + function shallowContext() { + return ( + + + { + dataProps => mockBase(dataProps) + } + + + ); + } + + describe('default render', () => { + beforeEach(() => { + wrapper = shallow(shallowContext()); + wrapper.render(); + }); + + it('should have correct Provider property after calling createDataContext', () => { + expect(DataContext.Provider).toBeDefined(); + }); + + it('should have correct Consumer property after calling createDataContext', () => { + expect(DataContext.Consumer).toBeDefined(); + }); + + it('should have correct state.data', () => { + expect(wrapper.state().data).toEqual(data); + }); + + it('should pass correct sort props to children element', () => { + expect(wrapper.length).toBe(1); + expect(mockBase).toHaveBeenCalledWith({ + data, + getData: wrapper.instance().getData + }); + }); + }); + + describe('componentWillReceiveProps', () => { + const newData = [...data, { id: 3, name: 'test' }]; + + beforeEach(() => { + wrapper = shallow(shallowContext()); + wrapper.instance().componentWillReceiveProps({ + data: newData + }); + }); + + it('should have correct state.data', () => { + expect(wrapper.state().data).toEqual(newData); + }); + }); + + describe('getData', () => { + let result; + const fakeData = [...data, { id: 3, name: 'test' }]; + + beforeEach(() => { + wrapper = shallow(shallowContext()); + }); + + describe('if third argument is give', () => { + it('should return the data property from third argument', () => { + result = wrapper.instance().getData(null, null, { data: fakeData }); + expect(result).toEqual(fakeData); + }); + }); + + describe('if second argument is give', () => { + it('should return the data property from second argument', () => { + result = wrapper.instance().getData(null, { data: fakeData }); + expect(result).toEqual(fakeData); + }); + }); + + describe('if first argument is give', () => { + it('should return the data property from first argument', () => { + result = wrapper.instance().getData({ data: fakeData }); + expect(result).toEqual(fakeData); + }); + }); + + describe('if no argument is give', () => { + it('should return default props.data', () => { + result = wrapper.instance().getData(); + expect(result).toEqual(data); + }); + }); + }); +}); diff --git a/packages/react-bootstrap-table2/test/contexts/index.test.js b/packages/react-bootstrap-table2/test/contexts/index.test.js new file mode 100644 index 0000000..8b00719 --- /dev/null +++ b/packages/react-bootstrap-table2/test/contexts/index.test.js @@ -0,0 +1,196 @@ +/* eslint no-param-reassign: 0 */ +import React from 'react'; +import { shallow } from 'enzyme'; + +import Base from '../../src/bootstrap-table'; +import withContext from '../../src/contexts'; + +describe('Context', () => { + let wrapper; + + const keyField = 'id'; + + let columns; + + const data = [{ + id: 1, + name: 'A' + }, { + id: 2, + name: 'B' + }]; + + const BootstrapTable = withContext(Base); + + beforeEach(() => { + columns = [{ + dataField: keyField, + text: 'ID' + }, { + dataField: 'name', + text: 'Name' + }]; + }); + + describe('basic render', () => { + beforeEach(() => { + wrapper = shallow( + + ); + wrapper.render(); + }); + + it('should create contexts correctly', () => { + expect(wrapper.instance().DataContext).toBeDefined(); + expect(wrapper.instance().SortContext).not.toBeDefined(); + expect(wrapper.instance().SelectionContext).not.toBeDefined(); + expect(wrapper.instance().CellEditContext).not.toBeDefined(); + expect(wrapper.instance().FilterContext).not.toBeDefined(); + expect(wrapper.instance().PaginationContext).not.toBeDefined(); + }); + + it('should render correctly', () => { + const dataProvider = wrapper.find(wrapper.instance().DataContext.Provider); + expect(dataProvider).toHaveLength(1); + expect(dataProvider.props().data).toEqual(data); + expect(dataProvider.props().keyField).toEqual(keyField); + expect(dataProvider.props().columns).toEqual(columns); + }); + }); + + describe('if there\'s sort is enable', () => { + beforeEach(() => { + const columnsWithSort = columns.map((c) => { + c.sort = true; + return c; + }); + wrapper = shallow( + + ); + wrapper.render(); + }); + + it('should create contexts correctly', () => { + expect(wrapper.instance().DataContext).toBeDefined(); + expect(wrapper.instance().SortContext).toBeDefined(); + expect(wrapper.instance().SelectionContext).not.toBeDefined(); + expect(wrapper.instance().CellEditContext).not.toBeDefined(); + expect(wrapper.instance().FilterContext).not.toBeDefined(); + expect(wrapper.instance().PaginationContext).not.toBeDefined(); + }); + }); + + describe('if row selection is enable', () => { + beforeEach(() => { + const selectRow = { mode: 'radio' }; + wrapper = shallow( + + ); + wrapper.render(); + }); + + it('should create contexts correctly', () => { + expect(wrapper.instance().DataContext).toBeDefined(); + expect(wrapper.instance().SortContext).not.toBeDefined(); + expect(wrapper.instance().SelectionContext).toBeDefined(); + expect(wrapper.instance().CellEditContext).not.toBeDefined(); + expect(wrapper.instance().FilterContext).not.toBeDefined(); + expect(wrapper.instance().PaginationContext).not.toBeDefined(); + }); + }); + + describe('if cell editing is enable', () => { + beforeEach(() => { + const CellEditContext = React.createContext(); + const cellEdit = { + createContext: jest.fn().mockReturnValue({ + Provider: CellEditContext.Provider, + Consumer: CellEditContext.Consumer + }) + }; + wrapper = shallow( + + ); + wrapper.render(); + }); + + it('should create contexts correctly', () => { + expect(wrapper.instance().DataContext).toBeDefined(); + expect(wrapper.instance().SortContext).not.toBeDefined(); + expect(wrapper.instance().SelectionContext).not.toBeDefined(); + expect(wrapper.instance().CellEditContext).toBeDefined(); + expect(wrapper.instance().FilterContext).not.toBeDefined(); + expect(wrapper.instance().PaginationContext).not.toBeDefined(); + }); + }); + + describe('if column filter is enable', () => { + beforeEach(() => { + const FilterContext = React.createContext(); + const filter = { + createContext: jest.fn().mockReturnValue({ + Provider: FilterContext.Provider, + Consumer: FilterContext.Consumer + }) + }; + wrapper = shallow( + + ); + wrapper.render(); + }); + + it('should create contexts correctly', () => { + expect(wrapper.instance().DataContext).toBeDefined(); + expect(wrapper.instance().SortContext).not.toBeDefined(); + expect(wrapper.instance().SelectionContext).not.toBeDefined(); + expect(wrapper.instance().CellEditContext).not.toBeDefined(); + expect(wrapper.instance().FilterContext).toBeDefined(); + expect(wrapper.instance().PaginationContext).not.toBeDefined(); + }); + }); + + describe('if pagination is enable', () => { + beforeEach(() => { + const PaginationContext = React.createContext(); + const paginator = { + createContext: jest.fn().mockReturnValue({ + Provider: PaginationContext.Provider, + Consumer: PaginationContext.Consumer + }) + }; + wrapper = shallow( + + ); + wrapper.render(); + }); + + it('should create contexts correctly', () => { + expect(wrapper.instance().DataContext).toBeDefined(); + expect(wrapper.instance().SortContext).not.toBeDefined(); + expect(wrapper.instance().SelectionContext).not.toBeDefined(); + expect(wrapper.instance().CellEditContext).not.toBeDefined(); + expect(wrapper.instance().FilterContext).not.toBeDefined(); + expect(wrapper.instance().PaginationContext).toBeDefined(); + }); + }); +}); diff --git a/packages/react-bootstrap-table2/test/contexts/selection-context.test.js b/packages/react-bootstrap-table2/test/contexts/selection-context.test.js new file mode 100644 index 0000000..819fada --- /dev/null +++ b/packages/react-bootstrap-table2/test/contexts/selection-context.test.js @@ -0,0 +1,258 @@ +import 'jsdom-global/register'; +import React from 'react'; +import { shallow } from 'enzyme'; + +import dataOperator from '../../src/store/operators'; +import BootstrapTable from '../../src/bootstrap-table'; +import createSelectionContext from '../../src/contexts/selection-context'; + +describe('DataContext', () => { + let wrapper; + + const data = [{ + id: 1, + name: 'A' + }, { + id: 2, + name: 'B' + }, { + id: 3, + name: 'B' + }]; + + const keyField = 'id'; + + const columns = [{ + dataField: 'id', + text: 'ID' + }, { + dataField: 'name', + text: 'Name' + }]; + + const mockBase = jest.fn((props => ( + + ))); + + const defaultSelectRow = { + mode: 'checkbox' + }; + const SelectionContext = createSelectionContext(dataOperator); + + function shallowContext(selectRow = defaultSelectRow) { + return ( + + + { + selectionProps => mockBase(selectionProps) + } + + + ); + } + + describe('default render', () => { + beforeEach(() => { + wrapper = shallow(shallowContext()); + wrapper.render(); + }); + + it('should have correct Provider property after calling createSelectionContext', () => { + expect(SelectionContext.Provider).toBeDefined(); + }); + + it('should have correct Consumer property after calling createSelectionContext', () => { + expect(SelectionContext.Consumer).toBeDefined(); + }); + + it('should have correct state.data', () => { + expect(wrapper.state().selected).toEqual([]); + }); + + it('should pass correct sort props to children element', () => { + expect(wrapper.length).toBe(1); + expect(mockBase).toHaveBeenCalledWith({ + selected: wrapper.state().selected, + onRowSelect: wrapper.instance().handleRowSelect, + onAllRowsSelect: wrapper.instance().handleAllRowsSelect + }); + }); + }); + + describe('componentWillReceiveProps', () => { + const newSelectRow = { + ...defaultSelectRow, + selected: [1] + }; + + beforeEach(() => { + wrapper = shallow(shallowContext()); + wrapper.instance().componentWillReceiveProps({ + selectRow: newSelectRow + }); + }); + + it('should have correct state.selected', () => { + expect(wrapper.state().selected).toEqual(newSelectRow.selected); + }); + + describe('if nextProps.selectRow is not existing', () => { + const defaultSelected = [1]; + beforeEach(() => { + wrapper = shallow(shallowContext({ + ...defaultSelectRow, + selected: defaultSelected + })); + wrapper.instance().componentWillReceiveProps({ + selectRow: defaultSelectRow + }); + }); + + it('should keep origin state.selected', () => { + expect(wrapper.state().selected).toEqual(defaultSelected); + }); + }); + + describe('if nextProps.selectRow is not existing', () => { + beforeEach(() => { + wrapper = shallow(shallowContext()); + wrapper.instance().componentWillReceiveProps({}); + }); + + it('should not set state.selected', () => { + expect(wrapper.state().selected).toEqual([]); + }); + }); + }); + + describe('when selectRow.selected prop is defined', () => { + let selectRow; + + beforeEach(() => { + selectRow = { + ...defaultSelectRow, + selected: [1] + }; + wrapper = shallow(shallowContext(selectRow)); + }); + + it('should have correct state.data', () => { + expect(wrapper.state().selected).toEqual(selectRow.selected); + }); + }); + + describe('handleRowSelect', () => { + const rowIndex = 1; + const firstSelectedRow = data[0][keyField]; + const secondSelectedRow = data[1][keyField]; + + describe('when selectRow.mode is \'radio\'', () => { + beforeEach(() => { + const selectRow = { mode: 'radio' }; + wrapper = shallow(shallowContext(selectRow)); + }); + + it('should set state.selected correctly', () => { + wrapper.instance().handleRowSelect(firstSelectedRow, true, rowIndex); + expect(wrapper.state('selected')).toEqual([firstSelectedRow]); + + wrapper.instance().handleRowSelect(secondSelectedRow, true, rowIndex); + expect(wrapper.state('selected')).toEqual([secondSelectedRow]); + }); + }); + + describe('when selectRow.mode is \'checkbox\'', () => { + beforeEach(() => { + wrapper = shallow(shallowContext()); + }); + + it('should set state.selected correctly', () => { + wrapper.instance().handleRowSelect(firstSelectedRow, true, rowIndex); + expect(wrapper.state('selected')).toEqual(expect.arrayContaining([firstSelectedRow])); + + wrapper.instance().handleRowSelect(secondSelectedRow, true, rowIndex); + expect(wrapper.state('selected')).toEqual(expect.arrayContaining([firstSelectedRow, secondSelectedRow])); + + wrapper.instance().handleRowSelect(firstSelectedRow, false, rowIndex); + expect(wrapper.state('selected')).toEqual(expect.arrayContaining([secondSelectedRow])); + + wrapper.instance().handleRowSelect(secondSelectedRow, false, rowIndex); + expect(wrapper.state('selected')).toEqual([]); + }); + }); + + describe('when selectRow.onSelect is defined', () => { + const onSelect = jest.fn(); + beforeEach(() => { + wrapper = shallow(shallowContext({ + ...defaultSelectRow, + onSelect + })); + }); + + it('call selectRow.onSelect correctly', () => { + const e = { target: {} }; + const row = dataOperator.getRowByRowId(data, keyField, firstSelectedRow); + wrapper.instance().handleRowSelect(firstSelectedRow, true, rowIndex, e); + expect(onSelect).toHaveBeenCalledWith(row, true, rowIndex, e); + }); + }); + }); + + describe('handleAllRowsSelect', () => { + const e = { target: {} }; + + describe('when isUnSelect argument is false', () => { + beforeEach(() => { + wrapper = shallow(shallowContext()); + wrapper.instance().handleAllRowsSelect(e, false); + }); + + it('should set state.selected correctly', () => { + expect(wrapper.state('selected')).toEqual(data.map(d => d[keyField])); + }); + }); + + describe('when isUnSelect argument is true', () => { + beforeEach(() => { + wrapper = shallow(shallowContext({ + ...defaultSelectRow, + selected: data.map(d => d[keyField]) + })); + wrapper.instance().handleAllRowsSelect(e, true); + }); + + it('should set state.selected correctly', () => { + expect(wrapper.state('selected')).toEqual([]); + }); + }); + + describe('when selectRow.onSelectAll is defined', () => { + const onSelectAll = jest.fn(); + beforeEach(() => { + wrapper = shallow(shallowContext({ + ...defaultSelectRow, + onSelectAll + })); + wrapper.instance().handleAllRowsSelect(e, false); + }); + + it('should call selectRow.onSelectAll correctly', () => { + expect(onSelectAll).toHaveBeenCalledWith( + true, + dataOperator.getSelectedRows(data, keyField, wrapper.state('selected')), + e + ); + }); + }); + }); +}); diff --git a/packages/react-bootstrap-table2/test/contexts/sort-context.test.js b/packages/react-bootstrap-table2/test/contexts/sort-context.test.js new file mode 100644 index 0000000..0a05861 --- /dev/null +++ b/packages/react-bootstrap-table2/test/contexts/sort-context.test.js @@ -0,0 +1,255 @@ +import 'jsdom-global/register'; +import React from 'react'; +import { shallow } from 'enzyme'; + +import Const from '../../src/const'; +import dataOperator from '../../src/store/operators'; +import BootstrapTable from '../../src/bootstrap-table'; +import createSortContext from '../../src/contexts/sort-context'; + +describe('SortContext', () => { + let wrapper; + let columns; + let SortContext; + + let data; + + const mockBase = jest.fn((props => ( + + ))); + + beforeEach(() => { + data = [{ + id: 1, + name: 'A' + }, { + id: 2, + name: 'B' + }]; + columns = [{ + dataField: 'id', + text: 'ID', + sort: true + }, { + dataField: 'name', + text: 'Name', + sort: true + }]; + }); + + const handleRemoteSortChange = jest.fn(); + + function shallowContext(enableRemote = false, providerProps = {}) { + handleRemoteSortChange.mockReset(); + mockBase.mockReset(); + SortContext = createSortContext( + dataOperator, + jest.fn().mockReturnValue(enableRemote), + handleRemoteSortChange + ); + return ( + + + { + sortProps => mockBase(sortProps) + } + + + ); + } + + describe('default render', () => { + beforeEach(() => { + wrapper = shallow(shallowContext()); + wrapper.render(); + }); + + it('should have correct Provider property after calling createSortContext', () => { + expect(SortContext.Provider).toBeDefined(); + }); + + it('should have correct Consumer property after calling createSortContext', () => { + expect(SortContext.Consumer).toBeDefined(); + }); + + it('should have correct state.sortOrder', () => { + expect(wrapper.state().sortOrder).toBe(undefined); + }); + + it('should have correct state.sortColumn', () => { + expect(wrapper.state().sortColumn).toBe(undefined); + }); + + it('should pass correct sort props to children element', () => { + expect(wrapper.length).toBe(1); + expect(mockBase).toHaveBeenCalledWith({ + data, + sortOrder: undefined, + onSort: wrapper.instance().handleSort, + sortField: null + }); + }); + }); + + describe('handleSort function', () => { + let sortColumn; + let nextOrderSpy; + + beforeEach(() => { + sortColumn = columns[0]; + nextOrderSpy = jest.spyOn(dataOperator, 'nextOrder'); + }); + + afterEach(() => { + nextOrderSpy.mockRestore(); + }); + + describe('when remote.sort is false', () => { + beforeEach(() => { + wrapper = shallow(shallowContext()); + wrapper.render(); + wrapper.instance().handleSort(sortColumn); + wrapper.update(); + wrapper.render(); + }); + + it('should set state correctly', () => { + expect(wrapper.state().sortColumn).toEqual(sortColumn); + expect(wrapper.state().sortOrder).toEqual(Const.SORT_DESC); + }); + + it('should call dataOperator.nextOrder correctly', () => { + expect(nextOrderSpy).toHaveBeenCalledTimes(1); + expect(nextOrderSpy).toHaveBeenCalledWith( + sortColumn, + { sortColumn: undefined, sortOrder: undefined }, + wrapper.props().defaultSortDirection + ); + }); + + it('should pass correct sort props to children element', () => { + expect(wrapper.length).toBe(1); + expect(mockBase).toHaveBeenLastCalledWith({ + data: data.reverse(), + sortOrder: wrapper.state().sortOrder, + onSort: wrapper.instance().handleSort, + sortField: wrapper.state().sortColumn.dataField + }); + }); + }); + + describe('when remote.sort is true', () => { + beforeEach(() => { + wrapper = shallow(shallowContext(true)); + wrapper.render(); + + nextOrderSpy = jest.spyOn(dataOperator, 'nextOrder'); + wrapper.instance().handleSort(sortColumn); + }); + + it('should set state correctly', () => { + expect(wrapper.state().sortColumn).toEqual(sortColumn); + expect(wrapper.state().sortOrder).toEqual(Const.SORT_DESC); + }); + + it('should call dataOperator.nextOrder correctly', () => { + expect(nextOrderSpy).toHaveBeenCalledTimes(1); + expect(nextOrderSpy).toHaveBeenCalledWith( + sortColumn, + { sortColumn: undefined, sortOrder: undefined }, + wrapper.props().defaultSortDirection + ); + }); + + it('should calling handleRemoteSortChange correctly', () => { + expect(handleRemoteSortChange).toHaveBeenCalledTimes(1); + expect(handleRemoteSortChange).toHaveBeenCalledWith(sortColumn.dataField, Const.SORT_DESC); + }); + }); + + describe('when column.onSort prop is defined', () => { + const onSortCB = jest.fn(); + + beforeEach(() => { + columns[0].onSort = onSortCB; + wrapper = shallow(shallowContext()); + wrapper.instance().handleSort(sortColumn); + }); + + it('should calling column.onSort function correctly', () => { + expect(onSortCB).toHaveBeenCalledTimes(1); + expect(onSortCB).toHaveBeenCalledWith(columns[0].dataField, Const.SORT_DESC); + + wrapper.instance().handleSort(sortColumn); + expect(onSortCB).toHaveBeenCalledTimes(2); + expect(onSortCB).toHaveBeenCalledWith(columns[0].dataField, Const.SORT_ASC); + }); + }); + }); + + describe('when defaultSorted prop is defined', () => { + const defaultSorted = [{ + dataField: 'name', + order: Const.SORT_DESC + }]; + + beforeEach(() => { + wrapper = shallow(shallowContext(false, { defaultSorted })); + wrapper.render(); + }); + + it('should pass correct sort props to children element', () => { + expect(wrapper.length).toBe(1); + expect(mockBase).toHaveBeenLastCalledWith({ + data: data.reverse(), + sortOrder: wrapper.state().sortOrder, + onSort: wrapper.instance().handleSort, + sortField: wrapper.state().sortColumn.dataField + }); + }); + + it('should have correct state.sortOrder', () => { + expect(wrapper.state().sortOrder).toBe(defaultSorted[0].order); + }); + + it('should have correct state.sortColumn', () => { + expect(wrapper.state().sortColumn).toBe(columns[1]); + }); + + describe('when column.onSort prop is defined', () => { + const onSortCB = jest.fn(); + + beforeEach(() => { + columns[1].onSort = onSortCB; + wrapper = shallow(shallowContext(false, { defaultSorted })); + }); + + it('should calling column.onSort function correctly', () => { + expect(onSortCB).toHaveBeenCalledTimes(1); + expect(onSortCB).toHaveBeenCalledWith(defaultSorted[0].dataField, defaultSorted[0].order); + }); + }); + + describe('when remote.sort is true', () => { + beforeEach(() => { + wrapper = shallow(shallowContext(true, { defaultSorted })); + wrapper.render(); + }); + + it('should calling handleRemoteSortChange correctly', () => { + expect(handleRemoteSortChange).toHaveBeenCalledTimes(1); + expect(handleRemoteSortChange) + .toHaveBeenCalledWith(defaultSorted[0].dataField, defaultSorted[0].order); + }); + }); + }); +}); diff --git a/packages/react-bootstrap-table2/test/props-resolver/index.test.js b/packages/react-bootstrap-table2/test/props-resolver/index.test.js index cb3a54b..d12ed1f 100644 --- a/packages/react-bootstrap-table2/test/props-resolver/index.test.js +++ b/packages/react-bootstrap-table2/test/props-resolver/index.test.js @@ -225,17 +225,9 @@ describe('TableResolver', () => { bar: expect.any(Function) })); }); - - it('should return object which can not contain allRowsSelected option', () => { - expect(headerCellSelectionInfo.allRowsSelected).not.toBeDefined(); - }); - - it('should return object which can not contain allRowsSelected option', () => { - expect(headerCellSelectionInfo.selected).not.toBeDefined(); - }); }); - describe('if all rows were selected', () => { + describe('if options.allRowsSelected is true', () => { beforeEach(() => { selectRow = {}; const selectedRowKeys = [1, 2]; @@ -258,7 +250,7 @@ describe('TableResolver', () => { }); }); - describe('if part of rows were selected', () => { + describe('if options.allRowsSelected and options.allRowsNotSelected both are false', () => { beforeEach(() => { selectRow = {}; const selectedRowKeys = [1]; @@ -269,6 +261,7 @@ describe('TableResolver', () => { wrapper = shallow(mockElement); headerCellSelectionInfo = wrapper.instance().resolveSelectRowPropsForHeader({ allRowsSelected: false, + allRowsNotSelected: false, selected: selectedRowKeys }); }); @@ -280,7 +273,7 @@ describe('TableResolver', () => { }); }); - describe('if none of row was selected', () => { + describe('if options.allRowsNotSelected is true', () => { beforeEach(() => { selectRow = {}; const selectedRowKeys = []; @@ -292,6 +285,7 @@ describe('TableResolver', () => { headerCellSelectionInfo = wrapper.instance().resolveSelectRowPropsForHeader({ allRowsSelected: false, + allRowsNotSelected: true, selected: selectedRowKeys }); }); diff --git a/packages/react-bootstrap-table2/test/props-resolver/remote-resolver.test.js b/packages/react-bootstrap-table2/test/props-resolver/remote-resolver.test.js index 4cfcc04..31c8dfc 100644 --- a/packages/react-bootstrap-table2/test/props-resolver/remote-resolver.test.js +++ b/packages/react-bootstrap-table2/test/props-resolver/remote-resolver.test.js @@ -3,7 +3,7 @@ import React from 'react'; import sinon from 'sinon'; import { shallow } from 'enzyme'; -import Container from '../../'; +import Container from '../../index'; // import remoteResolver from '../../src/props-resolver/remote-resolver'; describe('remoteResolver', () => { @@ -100,6 +100,16 @@ describe('remoteResolver', () => { expect(wrapper.instance().isRemoteFiltering()).toBeTruthy(); }); }); + + describe('when this.isRemotePagination return true', () => { + beforeEach(() => { + shallowContainer({ remote: { pagination: true } }); + }); + + it('should return true', () => { + expect(wrapper.instance().isRemoteFiltering()).toBeTruthy(); + }); + }); }); describe('isRemoteSort', () => { @@ -132,6 +142,16 @@ describe('remoteResolver', () => { expect(wrapper.instance().isRemoteSort()).toBeTruthy(); }); }); + + describe('when this.isRemotePagination return true', () => { + beforeEach(() => { + shallowContainer({ remote: { pagination: true } }); + }); + + it('should return true', () => { + expect(wrapper.instance().isRemoteSort()).toBeTruthy(); + }); + }); }); describe('isRemoteCellEdit', () => { @@ -166,7 +186,7 @@ describe('remoteResolver', () => { }); }); - describe('handleCellChange', () => { + describe('handleRemoteCellChange', () => { const onTableChangeCB = sinon.stub(); const rowId = 1; const dataField = 'name'; @@ -175,7 +195,7 @@ describe('remoteResolver', () => { beforeEach(() => { onTableChangeCB.reset(); shallowContainer({ onTableChange: onTableChangeCB }); - wrapper.instance().handleCellChange(rowId, dataField, newValue); + wrapper.instance().handleRemoteCellChange(rowId, dataField, newValue); }); it('should calling props.onTableChange correctly', () => { @@ -188,35 +208,45 @@ describe('remoteResolver', () => { describe('handleSortChange', () => { const onTableChangeCB = sinon.stub(); + const newSortFiled = 'name'; + const newSortOrder = 'asc'; beforeEach(() => { onTableChangeCB.reset(); shallowContainer({ onTableChange: onTableChangeCB }); - wrapper.instance().handleSortChange(); + wrapper.instance().handleRemoteSortChange(newSortFiled, newSortOrder); }); it('should calling props.onTableChange correctly', () => { expect(onTableChangeCB.calledOnce).toBeTruthy(); - expect(onTableChangeCB.calledWith('sort', wrapper.instance().getNewestState())).toBeTruthy(); + expect(onTableChangeCB.calledWith('sort', wrapper.instance().getNewestState({ + sortField: newSortFiled, + sortOrder: newSortOrder + }))).toBeTruthy(); }); }); describe('handleRemotePageChange', () => { const onTableChangeCB = sinon.stub(); + const newPage = 2; + const newSizePerPage = 10; beforeEach(() => { onTableChangeCB.reset(); shallowContainer({ onTableChange: onTableChangeCB }); - wrapper.instance().handleRemotePageChange(); + wrapper.instance().handleRemotePageChange(newPage, newSizePerPage); }); it('should calling props.onTableChange correctly', () => { expect(onTableChangeCB.calledOnce).toBeTruthy(); - expect(onTableChangeCB.calledWith('pagination', wrapper.instance().getNewestState())).toBeTruthy(); + expect(onTableChangeCB.calledWith('pagination', wrapper.instance().getNewestState({ + page: newPage, + sizePerPage: newSizePerPage + }))).toBeTruthy(); }); }); describe('handleRemoteFilterChange', () => { const onTableChangeCB = sinon.stub(); - + const filters = { price: { filterVal: 20, filterType: 'TEXT' } }; beforeEach(() => { onTableChangeCB.reset(); shallowContainer({ onTableChange: onTableChangeCB }); @@ -224,16 +254,16 @@ describe('remoteResolver', () => { describe('when remote pagination is disabled', () => { it('should calling props.onTableChange correctly', () => { - wrapper.instance().handleRemoteFilterChange(); + wrapper.instance().handleRemoteFilterChange(filters); expect(onTableChangeCB.calledOnce).toBeTruthy(); - expect(onTableChangeCB.calledWith('filter', wrapper.instance().getNewestState())).toBeTruthy(); + expect(onTableChangeCB.calledWith('filter', wrapper.instance().getNewestState({ + filters + }))).toBeTruthy(); }); }); describe('when remote pagination is enabled', () => { - const wrapperFactory = Base => class FilterWrapper extends React.Component { - render() { return ; } - }; + const createContext = () => {}; describe('and pagination.options.pageStartIndex is defined', () => { const options = { pageStartIndex: 0 }; @@ -241,16 +271,16 @@ describe('remoteResolver', () => { shallowContainer({ remote: true, onTableChange: onTableChangeCB, - pagination: { options, wrapperFactory } + pagination: { options, createContext } }); - wrapper.instance().store.page = 1; - wrapper.instance().store.sizePerPage = 10; - wrapper.instance().handleRemoteFilterChange(); + wrapper.instance().handleRemoteFilterChange(filters); }); - it('should calling onTableChange correctly', () => { + it('should calling onTableChange with page property by pageStartIndex', () => { expect(onTableChangeCB.calledOnce).toBeTruthy(); - const newState = wrapper.instance().getNewestState(); + const newState = wrapper.instance().getNewestState({ + filters + }); newState.page = options.pageStartIndex; expect(onTableChangeCB.calledWith('filter', newState)).toBeTruthy(); }); @@ -261,14 +291,14 @@ describe('remoteResolver', () => { shallowContainer({ remote: true, onTableChange: onTableChangeCB, - pagination: { wrapperFactory } + pagination: { createContext } }); - wrapper.instance().handleRemoteFilterChange(); + wrapper.instance().handleRemoteFilterChange(filters); }); - it('should calling onTableChange correctly', () => { + it('should calling onTableChange with page property by default 1', () => { expect(onTableChangeCB.calledOnce).toBeTruthy(); - const newState = wrapper.instance().getNewestState(); + const newState = wrapper.instance().getNewestState({ filters }); newState.page = 1; expect(onTableChangeCB.calledWith('filter', newState)).toBeTruthy(); }); diff --git a/packages/react-bootstrap-table2/test/row-selection/wrapper.test.js b/packages/react-bootstrap-table2/test/row-selection/wrapper.test.js deleted file mode 100644 index aa397ca..0000000 --- a/packages/react-bootstrap-table2/test/row-selection/wrapper.test.js +++ /dev/null @@ -1,224 +0,0 @@ -import React from 'react'; -import sinon from 'sinon'; -import { shallow } from 'enzyme'; - -import Store from '../../src/store'; -import BootstrapTable from '../../src/bootstrap-table'; -import wrapperFactory from '../../src/row-selection/wrapper'; - -describe('RowSelectionWrapper', () => { - let wrapper; - let selectRow; - - const columns = [{ - dataField: 'id', - text: 'ID' - }, { - dataField: 'name', - text: 'Name' - }]; - - const data = [{ - id: 1, - name: 'A' - }, { - id: 2, - name: 'B' - }]; - - const rowIndex = 1; - - const keyField = 'id'; - - const store = new Store(keyField); - store.data = data; - const RowSelectionWrapper = wrapperFactory(BootstrapTable); - - beforeEach(() => { - selectRow = { - mode: 'radio' - }; - wrapper = shallow( - - ); - }); - - it('should render RowSelectionWrapper correctly', () => { - expect(wrapper.length).toBe(1); - expect(wrapper.find(BootstrapTable)).toBeDefined(); - }); - - it('should have correct store.selected value', () => { - expect(store.selected).toEqual([]); - }); - - it('should have correct state', () => { - expect(wrapper.state().selectedRowKeys).toBeDefined(); - expect(wrapper.state().selectedRowKeys.length).toEqual(0); - }); - - it('should inject correct props to base component', () => { - expect(wrapper.props().onRowSelect).toBeDefined(); - expect(wrapper.props().onAllRowsSelect).toBeDefined(); - }); - - describe('componentWillReceiveProps', () => { - const nextSelected = [0]; - const nextProps = { - store: { - selected: nextSelected - }, - selectRow: { - mode: 'checkbox', - selected: nextSelected - } - }; - - it('should update state.selectedRowKeys with next selected rows', () => { - wrapper.instance().componentWillReceiveProps(nextProps); - expect(nextProps.store.selected).toEqual(nextSelected); - expect(wrapper.state('selectedRowKeys')).toEqual(nextSelected); - }); - }); - - describe('when selectRow.selected is defined', () => { - beforeEach(() => { - selectRow.mode = 'checkbox'; - selectRow.selected = [1, 3]; - wrapper = shallow( - - ); - }); - - it('should have correct store.selected value', () => { - expect(store.selected).toEqual(selectRow.selected); - }); - - it('should have correct state', () => { - expect(wrapper.state().selectedRowKeys).toEqual(selectRow.selected); - }); - }); - - describe('when selectRow.mode is \'radio\'', () => { - const firstSelectedRow = data[0][keyField]; - const secondSelectedRow = data[1][keyField]; - - it('call handleRowSelect function should setting correct state.selectedRowKeys', () => { - wrapper.instance().handleRowSelect(firstSelectedRow, rowIndex); - expect(wrapper.state('selectedRowKeys')).toEqual([firstSelectedRow]); - - wrapper.instance().handleRowSelect(secondSelectedRow, rowIndex); - expect(wrapper.state('selectedRowKeys')).toEqual([secondSelectedRow]); - }); - }); - - describe('when selectRow.mode is \'checkbox\'', () => { - const firstSelectedRow = data[0][keyField]; - const secondSelectedRow = data[1][keyField]; - - beforeEach(() => { - selectRow.mode = 'checkbox'; - wrapper = shallow( - - ); - }); - - it('call handleRowSelect function should setting correct state.selectedRowKeys', () => { - wrapper.instance().handleRowSelect(firstSelectedRow, true, rowIndex); - expect(wrapper.state('selectedRowKeys')).toEqual(expect.arrayContaining([firstSelectedRow])); - - wrapper.instance().handleRowSelect(secondSelectedRow, true, rowIndex); - expect(wrapper.state('selectedRowKeys')).toEqual(expect.arrayContaining([firstSelectedRow, secondSelectedRow])); - - wrapper.instance().handleRowSelect(firstSelectedRow, false, rowIndex); - expect(wrapper.state('selectedRowKeys')).toEqual(expect.arrayContaining([secondSelectedRow])); - - wrapper.instance().handleRowSelect(secondSelectedRow, false, rowIndex); - expect(wrapper.state('selectedRowKeys')).toEqual([]); - }); - - it('call handleAllRowsSelect function should setting correct state.selectedRowKeys', () => { - wrapper.instance().handleAllRowsSelect(); - expect(wrapper.state('selectedRowKeys')).toEqual(expect.arrayContaining([firstSelectedRow, secondSelectedRow])); - - wrapper.instance().handleAllRowsSelect(); - expect(wrapper.state('selectedRowKeys')).toEqual([]); - }); - }); - - describe('when selectRow.onSelect is defined', () => { - const selectedRow = data[0][keyField]; - const onSelectCallBack = sinon.stub(); - - beforeEach(() => { - selectRow.mode = 'checkbox'; - selectRow.onSelect = onSelectCallBack; - wrapper = shallow( - - ); - }); - - it('selectRow.onSelect callback should be called correctly when calling handleRowSelect function', () => { - wrapper.instance().handleRowSelect(selectedRow, true, rowIndex); - expect(onSelectCallBack.callCount).toEqual(1); - expect(onSelectCallBack.calledWith(data[0], true, rowIndex)).toBeTruthy(); - - wrapper.instance().handleRowSelect(selectedRow, false, rowIndex); - expect(onSelectCallBack.callCount).toEqual(2); - expect(onSelectCallBack.calledWith(data[0], false, rowIndex)).toBeTruthy(); - }); - }); - - describe('when selectRow.onSelectAll is defined', () => { - const onSelectAllCallBack = sinon.stub(); - - beforeEach(() => { - selectRow.mode = 'checkbox'; - selectRow.onSelectAll = onSelectAllCallBack; - wrapper = shallow( - - ); - }); - - it('selectRow.onSelect callback should be called correctly when calling handleRowSelect function', () => { - const e = {}; - wrapper.instance().handleAllRowsSelect(e); - expect(onSelectAllCallBack.callCount).toEqual(1); - expect(onSelectAllCallBack.calledWith(true, data, e)).toBeTruthy(); - - wrapper.instance().handleAllRowsSelect(e); - expect(onSelectAllCallBack.callCount).toEqual(2); - expect(onSelectAllCallBack.calledWith(false, [], e)).toBeTruthy(); - }); - }); -}); diff --git a/packages/react-bootstrap-table2/test/sort/wrapper.test.js b/packages/react-bootstrap-table2/test/sort/wrapper.test.js deleted file mode 100644 index 2575e86..0000000 --- a/packages/react-bootstrap-table2/test/sort/wrapper.test.js +++ /dev/null @@ -1,230 +0,0 @@ -import 'jsdom-global/register'; -import React from 'react'; -import sinon from 'sinon'; -import { shallow } from 'enzyme'; - -import Const from '../../src/const'; -import Store from '../../src/store'; -import BootstrapTable from '../../src/bootstrap-table'; -import wrapperFactory from '../../src/sort/wrapper'; - -describe('SortWrapper', () => { - let wrapper; - let columns; - - const data = [{ - id: 1, - name: 'A' - }, { - id: 2, - name: 'B' - }]; - - const keyField = 'id'; - - let store = new Store(keyField); - store.data = data; - - const SortWrapper = wrapperFactory(BootstrapTable); - - beforeEach(() => { - columns = [{ - dataField: 'id', - text: 'ID', - sort: true - }, { - dataField: 'name', - text: 'Name', - sort: true - }]; - wrapper = shallow( - - ); - }); - - it('should render SortWrapper correctly', () => { - expect(wrapper.length).toBe(1); - expect(wrapper.find(BootstrapTable)).toBeDefined(); - }); - - it('should inject correct props to base component', () => { - expect(wrapper.props().onSort).toBeDefined(); - }); - - describe('call handleSort function', () => { - let sortBySpy; - let sortColumn; - - beforeEach(() => { - sortColumn = columns[0]; - store = new Store(keyField); - store.data = data; - sortBySpy = sinon.spy(store, 'sortBy'); - }); - - describe('when remote.sort is false', () => { - beforeEach(() => { - wrapper = shallow( - - ); - - wrapper.instance().handleSort(sortColumn); - }); - - it('should operating on store correctly', () => { - expect(store.sortOrder).toEqual(Const.SORT_DESC); - expect(store.sortField).toEqual(sortColumn.dataField); - - wrapper.instance().handleSort(sortColumn); // sort same column again - expect(store.sortOrder).toEqual(Const.SORT_ASC); - expect(store.sortField).toEqual(sortColumn.dataField); - }); - - it('should calling store.sortBy correctly', () => { - expect(sortBySpy.calledOnce).toBeTruthy(); - expect(sortBySpy.calledWith(sortColumn)).toBeTruthy(); - }); - }); - - describe('when remote.sort is true', () => { - let onTableChangeCB; - - beforeEach(() => { - onTableChangeCB = sinon.stub(); - wrapper = shallow( - - ); - wrapper.instance().handleSort(sortColumn); - }); - - it('should operating on store correctly', () => { - expect(store.sortOrder).toEqual(Const.SORT_DESC); - expect(store.sortField).toEqual(sortColumn.dataField); - - wrapper.instance().handleSort(sortColumn); // sort same column again - expect(store.sortOrder).toEqual(Const.SORT_ASC); - expect(store.sortField).toEqual(sortColumn.dataField); - }); - - it('should not calling store.sortBy', () => { - expect(sortBySpy.calledOnce).toBeFalsy(); - }); - - it('should calling props.onTableChange', () => { - expect(onTableChangeCB.calledOnce).toBeTruthy(); - }); - }); - - describe('when column.onSort prop is defined', () => { - const onSortCB = jest.fn(); - - beforeEach(() => { - columns[0].onSort = onSortCB; - wrapper = shallow( - - ); - wrapper.instance().handleSort(sortColumn); - }); - - it('should calling column.onSort function correctly', () => { - expect(onSortCB).toHaveBeenCalledTimes(1); - expect(onSortCB).toHaveBeenCalledWith(columns[0].dataField, Const.SORT_DESC); - - wrapper.instance().handleSort(sortColumn); - expect(onSortCB).toHaveBeenCalledTimes(2); - expect(onSortCB).toHaveBeenCalledWith(columns[0].dataField, Const.SORT_ASC); - }); - }); - }); - - describe('when defaultSorted prop is defined', () => { - const defaultSorted = [{ - dataField: 'name', - order: Const.SORT_DESC - }]; - - beforeEach(() => { - wrapper = shallow( - - ); - }); - - it('should render table with correct default sorted', () => { - expect(wrapper.props().data).toEqual(store.data); - }); - - it('should update store.sortField correctly', () => { - expect(store.sortField).toEqual(defaultSorted[0].dataField); - }); - - it('should update store.sortOrder correctly', () => { - expect(store.sortOrder).toEqual(defaultSorted[0].order); - }); - - describe('when column.onSort prop is defined', () => { - const onSortCB = jest.fn(); - - beforeEach(() => { - columns[1].onSort = onSortCB; - wrapper = shallow( - - ); - }); - - it('should calling column.onSort function correctly', () => { - expect(onSortCB).toHaveBeenCalledTimes(1); - expect(onSortCB).toHaveBeenCalledWith(defaultSorted[0].dataField, defaultSorted[0].order); - }); - }); - }); - - describe('componentWillReceiveProps', () => { - let nextProps; - - beforeEach(() => { - nextProps = { columns, store }; - store.sortField = columns[1].dataField; - store.sortOrder = Const.SORT_DESC; - store.sortBy = sinon.stub(); - }); - - it('should sorting again', () => { - wrapper.instance().componentWillReceiveProps(nextProps); - expect(store.sortBy.calledOnce).toBeTruthy(); - }); - }); -}); diff --git a/packages/react-bootstrap-table2/test/store/index.test.js b/packages/react-bootstrap-table2/test/store/index.test.js deleted file mode 100644 index a257272..0000000 --- a/packages/react-bootstrap-table2/test/store/index.test.js +++ /dev/null @@ -1,109 +0,0 @@ -import Store from '../../src/store'; -import Const from '../../src/const'; - -describe('Store Base', () => { - let store; - let data; - - beforeEach(() => { - data = [ - { id: 3, name: 'name2' }, - { id: 2, name: 'ABC' }, - { id: 4, name: '123tester' }, - { id: 1, name: '!@#' } - ]; - store = new Store('id'); - store.data = data; - }); - - describe('initialize', () => { - it('should have correct initialize data', () => { - expect(store.sortOrder).toBeUndefined(); - expect(store.sortField).toBeUndefined(); - expect(store.data.length).toEqual(data.length); - }); - }); - - describe('setSort', () => { - let dataField; - - beforeEach(() => { - dataField = 'name'; - }); - - it('should change sortField by dataField param', () => { - store.setSort({ dataField }); - expect(store.sortField).toEqual(dataField); - }); - - it('should change sortOrder correctly when sortBy same dataField', () => { - store.setSort({ dataField }); - expect(store.sortOrder).toEqual(Const.SORT_DESC); - store.setSort({ dataField }); - expect(store.sortOrder).toEqual(Const.SORT_ASC); - }); - - it('should change sortOrder correctly when sortBy different dataField', () => { - store.setSort({ dataField }); - expect(store.sortOrder).toEqual(Const.SORT_DESC); - - dataField = 'id'; - store.setSort({ dataField }); - expect(store.sortOrder).toEqual(Const.SORT_DESC); - - dataField = 'name'; - store.setSort({ dataField }); - expect(store.sortOrder).toEqual(Const.SORT_DESC); - }); - - it('should force assign sortOrder correctly if second argument is given', () => { - store.setSort({ dataField }, Const.SORT_DESC); - expect(store.sortOrder).toEqual(Const.SORT_DESC); - }); - - it('should force assign sortOrder correctly if third argument is given', () => { - store.setSort({ dataField }, undefined, Const.SORT_ASC); - expect(store.sortOrder).toEqual(Const.SORT_ASC); - }); - }); - - describe('sortBy', () => { - let dataField; - - beforeEach(() => { - dataField = 'name'; - }); - - it('should have correct result after sortBy', () => { - store.sortBy({ dataField }); - const result = store.data.map(e => e[dataField]).sort((a, b) => b - a); - store.data.forEach((e, i) => { - expect(e[dataField]).toEqual(result[i]); - }); - }); - }); - - describe('edit', () => { - it('should update a specified field correctly', () => { - const newValue = 'newValue'; - const dataField = 'name'; - const rowId = 2; - store.edit(rowId, dataField, newValue); - - const row = store.data.find(d => d[store.keyField] === rowId); - expect(row[dataField]).toEqual(newValue); - }); - - it('should not throw any error even if rowId is not existing', () => { - expect(() => { - store.edit('123', 'name', 'value'); - }).not.toThrow(); - }); - - it('should throwing error if dataField is not existing', () => { - expect(() => { - store.edit(2, 'non_exist_field', 'value'); - }).toThrow(); - }); - }); -}); diff --git a/packages/react-bootstrap-table2/test/store/mutate.test.js b/packages/react-bootstrap-table2/test/store/mutate.test.js new file mode 100644 index 0000000..7a6b050 --- /dev/null +++ b/packages/react-bootstrap-table2/test/store/mutate.test.js @@ -0,0 +1,32 @@ +import { editCell } from '../../src/store/mutate'; + +describe('Mutate Function', () => { + const data = [ + { id: 3, name: 'name2' }, + { id: 2, name: 'ABC' }, + { id: 4, name: '123tester' }, + { id: 1, name: '!@#' } + ]; + + const keyField = 'id'; + + describe('editCell', () => { + let rowId; + const editField = 'name'; + const newValue = 'tester'; + + it('should edit successfully if row is existing', () => { + rowId = data[0][keyField]; + + editCell(data, keyField, rowId, editField, newValue); + expect(data[0][editField]).toEqual(newValue); + }); + + it('should not mutate cell if row is not existing', () => { + rowId = 100; + + editCell(data, keyField, rowId, editField, newValue); + expect(data).toEqual(data); + }); + }); +}); diff --git a/packages/react-bootstrap-table2/test/store/rows.test.js b/packages/react-bootstrap-table2/test/store/rows.test.js index e8d1731..876d085 100644 --- a/packages/react-bootstrap-table2/test/store/rows.test.js +++ b/packages/react-bootstrap-table2/test/store/rows.test.js @@ -1,5 +1,4 @@ -import Store from '../../src/store'; -import { getRowByRowId } from '../../src/store/rows'; +import { getRowByRowId, matchRow } from '../../src/store/rows'; describe('Rows Function', () => { const data = [ @@ -9,22 +8,28 @@ describe('Rows Function', () => { { id: 1, name: '!@#' } ]; const keyField = 'id'; - let store; - let fn; - - beforeEach(() => { - store = new Store(keyField); - store.data = data; - fn = getRowByRowId(store); - }); describe('getRowByRowId', () => { it('should returning correct row', () => { - expect(fn(2)).toEqual(data[1]); + expect(getRowByRowId(data, keyField, 2)).toEqual(data[1]); }); it('should returning undefined if not existing', () => { - expect(fn(20)).not.toBeDefined(); + expect(getRowByRowId(data, keyField, 20)).not.toBeDefined(); + }); + }); + + describe('matchRow', () => { + it('should return true if keyField and id is match', () => { + const row = data[0]; + const fn = matchRow(keyField, row[keyField]); + expect(fn(row)).toBeTruthy(); + }); + + it('should return false if keyField and id is not match', () => { + const row = data[0]; + const fn = matchRow(keyField, 0); + expect(fn(row)).toBeFalsy(); }); }); }); diff --git a/packages/react-bootstrap-table2/test/store/selection.test.js b/packages/react-bootstrap-table2/test/store/selection.test.js index 6d453c7..bed3f30 100644 --- a/packages/react-bootstrap-table2/test/store/selection.test.js +++ b/packages/react-bootstrap-table2/test/store/selection.test.js @@ -1,10 +1,8 @@ -import Store from '../../src/store'; import { - isSelectedAll, - isAnySelectedRow, selectableKeys, unSelectableKeys, - getSelectedRows + getSelectedRows, + getSelectionSummary } from '../../src/store/selection'; describe('Selection Function', () => { @@ -15,90 +13,73 @@ describe('Selection Function', () => { { id: 1, name: '!@#' } ]; const keyField = 'id'; - let store; let skip; - let fn; - - beforeEach(() => { - store = new Store(keyField); - store.data = data; - }); - - describe('isSelectedAll', () => { - it('should returning false when store.selected is not cover all rows', () => { - expect(isSelectedAll(store)).toBeFalsy(); - store.selected = [data[0][keyField]]; - expect(isSelectedAll(store)).toBeFalsy(); - }); - - it('should returning true when store.selected is cover all rows', () => { - store.selected = data.map(d => d[keyField]); - expect(isSelectedAll(store)).toBeTruthy(); - }); - }); - - describe('isAnySelectedRow', () => { - it('should returning false if any store.selected is empty', () => { - fn = isAnySelectedRow(store); - expect(fn()).toBeFalsy(); - }); - - it('should returning false if store.selected is have same key as skips', () => { - fn = isAnySelectedRow(store); - skip = [data[0][keyField]]; - store.selected = [data[0][keyField]]; - expect(fn(skip)).toBeFalsy(); - }); - - it('should returning true if store.selected is not empty', () => { - store.selected = [data[0][keyField]]; - fn = isAnySelectedRow(store); - expect(fn()).toBeTruthy(); - }); - - it('should returning true if length of store.selected is bigger than skips', () => { - store.selected = [data[0][keyField], data[2][keyField]]; - skip = [data[0][keyField]]; - fn = isAnySelectedRow(store); - expect(fn(skip)).toBeTruthy(); - }); - }); describe('selectableKeys', () => { - beforeEach(() => { - fn = selectableKeys(store); - }); - it('should returning all row keys if skip is empty', () => { - expect(fn()).toEqual(data.map(d => d[keyField])); + expect(selectableKeys(data, keyField)).toEqual(data.map(d => d[keyField])); }); it('should returngin row keys expect the skip', () => { skip = [data[1][keyField]]; - expect(fn(skip)).toHaveLength(data.length - skip.length); + expect(selectableKeys(data, keyField, skip)).toHaveLength(data.length - skip.length); }); }); describe('unSelectableKeys', () => { it('should returning empty array if skip is empty', () => { - fn = unSelectableKeys(store); - expect(fn()).toHaveLength(0); + expect(unSelectableKeys()).toHaveLength(0); }); it('should returning array which must contain skip', () => { skip = [data[1][keyField]]; - store.selected = data.map(d => d[keyField]); - fn = unSelectableKeys(store); - expect(fn(skip)).toHaveLength(skip.length); + const selected = data.map(d => d[keyField]); + expect(unSelectableKeys(selected, skip)).toHaveLength(skip.length); }); }); describe('getSelectedRows', () => { it('should returning rows object correctly', () => { - store.selected = data.map(d => d[keyField]); - const result = getSelectedRows(store); - expect(result).toHaveLength(store.selected.length); - expect(result).toEqual(store.data); + const selected = data.map(d => d[keyField]); + const result = getSelectedRows(data, keyField, selected); + expect(result).toHaveLength(selected.length); + expect(result).toEqual(data); + }); + }); + + describe('getSelectionSummary', () => { + let result; + + describe('if selected argument is able to cover all the data argument', () => { + it('should return an obj which allRowsSelected is true and allRowsNotSelected is false', () => { + const selected = data.map(d => d[keyField]); + result = getSelectionSummary(data, keyField, selected); + expect(result).toEqual({ + allRowsSelected: true, + allRowsNotSelected: false + }); + }); + }); + + describe('if selected argument empty', () => { + it('should return an obj which allRowsSelected is false but allRowsNotSelected is true', () => { + result = getSelectionSummary(data, keyField); + expect(result).toEqual({ + allRowsSelected: false, + allRowsNotSelected: true + }); + }); + }); + + describe('if selected argument is only cover partial data', () => { + it('should return an obj which allRowsSelected and allRowsNotSelected both are false', () => { + const selected = [1, 2]; + result = getSelectionSummary(data, keyField, selected); + expect(result).toEqual({ + allRowsSelected: false, + allRowsNotSelected: false + }); + }); }); }); }); diff --git a/packages/react-bootstrap-table2/test/store/sort.test.js b/packages/react-bootstrap-table2/test/store/sort.test.js index 33422b9..5ca05c1 100644 --- a/packages/react-bootstrap-table2/test/store/sort.test.js +++ b/packages/react-bootstrap-table2/test/store/sort.test.js @@ -1,6 +1,5 @@ import sinon from 'sinon'; -import Store from '../../src/store'; import { sort, nextOrder } from '../../src/store/sort'; import Const from '../../src/const'; @@ -12,18 +11,17 @@ describe('Sort Function', () => { { id: 1, name: '!@#' } ]; - let store; - describe('sort', () => { - beforeEach(() => { - store = new Store('id'); - store.data = data; - }); + const sortColumn = { + dataField: 'id', + text: 'ID' + }; + let sortOrder; + let result; it('should sort array with ASC order correctly', () => { - store.sortField = 'id'; - store.sortOrder = Const.SORT_ASC; - const result = sort(store)(); + sortOrder = Const.SORT_ASC; + result = sort(data, sortOrder, sortColumn); expect(result.length).toEqual(data.length); const sortedArray = data.map(e => e.id).sort((a, b) => a - b); @@ -33,9 +31,8 @@ describe('Sort Function', () => { }); it('should sort array with DESC order correctly', () => { - store.sortField = 'id'; - store.sortOrder = Const.SORT_DESC; - const result = sort(store)(); + sortOrder = Const.SORT_DESC; + result = sort(data, sortOrder, sortColumn); expect(result.length).toEqual(data.length); const sortedArray = data.map(e => e.id).sort((a, b) => b - a); @@ -46,35 +43,49 @@ describe('Sort Function', () => { it('should call custom sort function when sortFunc given', () => { const sortFunc = sinon.stub().returns(1); - store.sortField = 'id'; - store.sortOrder = Const.SORT_DESC; - sort(store)(sortFunc); + sortOrder = Const.SORT_DESC; + sort(data, sortOrder, { ...sortColumn, sortFunc }); expect(sortFunc.callCount).toBe(6); }); }); describe('nextOrder', () => { - beforeEach(() => { - store = new Store('id'); - store.data = data; + const currentSortColumn = { + dataField: 'name', + text: 'Product Name' + }; + it('should return correcly order when current sortField is not eq next sort field', () => { + const nextSort = { + sortColumn: { + dataField: 'id', + text: 'ID' + }, + sortOrder: Const.SORT_DESC + }; + expect(nextOrder(currentSortColumn, nextSort)).toBe(Const.SORT_DESC); }); - it('should return correcly order when store.sortField is not eq next sort field', () => { - expect(nextOrder(store)('name')).toBe(Const.SORT_DESC); + it('should return correcly order if even next sort column is undefined', () => { + expect(nextOrder(currentSortColumn, {})).toBe(Const.SORT_DESC); }); - it('should return correcly order when store.sortField is not eq next sort field and default sort direction is given', () => { - expect(nextOrder(store)('name', undefined, Const.SORT_ASC)).toBe(Const.SORT_ASC); + it('should return correcly order when current sortField is not eq next sort field and default sort direction is given', () => { + const nextSort = { + sortColumn: { + dataField: 'id', + text: 'ID' + }, + sortOrder: Const.SORT_DESC + }; + expect(nextOrder(currentSortColumn, nextSort, Const.SORT_ASC)).toBe(Const.SORT_ASC); }); - it('should return correcly order when store.sortField is eq next sort field', () => { - store.sortField = 'name'; - store.sortOrder = Const.SORT_DESC; - expect(nextOrder(store)('name')).toBe(Const.SORT_ASC); - }); - - it('should return correcly order when order is specified', () => { - expect(nextOrder(store)('name', Const.SORT_ASC)).toBe(Const.SORT_ASC); + it('should return correcly order when current sortField is eq next sort field', () => { + const nextSort = { + sortColumn: currentSortColumn, + sortOrder: Const.SORT_ASC + }; + expect(nextOrder(currentSortColumn, nextSort)).toBe(Const.SORT_DESC); }); }); }); diff --git a/packages/react-bootstrap-table2/test/test-helpers/mock-component.js b/packages/react-bootstrap-table2/test/test-helpers/mock-component.js index c3282a4..cb1d5b5 100644 --- a/packages/react-bootstrap-table2/test/test-helpers/mock-component.js +++ b/packages/react-bootstrap-table2/test/test-helpers/mock-component.js @@ -1,16 +1,5 @@ -import Store from '../../src/store'; export const extendTo = Base => class MockComponent extends Base { - constructor(props) { - super(props); - - const { data } = props; - - this.store = new Store(props.keyField); - this.store.data = data; - this.state = { data }; - } - render() { return null; } };