import React from 'react';
import assert from 'assert';
import { shallow } from 'enzyme';
import { UnconnectedReferenceArrayInputController as ReferenceArrayInputController } from './ReferenceArrayInputController';
describe('', () => {
const defaultProps = {
children: jest.fn(),
crudGetMatching: () => true,
crudGetMany: () => true,
input: { value: undefined },
matchingReferences: [],
meta: {},
record: undefined,
basePath: '/tags',
reference: 'tags',
resource: 'posts',
source: 'tag_ids',
translate: x => `*${x}*`,
};
it('should set isLoading to true as long as there are no references fetched and no selected references', () => {
const children = jest.fn();
shallow(
{children}
);
assert.equal(children.mock.calls[0][0].isLoading, true);
});
it('should set isLoading to true as long as there are no references fetched and there are no data found for the references already selected', () => {
const children = jest.fn();
shallow(
{children}
);
assert.equal(children.mock.calls[0][0].isLoading, true);
});
it('should set isLoading to false if the references are being searched but data from at least one selected reference was found', () => {
const children = jest.fn();
shallow(
{children}
);
assert.equal(children.mock.calls[0][0].isLoading, false);
assert.deepEqual(children.mock.calls[0][0].choices, [{ id: 1 }]);
});
it('should set error in case of references fetch error and there are no selected reference in the input value', () => {
const children = jest.fn();
shallow(
{children}
);
assert.equal(
children.mock.calls[0][0].error,
'*ra.input.references.all_missing*'
);
});
it('should set error in case of references fetch error and there are no data found for the references already selected', () => {
const children = jest.fn();
shallow(
{children}
);
assert.equal(
children.mock.calls[0][0].error,
'*ra.input.references.all_missing*'
);
});
it('should not display an error in case of references fetch error but data from at least one selected reference was found', () => {
const children = jest.fn();
shallow(
{children}
);
assert.equal(children.mock.calls[0][0].error, undefined);
assert.deepEqual(children.mock.calls[0][0].choices, [{ id: 2 }]);
});
it('should set warning if references fetch fails but selected references are not empty', () => {
const children = jest.fn();
shallow(
{children}
);
assert.equal(children.mock.calls[0][0].warning, '*fetch error*');
});
it('should set warning if references were found but selected references are not complete', () => {
const children = jest.fn();
shallow(
{children}
);
assert.equal(
children.mock.calls[0][0].warning,
'*ra.input.references.many_missing*'
);
});
it('should set warning if references were found but selected references are empty', () => {
const children = jest.fn();
shallow(
{children}
);
assert.equal(
children.mock.calls[0][0].warning,
'*ra.input.references.many_missing*'
);
});
it('should not set warning if all references were found', () => {
const children = jest.fn();
shallow(
{children}
);
assert.equal(children.mock.calls[0][0].warning, undefined);
});
it('should pass onChange down to child component', () => {
const onChange = jest.fn();
const children = jest.fn();
shallow(
{children}
);
assert.equal(children.mock.calls[0][0].onChange, onChange);
});
it('should call crudGetMatching on mount with default fetch values', () => {
const crudGetMatching = jest.fn();
shallow(
);
assert.deepEqual(crudGetMatching.mock.calls[0], [
'tags',
'posts@tag_ids',
{
page: 1,
perPage: 25,
},
{
field: 'id',
order: 'DESC',
},
{},
]);
});
it('should allow to customize crudGetMatching arguments with perPage, sort, and filter props', () => {
const crudGetMatching = jest.fn();
shallow(
);
assert.deepEqual(crudGetMatching.mock.calls[0], [
'tags',
'posts@tag_ids',
{
page: 1,
perPage: 5,
},
{
field: 'foo',
order: 'ASC',
},
{
q: 'foo',
},
]);
});
it('should call crudGetMatching when setFilter is called', () => {
const crudGetMatching = jest.fn();
const wrapper = shallow(
);
wrapper.instance().setFilter('bar');
assert.deepEqual(crudGetMatching.mock.calls[1], [
'tags',
'posts@tag_ids',
{
page: 1,
perPage: 25,
},
{
field: 'id',
order: 'DESC',
},
{
q: 'bar',
},
]);
});
it('should use custom filterToQuery function prop', () => {
const crudGetMatching = jest.fn();
const wrapper = shallow(
({ foo: searchText })}
/>
);
wrapper.instance().setFilter('bar');
assert.deepEqual(crudGetMatching.mock.calls[1], [
'tags',
'posts@tag_ids',
{
page: 1,
perPage: 25,
},
{
field: 'id',
order: 'DESC',
},
{
foo: 'bar',
},
]);
});
it('should call crudGetMany on mount if value is set', () => {
const crudGetMany = jest.fn();
shallow(
);
assert.deepEqual(crudGetMany.mock.calls[0], ['tags', [5, 6]]);
});
it('should only call crudGetMatching when calling setFilter', () => {
const crudGetMatching = jest.fn();
const crudGetMany = jest.fn();
const wrapper = shallow(
);
assert.equal(crudGetMatching.mock.calls.length, 1);
assert.equal(crudGetMany.mock.calls.length, 1);
wrapper.instance().setFilter('bar');
assert.equal(crudGetMatching.mock.calls.length, 2);
assert.equal(crudGetMany.mock.calls.length, 1);
});
it('should only call crudGetMatching when props are changed from outside', () => {
const crudGetMatching = jest.fn();
const crudGetMany = jest.fn();
const wrapper = shallow(
);
assert.equal(crudGetMatching.mock.calls.length, 1);
assert.equal(crudGetMany.mock.calls.length, 1);
wrapper.setProps({ filter: { foo: 'bar' } });
assert.deepEqual(crudGetMatching.mock.calls[1], [
'tags',
'posts@tag_ids',
{ page: 1, perPage: 25 },
{ field: 'id', order: 'DESC' },
{ foo: 'bar' },
]);
assert.equal(crudGetMany.mock.calls.length, 1);
wrapper.setProps({ sort: { field: 'foo', order: 'ASC' } });
assert.deepEqual(crudGetMatching.mock.calls[2], [
'tags',
'posts@tag_ids',
{ page: 1, perPage: 25 },
{ field: 'foo', order: 'ASC' },
{ foo: 'bar' },
]);
assert.equal(crudGetMany.mock.calls.length, 1);
wrapper.setProps({ perPage: 42 });
assert.deepEqual(crudGetMatching.mock.calls[3], [
'tags',
'posts@tag_ids',
{ page: 1, perPage: 42 },
{ field: 'foo', order: 'ASC' },
{ foo: 'bar' },
]);
assert.equal(crudGetMany.mock.calls.length, 1);
});
it('should call crudGetMany when input value changes', () => {
const crudGetMany = jest.fn();
const wrapper = shallow(
);
assert.equal(crudGetMany.mock.calls.length, 1);
wrapper.setProps({ input: { value: [6] } });
assert.equal(crudGetMany.mock.calls.length, 2);
});
it('should call crudGetMany when input value changes only with the additional input values', () => {
const crudGetMany = jest.fn();
const wrapper = shallow(
);
expect(
crudGetMany.mock.calls[crudGetMany.mock.calls.length - 1]
).toEqual([defaultProps.reference, [5]]);
wrapper.setProps({ input: { value: [5, 6] } });
expect(
crudGetMany.mock.calls[crudGetMany.mock.calls.length - 1]
).toEqual([defaultProps.reference, [6]]);
});
it('should not call crudGetMany when already fetched input value changes', () => {
const crudGetMany = jest.fn();
const wrapper = shallow(
);
expect(crudGetMany.mock.calls[0]).toEqual([
defaultProps.reference,
[5, 6],
]);
wrapper.setProps({ input: { value: [6] } });
expect(crudGetMany.mock.calls.length).toEqual(1);
});
it('should only call crudGetOne and not crudGetMatching when only the record changes', () => {
const crudGetMany = jest.fn();
const crudGetMatching = jest.fn();
const wrapper = shallow(
);
assert.equal(crudGetMatching.mock.calls.length, 1);
assert.equal(crudGetMany.mock.calls.length, 1);
wrapper.setProps({ record: { id: 1 } });
assert.equal(crudGetMatching.mock.calls.length, 2);
assert.equal(crudGetMany.mock.calls.length, 1);
});
});