Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 9428f2d

Browse files
refine cell edit tests
1 parent 21344ec commit 9428f2d

File tree

10 files changed

+402
-477
lines changed

10 files changed

+402
-477
lines changed

‎packages/react-bootstrap-table2/test/cell-edit/editing-cell.test.js renamed to ‎packages/react-bootstrap-table2-editor/test/editing-cell.test.js

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,23 @@
1+
/* eslint react/prop-types: 0 */
12
import 'jsdom-global/register';
23
import React from 'react';
34
import sinon from 'sinon';
45
import { shallow, mount } from 'enzyme';
56

6-
import { TableRowWrapper } from '../test-helpers/table-wrapper';
7-
import EditingCell from '../../src/cell-edit/editing-cell';
8-
import TextEditor from '../../src/cell-edit/text-editor';
9-
import EditorIndicator from '../../src/cell-edit/editor-indicator';
7+
import _ from 'react-bootstrap-table2/src/utils';
8+
import editingCellFactory from '../src/editing-cell';
9+
import TextEditor from '../src/text-editor';
10+
import EditorIndicator from '../src/editor-indicator';
11+
12+
const EditingCell = editingCellFactory(_);
13+
const TableRowWrapper = props => (
14+
<table>
15+
<tbody>
16+
<tr>{ props.children }</tr>
17+
</tbody>
18+
</table>
19+
);
20+
1021

