box-ui-elements-mlh
Version:
225 lines (175 loc) • 7.99 kB
JavaScript
import PropTypes from 'prop-types';
import React from 'react';
import { shallow, mount } from 'enzyme';
import sinon from 'sinon';
import TextArea from '..';
const sandbox = sinon.sandbox.create();
describe('components/form-elements/text-area/TextArea', () => {
afterEach(() => {
sandbox.verifyAndRestore();
});
test('should correctly render default component', () => {
const wrapper = shallow(<TextArea label="label" name="textarea" />);
expect(wrapper.find('TextArea').length).toEqual(1);
});
test('should update state if value prop changes', () => {
const wrapper = shallow(<TextArea label="label" name="textarea" value="test" />);
wrapper.setProps({ value: 'new prop' });
expect(wrapper.state('value')).toEqual('new prop');
});
test('should mark required fields invalid when empty', () => {
const wrapper = mount(<TextArea className="coverage" isRequired label="label" name="input" />);
const textarea = wrapper.find('textarea');
textarea.simulate('blur');
expect(wrapper.find('.text-area-container').hasClass('show-error')).toBeTruthy();
});
test('should mark required fields valid when not empty', () => {
const wrapper = mount(<TextArea isRequired label="label" name="textarea" value="baba" />);
const textarea = wrapper.find('textarea');
textarea.simulate('blur');
expect(wrapper.find('.text-area-container').hasClass('show-error')).toBeFalsy();
});
test('should correctly validate when change event is fired', () => {
const wrapper = mount(<TextArea isRequired label="label" name="textarea" value="" />);
const textarea = wrapper.find('textarea');
textarea.simulate('blur');
expect(wrapper.find('.text-area-container').hasClass('show-error')).toBeTruthy();
wrapper.setProps({ value: 'a' });
textarea.simulate('blur');
textarea.simulate('change', {
currentTarget: {
value: 'a',
},
});
expect(wrapper.find('.text-area-container').hasClass('show-error')).toBeFalsy();
});
test('should set an textarea as valid when the validityFn returns an void', () => {
function validityFn() {}
const wrapper = mount(<TextArea label="label" name="textarea" type="custom" validation={validityFn} />);
const textarea = wrapper.find('textarea');
textarea.simulate('blur');
expect(textarea.instance().validity.valid).toBeTruthy();
});
test('should set an textarea as invalid when the validityFn returns an error string and input is not empty', () => {
function validityFn() {
return {
code: 'errCode',
message: 'errMessage',
};
}
const wrapper = mount(
<TextArea label="label" name="textarea" type="custom" validation={validityFn} value="yes" />,
);
const textarea = wrapper.find('textarea');
textarea.simulate('blur');
expect(textarea.instance().validity.valid).toBeFalsy();
});
test('should set an textarea as valid when intially then fixed when using validityFn', () => {
const stub = sinon.stub();
stub.onCall(0).returns({
code: 'errCode',
message: 'errMessage',
});
stub.onCall(1).returns();
const wrapper = mount(<TextArea label="label" name="textarea" type="custom" validation={stub} value="yes" />);
let textarea = wrapper.find('textarea');
textarea.simulate('blur');
expect(textarea.instance().validity.valid).toBeFalsy();
// Get the re-rendered textarea again
textarea = wrapper.find('textarea');
textarea.simulate('blur');
expect(textarea.instance().validity.valid).toBeTruthy();
});
test('should not set textarea invalid when the validityFn returns an error string and textarea is empty and not required', () => {
function validityFn() {
return {
code: 'errCode',
message: 'errMessage',
};
}
const wrapper = mount(<TextArea label="label" name="textarea" type="custom" validation={validityFn} />);
const textarea = wrapper.find('textarea');
textarea.simulate('blur');
expect(textarea.instance().validity.valid).toBeTruthy();
});
test('should set textarea invalid when the validityFn returns an error string, textarea is empty and is required', () => {
function validityFn() {
return {
code: 'errCode',
message: 'errMessage',
};
}
const wrapper = mount(
<TextArea isRequired label="label" name="textarea" type="custom" validation={validityFn} />,
);
const textarea = wrapper.find('textarea');
textarea.simulate('blur');
expect(textarea.instance().validity.valid).toBeFalsy();
});
test('should re-validate when textarea is set via props programaticallly', () => {
const wrapper = mount(<TextArea isRequired label="label" name="textarea" value="" />);
const textarea = wrapper.find('textarea');
textarea.simulate('blur');
expect(wrapper.find('.text-area-container').hasClass('show-error')).toBeTruthy();
wrapper.setProps({ value: 'abba' });
textarea.simulate('blur');
const textareaEl = textarea.getDOMNode();
textareaEl.value = 'a';
textarea.simulate('change', {
currentTarget: textareaEl,
});
wrapper.update();
expect(wrapper.find('.text-area-container').hasClass('show-error')).toBeFalsy();
});
test('should validate onChange when textarea is already in error state', () => {
const wrapper = mount(<TextArea isRequired label="label" name="textarea" value="" />);
const textarea = wrapper.find('textarea');
textarea.simulate('blur');
expect(wrapper.find('.text-area-container').hasClass('show-error')).toBeTruthy();
const textareaEl = textarea.getDOMNode();
textareaEl.value = 'a';
textarea.simulate('change', {
currentTarget: textareaEl,
});
wrapper.update();
expect(wrapper.find('.text-area-container').hasClass('show-error')).toBeFalsy();
});
test('should set validity state when set validity state handler is called with custom error', () => {
const validityStateHandlerSpy = sinon.spy();
const context = {
form: {
registerInput: validityStateHandlerSpy,
unregisterInput: sandbox.mock().never(),
},
};
const childContextTypes = {
form: PropTypes.object,
};
const error = {
errorCode: 'errorCode',
errorMessage: 'Error Message',
};
const component = mount(<TextArea label="label" name="textarea" value="" />, { context, childContextTypes });
validityStateHandlerSpy.callArgWith(1, error);
expect(component.state('error')).toEqual(error);
});
test('should set validity state when set validity state handler is called with ValidityState object', () => {
const validityStateHandlerSpy = sinon.spy();
const context = {
form: {
registerInput: validityStateHandlerSpy,
unregisterInput: sandbox.mock().never(),
},
};
const childContextTypes = {
form: PropTypes.object,
};
const error = {
valid: false,
badInput: true,
};
const component = mount(<TextArea label="label" name="textarea" value="" />, { context, childContextTypes });
validityStateHandlerSpy.callArgWith(1, error);
expect(component.state('error').code).toEqual('badInput');
});
});