import { fireEvent } from '@testing-library/react';
import { render, unmountComponentAtNode } from 'react-dom';
import { act } from 'react-dom/test-utils';
import CustomInput from '../../customInput/CustomInput';
import {
IAdornmentConfig,
IIconConfig,
ITextfieldConfig,
} from '../../customInput/Types';
let container: any = null;
jest.mock('@material-ui/core/styles/makeStyles', () => {
return () => () => ({});
});
jest.mock('@material-ui/core/FormControl', () => {
return props => {
const { children } = props;
return
{children}
;
};
});
jest.mock('@material-ui/core/InputLabel', () => {
return props => {
return {props.children}
;
};
});
jest.mock('@material-ui/core/Input', () => {
return props => {
const { type, onBlur, endAdornment } = props;
return (
<>
{type}
{endAdornment}
>
);
};
});
jest.mock('@material-ui/core/TextField', () => {
return props => {
const { helperText, onBlur, onChange, label, className } = props;
return (
{className}
{label}
{helperText}
);
};
});
jest.mock('@material-ui/core/Grid', () => {
return props => {
const { children } = props;
return {children}
;
};
});
describe('Test CustomInput', () => {
beforeEach(() => {
container = document.createElement('div');
document.body.appendChild(container);
});
afterEach(() => {
unmountComponentAtNode(container);
container.remove();
container = null;
});
test('test text type input', () => {
const handleBlur = jest.fn();
const mockTextConfig: ITextfieldConfig = {
variant: 'standard',
label: 'test text',
key: 'text',
className: 'classname',
onBlur: handleBlur,
};
act(() => {
render(
true}
/>,
container
);
});
expect(container.querySelectorAll('.text-field').length).toBe(1);
expect(container.querySelector('.text-class').textContent).toBe(
'classname'
);
expect(container.querySelector('.text-label').textContent).toBe(
'test text'
);
const input = container.querySelector('.text-input');
input.focus();
input.blur();
expect(handleBlur).toHaveBeenCalledTimes(1);
});
test('test icon type input', () => {
const handleChange = jest.fn();
const mockIconConfig: IIconConfig = {
icon: ,
inputType: 'icon',
inputConfig: {
label: 'icon text',
key: 'icon',
onChange: handleChange,
variant: 'standard',
},
};
render(
true}
/>,
container
);
expect(container.querySelectorAll('.grid').length).toBe(3);
expect(container.querySelectorAll('.icon').length).toBe(1);
expect(container.querySelector('.text-label').textContent).toBe(
'icon text'
);
const input = container.querySelector('.text-input');
fireEvent.change(input, { target: { value: 'trigger change' } });
expect(handleChange).toHaveBeenCalledTimes(1);
});
test('test adornmentConfig type input', () => {
const mockBlurFunc = jest.fn();
const mockAdornmentConfig: IAdornmentConfig = {
label: 'adornment',
icon: ,
isPasswordType: false,
key: 'adornment',
onInputBlur: mockBlurFunc,
};
render(
true}
/>,
container
);
expect(container.querySelector('.label').textContent).toBe('adornment');
expect(container.querySelector('.type').textContent).toBe('text');
expect(container.querySelectorAll('.adornment-icon').length).toBe(1);
const input = container.querySelector('.input');
input.focus();
input.blur();
expect(mockBlurFunc).toHaveBeenCalledTimes(1);
});
test('test default type input', () => {
const mockTextConfig: ITextfieldConfig = {
label: 'default',
key: 'default',
variant: 'standard',
};
act(() => {
render(, container);
});
expect(container.querySelector('.text-label').textContent).toBe('default');
});
});