1122
describe('EditingCell', () => {
1223
let wrapper;

‎packages/react-bootstrap-table2/test/cell-edit/text-editor.test.js renamed to ‎packages/react-bootstrap-table2-editor/test/text-editor.test.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import 'jsdom-global/register';
22
import React from 'react';
33
import { mount } from 'enzyme';
44

5-
import TextEditor from '../../src/cell-edit/text-editor';
5+
import TextEditor from '../src/text-editor';
66

77
describe('TextEditor', () => {
88
let wrapper;
Lines changed: 330 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,330 @@
1+
import React from 'react';
2+
import sinon from 'sinon';
3+
import { shallow } from 'enzyme';
4+
5+
import _ from 'react-bootstrap-table2/src/utils';
6+
import remoteResolver from 'react-bootstrap-table2/src/props-resolver/remote-resolver';
7+
import Store from 'react-bootstrap-table2/src/store';
8+
import BootstrapTable from 'react-bootstrap-table2/src/bootstrap-table';
9+
import cellEditFactory from '../src';
10+
import * as Const from '../src/const';
11+
import wrapperFactory from '../src/wrapper';
12+
13+
describe('CellEditWrapper', () => {
14+
let wrapper;
15+
let instance;
16+
const onTableChangeCB = sinon.stub();
17+
const columns = [{
18+
dataField: 'id',
19+
text: 'ID'
20+
}, {
21+
dataField: 'name',
22+
text: 'Name'
23+
}];
24+
const data = [{
25+
id: 1,
26+
name: 'A'
27+
}, {
28+
id: 2,
29+
name: 'B'
30+
}];
31+
32+
const createTableProps = (props = {}) => {
33+
const { cellEdit, ...rest } = props;
34+
const tableProps = {
35+
keyField: 'id',
36+
columns,
37+
data,
38+
_,
39+
store: new Store('id'),
40+
cellEdit: cellEditFactory(cellEdit),
41+
onTableChange: onTableChangeCB,
42+
...rest
43+
};
44+
tableProps.store.data = data;
45+
return tableProps;
46+
};
47+
48+
const CellEditWrapper = wrapperFactory(BootstrapTable, {
49+
_,
50+
remoteResolver
51+
});
52+
53+
const createCellEditWrapper = (props, renderFragment = true) => {
54+
wrapper = shallow(<CellEditWrapper { ...props } />);
55+
instance = wrapper.instance();
56+
if (renderFragment) {
57+
const fragment = instance.render();
58+
wrapper = shallow(<div>{ fragment }</div>);
59+
}
60+
};
61+
62+
afterEach(() => {
63+
onTableChangeCB.reset();
64+
});
65+
66+
beforeEach(() => {
67+
const props = createTableProps({
68+
cellEdit: { mode: Const.CLICK_TO_CELL_EDIT }
69+
});
70+
createCellEditWrapper(props);
71+
});
72+
73+
it('should render CellEditWrapper correctly', () => {
74+
expect(wrapper.length).toBe(1);
75+
expect(wrapper.find(BootstrapTable)).toBeDefined();
76+
});
77+
78+
it('should have correct state', () => {
79+
expect(instance.state.ridx).toBeNull();
80+
expect(instance.state.cidx).toBeNull();
81+
expect(instance.state.message).toBeNull();
82+
expect(instance.state.isDataChanged).toBeFalsy();
83+
});
84+
85+
it('should inject correct props to base component', () => {
86+
const base = wrapper.find(BootstrapTable);
87+
expect(base.props().cellEdit).toBeDefined();
88+
expect(base.props().cellEdit.onStart).toBeDefined();
89+
expect(base.props().cellEdit.onEscape).toBeDefined();
90+
expect(base.props().cellEdit.onUpdate).toBeDefined();
91+
expect(base.props().cellEdit.EditingCell).toBeDefined();
92+
expect(base.props().cellEdit.ridx).toBeNull();
93+
expect(base.props().cellEdit.cidx).toBeNull();
94+
expect(base.props().cellEdit.message).toBeNull();
95+
expect(base.props().isDataChanged).toBe(instance.state.isDataChanged);
96+
});
97+
98+
describe('when receive new cellEdit prop', () => {
99+
const spy = jest.spyOn(CellEditWrapper.prototype, 'escapeEditing');
100+
101+
describe('and cellEdit is not work on remote', () => {
102+
beforeEach(() => {
103+
const props = createTableProps({
104+
cellEdit: { mode: Const.CLICK_TO_CELL_EDIT }
105+
});
106+
createCellEditWrapper(props);
107+
wrapper.setProps({ cellEdit: props.cellEdit });
108+
});
109+
110+
it('should always setting state.isDataChanged as false', () => {
111+
expect(instance.state.isDataChanged).toBeFalsy();
112+
});
113+
});
114+
115+
describe('and cellEdit is work on remote', () => {
116+
let errorMessage;
117+
let props;
118+
beforeEach(() => {
119+
props = createTableProps({
120+
cellEdit: { mode: Const.CLICK_TO_CELL_EDIT },
121+
remote: true
122+
});
123+
});
124+
125+
describe('and cellEdit.errorMessage is defined', () => {
126+
beforeEach(() => {
127+
createCellEditWrapper(props, false);
128+
errorMessage = 'test';
129+
const newCellEdit = {
130+
...props.cellEdit,
131+
options: { ...props.cellEdit.options, errorMessage }
132+
};
133+
wrapper.setProps({ cellEdit: newCellEdit });
134+
});
135+
136+
it('should setting correct state', () => {
137+
expect(instance.state.isDataChanged).toBeFalsy();
138+
expect(instance.state.message).toEqual(errorMessage);
139+
});
140+
});
141+
142+
describe('and cellEdit.errorMessage is undefined', () => {
143+
beforeEach(() => {
144+
errorMessage = null;
145+
createCellEditWrapper(props, false);
146+
const newCellEdit = {
147+
...props.cellEdit,
148+
options: { ...props.cellEdit.options, errorMessage }
149+
};
150+
wrapper.setProps({ cellEdit: newCellEdit });
151+
});
152+
153+
it('should setting correct state', () => {
154+
expect(wrapper.state().isDataChanged).toBeTruthy();
155+
});
156+
157+
it('should escape current editing', () => {
158+
expect(spy).toHaveBeenCalled();
159+
});
160+
});
161+
});
162+
});
163+
164+
describe('call escapeEditing function', () => {
165+
it('should set state correctly', () => {
166+
instance.escapeEditing();
167+
expect(instance.state.ridx).toBeNull();
168+
expect(instance.state.cidx).toBeNull();
169+
});
170+
});
171+
172+
describe('call startEditing function', () => {
173+
const ridx = 1;
174+
const cidx = 3;
175+
176+
it('should set state correctly', () => {
177+
instance.startEditing(ridx, cidx);
178+
expect(instance.state.ridx).toEqual(ridx);
179+
expect(instance.state.cidx).toEqual(cidx);
180+
expect(instance.state.isDataChanged).toBeFalsy();
181+
});
182+
183+
describe('if selectRow.clickToSelect is defined', () => {
184+
beforeEach(() => {
185+
const selectRow = { mode: 'checkbox', clickToSelect: true };
186+
const props = createTableProps({
187+
cellEdit: { mode: Const.CLICK_TO_CELL_EDIT },
188+
selectRow
189+
});
190+
createCellEditWrapper(props);
191+
});
192+
193+
it('should not set state', () => {
194+
instance.startEditing(ridx, cidx);
195+
expect(instance.state.ridx).toBeNull();
196+
expect(instance.state.cidx).toBeDefined();
197+
});
198+
});
199+
200+
describe('if selectRow.clickToSelect and selectRow.clickToEdit is defined', () => {
201+
beforeEach(() => {
202+
const selectRow = { mode: 'checkbox', clickToSelect: true, clickToEdit: true };
203+
const props = createTableProps({
204+
cellEdit: { mode: Const.CLICK_TO_CELL_EDIT },
205+
selectRow
206+
});
207+
createCellEditWrapper(props);
208+
});
209+
210+
it('should set state correctly', () => {
211+
instance.startEditing(ridx, cidx);
212+
expect(instance.state.ridx).toEqual(ridx);
213+
expect(instance.state.cidx).toEqual(cidx);
214+
});
215+
});
216+
});
217+
218+
describe('call completeEditing function', () => {
219+
it('should set state correctly', () => {
220+
instance.completeEditing();
221+
expect(instance.state.ridx).toBeNull();
222+
expect(instance.state.cidx).toBeNull();
223+
expect(instance.state.message).toBeNull();
224+
expect(instance.state.isDataChanged).toBeTruthy();
225+
});
226+
});
227+
228+
describe('call handleCellUpdate function', () => {
229+
let props;
230+
const row = data[0];
231+
const column = columns[1];
232+
const newValue = 'new name';
233+
234+
describe('when cell edit is work on remote', () => {
235+
const spy = jest.spyOn(CellEditWrapper.prototype, 'handleCellChange');
236+
237+
beforeEach(() => {
238+
props = createTableProps({
239+
cellEdit: { mode: Const.CLICK_TO_CELL_EDIT },
240+
remote: true
241+
});
242+
createCellEditWrapper(props);
243+
instance.handleCellUpdate(row, column, newValue);
244+
});
245+
246+
it('should calling handleCellChange correctly', () => {
247+
expect(spy).toHaveBeenCalled();
248+
expect(spy.mock.calls).toHaveLength(1);
249+
expect(spy.mock.calls[0]).toHaveLength(3);
250+
expect(spy.mock.calls[0][0]).toEqual(row.id);
251+
expect(spy.mock.calls[0][1]).toEqual(column.dataField);
252+
expect(spy.mock.calls[0][2]).toEqual(newValue);
253+
});
254+
});
255+
256+
describe('when cell edit is not work on remote', () => {
257+
const spyOnCompleteEditing = jest.spyOn(CellEditWrapper.prototype, 'completeEditing');
258+
const spyOnStoreEdit = jest.spyOn(Store.prototype, 'edit');
259+
260+
beforeEach(() => {
261+
props = createTableProps({
262+
cellEdit: { mode: Const.CLICK_TO_CELL_EDIT }
263+
});
264+
createCellEditWrapper(props);
265+
instance.handleCellUpdate(row, column, newValue);
266+
});
267+
268+
afterEach(() => {
269+
spyOnStoreEdit.mockReset();
270+
spyOnCompleteEditing.mockReset();
271+
});
272+
273+
it('should calling props.store.edit', () => {
274+
expect(spyOnStoreEdit).toHaveBeenCalled();
275+
expect(spyOnStoreEdit.mock.calls).toHaveLength(1);
276+
expect(spyOnStoreEdit.mock.calls[0]).toHaveLength(3);
277+
expect(spyOnStoreEdit.mock.calls[0][0]).toEqual(row.id);
278+
expect(spyOnStoreEdit.mock.calls[0][1]).toEqual(column.dataField);
279+
expect(spyOnStoreEdit.mock.calls[0][2]).toEqual(newValue);
280+
});
281+
282+
it('should calling completeEditing function', () => {
283+
expect(spyOnCompleteEditing).toHaveBeenCalled();
284+
});
285+
286+
describe('if cellEdit.afterSaveCell prop defined', () => {
287+
const aftereSaveCellCallBack = sinon.stub();
288+
289+
beforeEach(() => {
290+
props = createTableProps({
291+
cellEdit: {
292+
mode: Const.CLICK_TO_CELL_EDIT,
293+
afterSaveCell: aftereSaveCellCallBack
294+
}
295+
});
296+
createCellEditWrapper(props);
297+
instance.handleCellUpdate(row, column, newValue);
298+
});
299+
300+
it('should calling cellEdit.afterSaveCell correctly', () => {
301+
expect(aftereSaveCellCallBack.callCount).toBe(1);
302+
expect(aftereSaveCellCallBack.calledWith(
303+
row[column.dataField], newValue, row, column)
304+
).toBe(true);
305+
});
306+
});
307+
});
308+
309+
describe('if cellEdit.beforeSaveCell prop defined', () => {
310+
const beforeSaveCellCallBack = sinon.stub();
311+
beforeEach(() => {
312+
props = createTableProps({
313+
cellEdit: {
314+
mode: Const.CLICK_TO_CELL_EDIT,
315+
beforeSaveCell: beforeSaveCellCallBack
316+
}
317+
});
318+
createCellEditWrapper(props);
319+
instance.handleCellUpdate(row, column, newValue);
320+
});
321+
322+
it('should calling cellEdit.beforeSaveCell correctly', () => {
323+
expect(beforeSaveCellCallBack.callCount).toBe(1);
324+
expect(beforeSaveCellCallBack.calledWith(
325+
row[column.dataField], newValue, row, column)
326+
).toBe(true);
327+
});
328+
});
329+
});
330+
});

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /