react-livr-validation
Version:
react validation component with LIVR as validation engine
231 lines (220 loc) • 7.64 kB
JavaScript
import React from 'react';
import { mount } from 'enzyme';
import Validation, { DisabledOnErrors, ValidationInput } from './index';
import ValidationClass from './validation';
const LOGIN = 'login';
const PASSWORD = 'password';
const schema = {
[LOGIN]: ['required', 'not_empty'],
[PASSWORD]: ['required', 'not_empty']
};
describe('Validation', () => {
it('disabled submit with empty form', () => {
const wrapper = mount(
<Validation schema={schema} data={{}}>
<form>
<ValidationInput>
<input type="text" name={PASSWORD} />
</ValidationInput>
<ValidationInput>
<input type="text" name={LOGIN} />
</ValidationInput>
<DisabledOnErrors>
<button type="submit">submit</button>
</DisabledOnErrors>
</form>
</Validation>
);
expect(wrapper.find('button').props().disabled).toBeTruthy();
});
it('active submit with filled form', () => {
const wrapper = mount(
<Validation
schema={schema}
data={{
[PASSWORD]: '123',
[LOGIN]: '456'
}}
>
<form>
<ValidationInput>
<input type="text" name={PASSWORD} />
</ValidationInput>
<ValidationInput>
<input type="text" name={LOGIN} />
</ValidationInput>
<DisabledOnErrors>
<button type="submit">submit</button>
</DisabledOnErrors>
</form>
</Validation>
);
expect(wrapper.find('button').props().disabled).toBeFalsy();
});
it('show validation error', () => {
const wrapper = mount(
<Validation schema={schema} data={{}}>
<form>
<ValidationInput
validateOnEvents={['change']}
name={PASSWORD}
>
<input type="text" name={PASSWORD} />
</ValidationInput>
<ValidationInput validateOnEvents={['change']} name={LOGIN}>
<input type="text" name={LOGIN} />
</ValidationInput>
<DisabledOnErrors>
<button type="submit">submit</button>
</DisabledOnErrors>
</form>
</Validation>
);
wrapper.find(`input[name="${PASSWORD}"]`).simulate('change', {
target: {
value: ''
}
});
expect(
wrapper
.find(ValidationInput)
.at(0)
.find('[data-error-block]')
).toHaveLength(1);
wrapper.find(`input[name="${LOGIN}"]`).simulate('change', {
target: {
value: ''
}
});
expect(
wrapper
.find(ValidationInput)
.at(1)
.find('[data-error-block]')
).toHaveLength(1);
expect(wrapper.find('button').props().disabled).toBeTruthy();
wrapper.find(`input[name="${PASSWORD}"]`).simulate('change', {
target: {
value: '123'
}
});
expect(
wrapper
.find(ValidationInput)
.at(0)
.find('div')
).toHaveLength(1);
wrapper.find(`input[name="${LOGIN}"]`).simulate('change', {
target: {
value: '456'
}
});
expect(
wrapper
.find(ValidationInput)
.at(1)
.find('div')
).toHaveLength(1);
expect(wrapper.find('button').props().disabled).toBeFalsy();
});
it('update schema and data on receive props', () => {
const wrapper = mount(
<Validation schema={schema} data={{}}>
<form>
<ValidationInput
validateOnEvents={['change']}
name={PASSWORD}
>
<input type="text" name={PASSWORD} />
</ValidationInput>
<ValidationInput validateOnEvents={['change']} name={LOGIN}>
<input type="text" name={LOGIN} />
</ValidationInput>
<DisabledOnErrors>
<button type="submit">submit</button>
</DisabledOnErrors>
</form>
</Validation>
);
const newSchema = {
...schema,
[PASSWORD]: ['required', 'not_empty', { min_length: 10 }]
};
const createValidator = jest.spyOn(
ValidationClass.prototype,
'createValidator'
);
const validateData = jest.spyOn(
ValidationClass.prototype,
'validateData'
);
wrapper.setProps({
schema: newSchema
});
expect(createValidator).toHaveBeenCalled();
const nextData = {
login: 1,
password: 2
};
wrapper.setProps({
data: nextData
});
expect(wrapper.find(ValidationClass).node.data).toEqual(nextData);
expect(validateData).toHaveBeenCalledTimes(2);
});
it('custom rules and aliased rules', () => {
const customRules = {
alpha_chars: function() {
return function(value) {
if (typeof value === 'string') {
if (!/[a-z,A-Z]+/.test(value)) {
return 'password should contain alpha chars';
}
}
};
}
};
const aliasedRules = [
{
name: 'strong_password',
rules: { min_length: 6 },
error: 'password should have length of 6'
}
];
const customSchema = {
...schema,
[PASSWORD]: schema.password.concat([
'strong_password',
'alpha_chars'
])
};
const wrapper = mount(
<Validation
schema={customSchema}
data={{}}
rules={customRules}
aliasedRules={aliasedRules}
>
<form>
<ValidationInput
validateOnEvents={['change']}
name={PASSWORD}
>
<input type="text" name={PASSWORD} />
</ValidationInput>
<ValidationInput validateOnEvents={['change']} name={LOGIN}>
<input type="text" name={LOGIN} />
</ValidationInput>
<DisabledOnErrors>
<button type="submit">submit</button>
</DisabledOnErrors>
</form>
</Validation>
);
const { validatorBuilders } = wrapper.find(
ValidationClass
).node.validator;
expect(validatorBuilders.strong_password).toEqual(expect.any(Function));
expect(validatorBuilders.alpha_chars).toEqual(expect.any(Function));
});
});