fixed-react-data-grid-custom
Version:
Excel-like grid component built with React, with editors, keyboard navigation, copy & paste, and the like
253 lines (231 loc) • 8.62 kB
JavaScript
import React from 'react';
import Cell from '../Cell';
import { shallow } from 'enzyme';
import helpers from '../helpers/test/GridPropHelpers';
import CellAction from '../CellAction';
import SimpleCellFormatter from '../formatters/SimpleCellFormatter';
const testCellMetaData = {
selected: { idx: 2, rowIdx: 3 },
dragged: null,
onCellClick: function() {},
onCellFocus: function() {},
onCellContextMenu: function() {},
onCellDoubleClick: function() {},
onCommit: function() {},
onCommitCancel: function() {},
copied: null,
handleDragEnterRow: function() {},
handleTerminateDrag: function() {},
onColumnEvent: function() {}
};
const testProps = {
rowIdx: 0,
idx: 1,
column: { name: 'col1' },
value: 'Wicklow',
isExpanded: false,
expandableOption: {},
cellMetaData: testCellMetaData,
handleDragStart: () => {},
rowData: { name: 'Johnny Test', location: 'Wicklow', likesTesting: 'Absolutely' },
height: 40,
name: 'JT'
};
const renderComponent = (extraProps) => {
return shallow(<Cell {...testProps} {...extraProps} />);
};
describe('Cell Tests', () => {
it('should render a SimpleCellFormatter with value', () => {
const wrapper = renderComponent();
const formatter = wrapper.find(SimpleCellFormatter);
expect(formatter.props().value).toEqual('Wicklow');
});
it('should render a custom formatter when specified on column', () => {
const CustomFormatter = () => <div>Custom</div>;
const column = {
formatter: CustomFormatter
};
const wrapper = renderComponent({ column });
const formatterInstance = wrapper.find(CustomFormatter);
expect(formatterInstance.props().value).toEqual('Wicklow');
});
it('should render children when those are passed', () => {
const wrapper = renderComponent({ children: (<div>Child</div>) });
expect(wrapper.children().text()).toBe('Child');
});
describe('Rendering Cell component', () => {
const shallowRenderComponent = (props) => {
const wrapper = shallow(<Cell {...props} />);
return wrapper;
};
const requiredProperties = {
rowIdx: 18,
idx: 19,
column: helpers.columns[0],
row: { key: 'value' },
value: 'requiredValue',
cellMetaData: {
selected: { idx: 2, rowIdx: 3 },
dragged: null,
onCellClick: jasmine.createSpy(),
onCellFocus: jasmine.createSpy(),
onCellContextMenu: jasmine.createSpy(),
onCellDoubleClick: jasmine.createSpy(),
onCommit: jasmine.createSpy(),
onCommitCancel: jasmine.createSpy(),
copied: null,
handleDragEnterRow: jasmine.createSpy(),
handleTerminateDrag: jasmine.createSpy(),
onColumnEvent: jasmine.createSpy()
},
rowData: helpers.rowGetter(11),
expandableOptions: { key: 'reqValue' },
isScrolling: false
};
const allProperties = {
rowIdx: 20,
idx: 21,
selected: { idx: 18 },
height: 35,
ref: () => {},
column: helpers.columns[1],
value: 'allValue',
isExpanded: true,
isRowSelected: false,
cellMetaData: {
selected: { idx: 2, rowIdx: 3 },
dragged: null,
onCellClick: jasmine.createSpy(),
onCellFocus: jasmine.createSpy(),
onCellContextMenu: jasmine.createSpy(),
onCellDoubleClick: jasmine.createSpy(),
onCommit: jasmine.createSpy(),
onCommitCancel: jasmine.createSpy(),
copied: null,
handleDragEnterRow: jasmine.createSpy(),
handleTerminateDrag: jasmine.createSpy(),
onColumnEvent: jasmine.createSpy()
},
handleDragStart: jasmine.createSpy(),
className: 'a-class-name',
cellControls: 'something',
rowData: helpers.rowGetter(10),
extraClasses: 'extra-classes',
forceUpdate: false,
expandableOptions: { key: 'value' },
isScrolling: true
};
it('passes classname property', () => {
const wrapper = shallowRenderComponent(requiredProperties);
const cellDiv = wrapper.find('div').at(0);
expect(cellDiv.hasClass('react-grid-Cell'));
});
it('passes style property', () => {
const wrapper = shallowRenderComponent(requiredProperties);
const cellDiv = wrapper.find('div').at(0);
expect(cellDiv.props().style).toBeDefined();
});
it('passes height property if available from props', () => {
const wrapper = shallowRenderComponent(allProperties);
const cellDiv = wrapper.find('div').at(0);
expect(cellDiv.props().height).toBe(35);
});
it('does not pass height property if not available from props', () => {
const wrapper = shallowRenderComponent(requiredProperties);
const cellDiv = wrapper.find('div').at(0);
expect(cellDiv.props().height).toBeUndefined();
});
it('passes value property', () => {
const wrapper = shallowRenderComponent(requiredProperties);
const cellDiv = wrapper.find('div').at(0);
expect(cellDiv.props().value).toBe('requiredValue');
});
it('does not pass unknown properties to the div', () => {
const wrapper = shallowRenderComponent(allProperties);
const cellDiv = wrapper.find('div').at(0);
expect(cellDiv.props().rowIdx).toBeUndefined();
expect(cellDiv.props().idx).toBeUndefined();
expect(cellDiv.props().selected).toBeUndefined();
expect(cellDiv.props().selectedColumn).toBeUndefined();
expect(cellDiv.props().ref).toBeUndefined();
expect(cellDiv.props().column).toBeUndefined();
expect(cellDiv.props().isExpanded).toBeUndefined();
expect(cellDiv.props().isRowSelected).toBeUndefined();
expect(cellDiv.props().cellMetaData).toBeUndefined();
expect(cellDiv.props().handleDragStart).toBeUndefined();
expect(cellDiv.props().cellControls).toBeUndefined();
expect(cellDiv.props().rowData).toBeUndefined();
expect(cellDiv.props().forceUpdate).toBeUndefined();
expect(cellDiv.props().expandableOptions).toBeUndefined();
expect(cellDiv.props().isScrolling).toBeUndefined();
});
});
describe('CellActions', () => {
const setup = (propsOverride = {}) => {
const props = Object.assign({}, {
rowIdx: 18,
idx: 19,
column: helpers.columns[0],
row: { key: 'value' },
value: 'requiredValue',
cellMetaData: {
selected: { idx: 2, rowIdx: 3 },
dragged: null,
onCellClick: jasmine.createSpy(),
onCellFocus: jasmine.createSpy(),
onCellContextMenu: jasmine.createSpy(),
onCellDoubleClick: jasmine.createSpy(),
onCommit: jasmine.createSpy(),
onCommitCancel: jasmine.createSpy(),
copied: null,
handleDragEnterRow: jasmine.createSpy(),
handleTerminateDrag: jasmine.createSpy(),
onColumnEvent: jasmine.createSpy()
},
rowData: helpers.rowGetter(11),
expandableOptions: { key: 'reqValue' },
isScrolling: false
}, propsOverride);
const wrapper = shallow(<Cell {...props} />);
return {
wrapper,
props
};
};
describe('when getCellActions is in cellMetadata', () => {
it('should render some CellActions', () => {
const action = { icon: 'glpyhicon glyphicon-link', callback: jasmine.createSpy() };
const { wrapper } = setup({
cellMetaData: {
selected: { idx: 2, rowIdx: 3 },
dragged: null,
onCellClick: jasmine.createSpy(),
onCellFocus: jasmine.createSpy(),
onCellContextMenu: jasmine.createSpy(),
onCellDoubleClick: jasmine.createSpy(),
onCommit: jasmine.createSpy(),
onCommitCancel: jasmine.createSpy(),
copied: null,
handleDragEnterRow: jasmine.createSpy(),
handleTerminateDrag: jasmine.createSpy(),
onColumnEvent: jasmine.createSpy(),
getCellActions: jasmine.createSpy().and.returnValue([action])
}
});
const renderedCellActions = wrapper.find(CellAction);
expect(renderedCellActions.length).toBe(1);
expect(renderedCellActions.props()).toEqual({
action,
isFirst: true
});
});
});
describe('when getCellActions is not in cellMetadata', () => {
it('should not render any CellActions', () => {
const { wrapper } = setup();
const renderedCellActions = wrapper.find(CellAction);
expect(renderedCellActions.length).toBe(0);
});
});
});
});