/**
* @jest-environment jsdom
*/
import React, { Component } from 'react';
import { StringSchemaType } from '@sanity/types';
import { NestedFormBuilder } from './NestedFormBuilder';
import { render } from '@testing-library/react';
import { useUnsetOption } from './hooks';
describe('NestedFormBuilder', () => {
afterEach(() => {
jest.clearAllMocks();
});
it('should invoke FormBuilderRender.resolveInputComponent and use the result in render', () => {
render();
expect(getFormBuilderCalls()).toHaveLength(1);
});
it('should not invoke onFocus during mount', () => {
render();
const propInteractions = getFormBuilderCalls()[0][0];
expect(propInteractions.onFocus).not.toHaveBeenCalled();
});
it('should use modified type', () => {
const type = createMockType({ custom: true });
const props = mockSanityProps({ type });
function CustomComponent(props: any) {
const type = useUnsetOption(props.type, 'custom');
return ;
}
render();
const propInteractions = getFormBuilderCalls()[0][0];
expect(propInteractions.type).toEqual({
...props.type,
options: {
custom: undefined,
},
});
});
});
function createMockType(options?: any): StringSchemaType {
return {
jsonType: 'string',
name: 'dummy-string-type',
options,
};
}
function mockSanityProps(overrides?: any) {
return {
value: undefined,
type: createMockType(),
onChange: jest.fn(),
onBlur: jest.fn(),
onFocus: jest.fn(),
readOnly: false,
focusPath: [],
path: ['items'],
markers: [],
level: 0,
...overrides,
};
}
// Workaround to mock FormBuilderInput (parts are tricky to mock)
const MockFormBuilderInput = jest.fn().mockReturnValue(null);
export function getFormBuilderCalls() {
return MockFormBuilderInput.mock.calls;
}
export function mockFormBuilderInput() {
return class MockFormBuilder extends Component {
componentDidMount() {
// not exactly what happens, but close enough
this.props.onFocus([]);
}
UNSAFE_componentWillReceiveProps() {
this.props.onFocus([]);
}
componentDidUpdate() {
this.props.onFocus([]);
}
resolveInputComponent() {
return MockFormBuilderInput;
}
};
}
jest.mock('@sanity/form-builder/lib/FormBuilderInput', () => ({
FormBuilderInput: mockFormBuilderInput(),
}));