import React from 'react';
import { mount, shallow } from 'enzyme';
import assert from 'assert';
import sinon from 'sinon';
import _ from 'lodash';
import { common } from '../../util/generic-tests';
import { buildModernHybridComponent } from '../../util/state-management';
import { SingleSelectDumb as SingleSelect } from '../SingleSelect/SingleSelect';
import { PaginatorDumb as Paginator } from './Paginator';
import * as reducers from './Paginator.reducers';
import selectors from './Paginator.selectors';
import Button from '../Button/Button';
import TextField from '../TextField/TextField';
describe('Paginator', () => {
common(Paginator);
describe('render', () => {
describe('hasPageSizeSelector', () => {
it('should not render page size selector', () => {
const wrapper = shallow();
assert(
!wrapper.find('.lucid-Paginator-page-size-container').exists(),
'must be true'
);
});
it('should render page size selector', () => {
const wrapper = shallow();
assert.strictEqual(
wrapper.find('.lucid-Paginator-page-size-container').length,
1,
'must be 1'
);
});
it('should render a TextField', () => {
const wrapper = shallow();
assert.strictEqual(wrapper.find(TextField).length, 1, 'must be 1');
});
it('should render two buttons', () => {
const wrapper = shallow();
assert.strictEqual(wrapper.find(Button).length, 2, 'must be 2');
});
});
});
describe('props', () => {
describe('isDisabled', () => {
it('should set isDisabled on next and previous buttons', () => {
const wrapper = shallow(
);
const buttons = wrapper.find(Button);
buttons.forEach((button) => {
assert(button.prop('isDisabled'), 'must be true');
});
});
it('should set isDisabled on page size selector SingleSelect', () => {
const wrapper = shallow(
);
const pageSizeSelectorWrapper = wrapper
.find('.lucid-Paginator-page-size-container')
.first()
.shallow()
.find(SingleSelect)
.shallow();
assert(pageSizeSelectorWrapper.prop('isDisabled'), 'must be true');
});
it('should render a disabled TextField', () => {
const wrapper = shallow();
const textField = wrapper.find(TextField);
assert(textField.prop('isDisabled'), 'must be true');
});
});
describe('selectedPageIndex', () => {
it('should set the value of the TextField to selectedPageIndex + 1', () => {
const wrapper = shallow();
const textFieldWrapper = wrapper.find(TextField).first().shallow();
assert.strictEqual(textFieldWrapper.prop('value'), 2, 'must be 2');
});
});
describe('selectedPageSizeIndex', () => {
it('should propagate to page size selector selectedIndex prop', () => {
const selectedPageSizeIndex = 1;
const wrapper = shallow(
);
const pageSizeSelectorWrapper = wrapper
.find('.lucid-Paginator-page-size-container')
.first()
.shallow()
.find(SingleSelect);
assert.strictEqual(
pageSizeSelectorWrapper.prop('selectedIndex'),
selectedPageSizeIndex,
'must be 1'
);
});
});
describe('SingleSelect', () => {
it('should propagate SingleSelect props through to SingleSelect component', () => {
const explicitSingleSelectProps = {
menuMaxHeight: 3,
DropMenu: {},
};
const wrapper = shallow(
);
const singleSelectProps: any = wrapper
.find('.lucid-Paginator-page-size-container')
.first()
.shallow()
.find(SingleSelect)
.props();
_.forEach(explicitSingleSelectProps, (prop, name) => {
assert.strictEqual(singleSelectProps[name], prop);
});
});
});
describe('totalPages', () => {
it('should appear in "of {totalPages}" span', () => {
const totalPages = 5;
const wrapper = shallow();
assert.strictEqual(
wrapper.find('span').text(),
`of ${totalPages}`,
'must be "of 5"'
);
});
});
describe('totalCount', () => {
it('should generate `totalPages` from `totalCount`', () => {
const HybridPaginator: any = buildModernHybridComponent(Paginator, {
reducers,
selectors,
} as any);
const totalCount = 100;
const wrapper = shallow(
);
assert.strictEqual(
wrapper.find(Paginator).shallow().find('span').text(),
'of 10',
'must be "of 10"'
);
});
});
describe('pageSizeOptions', () => {
it('should propagate to `SingleSelect` as `SingleSelect.Option`s', () => {
const pageSizeOptions = [1, 2, 3, 4, 5];
const wrapper = shallow(
);
const options = wrapper
.find('.lucid-Paginator-page-size-container')
.first()
.find(SingleSelect)
.first()
.children();
assert.strictEqual(options.length, 5, 'must be 5');
options.forEach((option, i) => {
assert(option.is(SingleSelect.Option), 'must be true');
assert.strictEqual(
option.children().text(),
pageSizeOptions[i].toString()
);
});
});
});
describe('TextField', () => {
it('should propagate TextField props through to TextField component', () => {
const explicitTextFieldProps: any = {
style: {},
isMultiline: true,
rows: 2,
className: 'foo',
debounceLevel: 50,
};
const wrapper = shallow(
);
const textFieldProps: any = wrapper.find(TextField).first().props();
_.forEach(explicitTextFieldProps, (prop, name) => {
assert.strictEqual(textFieldProps[name], prop);
});
});
});
describe('onPageSelect', () => {
let wrapper: any;
afterEach(() => {
if (wrapper) {
wrapper.unmount();
}
});
describe('previous button', () => {
it('should get called with the correct args when previous is clicked', () => {
const onPageSelect = sinon.spy();
wrapper = mount(
);
wrapper.find('button').first().simulate('click');
assert(onPageSelect.calledOnce);
const [pageIndex, totalPages] = onPageSelect.firstCall.args;
assert.strictEqual(pageIndex, 0, 'must be 0');
assert.strictEqual(totalPages, 3, 'must be 3');
});
});
describe('next button', () => {
it('should get called with the correct args when next is clicked', () => {
const onPageSelect = sinon.spy();
wrapper = mount(
);
wrapper.find('button').first().simulate('click');
assert(onPageSelect.calledOnce);
const [pageIndex, totalPages] = onPageSelect.firstCall.args;
assert.strictEqual(pageIndex, 0, 'must be 0');
assert.strictEqual(totalPages, 3, 'must be 3');
});
});
describe('input', () => {
_.forEach(['onBlur', 'onSubmit'], (propName) => {
it(`should get called with the correct args ${propName}`, () => {
const onPageSelect = sinon.spy();
wrapper = mount(
);
wrapper.find(TextField).prop(propName)(1, 3);
assert(onPageSelect.calledOnce);
const [pageIndex, totalPages] = onPageSelect.firstCall.args;
assert.strictEqual(pageIndex, 0, 'must be 0');
assert.strictEqual(totalPages, 3, 'must be 3');
});
});
});
});
describe('onPageSizeSelect', () => {
it('should be passed through to SingleSelect as `onSelect`', () => {
const onPageSizeSelect = () => {};
const wrapper = shallow(
);
assert.strictEqual(
wrapper.find(SingleSelect).prop('onSelect'),
onPageSizeSelect
);
});
});
describe('showTotalObjects', () => {
it('should not show a total count when totalCount is null', () => {
const wrapper = shallow();
expect(wrapper.find('.lucid-Paginator-total-count')).toHaveLength(0);
});
it('should show a total count', () => {
const wrapper = shallow(
);
expect(wrapper.exists('.lucid-Paginator-total-count')).toEqual(true);
expect(wrapper.find('.lucid-Paginator-total-count').text()).toContain(
'101 Objects'
);
});
it('should show a total count', () => {
const wrapper = shallow();
expect(wrapper.exists('.lucid-Paginator-total-count')).toEqual(true);
expect(wrapper.find('.lucid-Paginator-total-count').text()).toContain(
'1 Object'
);
});
});
describe('objectLabel for total count', () => {
it('should show the objectLabel with totalCount = 1', () => {
const wrapper = shallow(
);
expect(wrapper.find('.lucid-Paginator-total-count').text()).toContain(
'1 test123'
);
});
it('should show the objectLabelPlural with totalCount = 2', () => {
const wrapper = shallow(
);
expect(wrapper.find('.lucid-Paginator-total-count').text()).toContain(
'2 twocounts'
);
});
});
});
});