import { later, mockScrollIntoView } from '../../../test';
import { mountForm, submitForm, getSimpleRules } from './shared';
test('rules prop - execute order', async () => {
const onFailed = jest.fn();
const wrapper = mountForm({
template: `
`,
data() {
return {
rules: [
{ required: true, message: 'A' },
{ validator: (val) => val.length > 6, message: 'B' },
{ validator: (val) => val !== 'foo', message: 'C' },
],
};
},
methods: {
onFailed,
},
});
await submitForm(wrapper);
expect(onFailed).toHaveBeenCalledWith({
errors: [{ message: 'B', name: 'A' }],
values: { A: '123' },
});
});
test('rules prop - pattern', async () => {
const onFailed = jest.fn();
const wrapper = mountForm({
template: `
`,
data() {
return {
rules: [{ pattern: /\d{6}/, message: 'foo' }],
};
},
methods: {
onFailed,
},
});
await submitForm(wrapper);
expect(onFailed).toHaveBeenCalledWith({
errors: [{ message: 'foo', name: 'A' }],
values: { A: '123' },
});
});
test('rules prop - message function', async () => {
const onFailed = jest.fn();
const wrapper = mountForm({
template: `
`,
data() {
return {
rules: [{ pattern: /\d{6}/, message: (val) => val }],
};
},
methods: {
onFailed,
},
});
await submitForm(wrapper);
expect(onFailed).toHaveBeenCalledWith({
errors: [{ message: '123', name: 'A' }],
values: { A: '123' },
});
});
test('rules prop - formatter', async () => {
const onFailed = jest.fn();
const wrapper = mountForm({
template: `
`,
data() {
return {
rules: [
{
message: 'foo',
required: true,
formatter: (val, rule) => {
expect(rule.message).toEqual('foo');
return val.trim();
},
},
],
};
},
methods: {
onFailed,
},
});
await submitForm(wrapper);
expect(onFailed).toHaveBeenCalledWith({
errors: [{ message: 'foo', name: 'A' }],
values: { A: ' ' },
});
});
test('rules prop - async validator', async () => {
const onFailed = jest.fn();
const wrapper = mountForm({
template: `
`,
data() {
return {
rules: [
{
validator: (value, rule) => {
expect(value).toEqual('123');
expect(typeof rule).toEqual('object');
return new Promise((resolve) => resolve(true));
},
message: 'should pass',
},
{
validator: () => new Promise((resolve) => resolve(false)),
message: 'should fail',
},
],
};
},
methods: {
onFailed,
},
});
await submitForm(wrapper);
expect(onFailed).toHaveBeenCalledWith({
errors: [{ message: 'should fail', name: 'A' }],
values: { A: '123' },
});
});
test('validate-first prop', async () => {
const onSubmit = jest.fn();
const onFailed = jest.fn();
const wrapper = mountForm({
template: `
`,
data() {
return {
...getSimpleRules(),
value: '',
};
},
methods: {
onSubmit,
onFailed,
},
});
await submitForm(wrapper);
expect(wrapper).toMatchSnapshot();
expect(onFailed).toHaveBeenCalledWith({
errors: [{ message: 'A failed', name: 'A' }],
values: { A: '', B: '' },
});
wrapper.setData({ value: 'foo' });
await submitForm(wrapper);
expect(onSubmit).toHaveBeenCalledWith({ A: 'foo', B: 'foo' });
});
test('colon prop', () => {
const wrapper = mountForm({
template: `
Custom Label
`,
});
expect(wrapper).toMatchSnapshot();
});
test('label-align prop', () => {
const wrapper = mountForm({
template: `
`,
});
expect(wrapper).toMatchSnapshot();
});
test('label-width prop', () => {
const wrapper = mountForm({
template: `
`,
});
expect(wrapper).toMatchSnapshot();
});
test('input-align prop', () => {
const wrapper = mountForm({
template: `
`,
});
expect(wrapper).toMatchSnapshot();
});
test('error-message-align prop', () => {
const wrapper = mountForm({
template: `
`,
});
expect(wrapper).toMatchSnapshot();
});
test('validate-trigger - onBlur', async () => {
const wrapper = mountForm({
template: `
`,
data: getSimpleRules,
});
const input = wrapper.find('input');
input.trigger('input');
await later();
expect(wrapper.contains('.van-field__error-message')).toBeFalsy();
input.trigger('blur');
await later();
expect(wrapper.contains('.van-field__error-message')).toBeTruthy();
});
test('validate-trigger - onChange', async () => {
const wrapper = mountForm({
template: `
`,
data() {
return {
...getSimpleRules(),
value: '',
};
},
});
const input = wrapper.find('input');
input.trigger('blur');
await later();
expect(wrapper.contains('.van-field__error-message')).toBeFalsy();
wrapper.setData({ value: '1' });
await later();
expect(wrapper.contains('.van-field__error-message')).toBeFalsy();
wrapper.setData({ value: '' });
await later();
expect(wrapper.contains('.van-field__error-message')).toBeTruthy();
});
test('validate-trigger - custom trigger in rules', async () => {
const wrapper = mountForm({
template: `
`,
data() {
return {
valueA: '',
valueB: '',
rulesA: [
{
message: 'A',
required: true,
trigger: 'onChange',
},
],
rulesB: [
{
message: 'B',
required: true,
trigger: 'onBlur',
},
],
};
},
});
const inputs = wrapper.findAll('input');
inputs.at(0).trigger('blur');
wrapper.setData({ valueB: '1' });
await later();
wrapper.setData({ valueB: '' });
await later();
expect(wrapper.contains('.van-field__error-message')).toBeFalsy();
inputs.at(1).trigger('blur');
wrapper.setData({ valueA: '1' });
await later();
wrapper.setData({ valueA: '' });
await later();
expect(
wrapper.element.querySelectorAll('.van-field__error-message').length
).toEqual(2);
});
test('scroll-to-error prop', async () => {
const fn = mockScrollIntoView();
const wrapper = mountForm({
template: `
`,
data: getSimpleRules,
});
await submitForm(wrapper);
expect(fn).toHaveBeenCalledTimes(1);
});
test('show-error-message prop', async () => {
const wrapper = mountForm({
template: `
`,
data() {
return {
...getSimpleRules(),
showErrorMessage: false,
};
},
});
await submitForm(wrapper);
expect(wrapper.contains('.van-field__error-message')).toBeFalsy();
wrapper.setData({ showErrorMessage: true });
await submitForm(wrapper);
expect(wrapper.contains('.van-field__error-message')).toBeTruthy();
});
test('show-error prop', async () => {
const wrapper = mountForm({
template: `
`,
data() {
return {
...getSimpleRules(),
showError: false,
};
},
});
await submitForm(wrapper);
expect(wrapper.contains('.van-field--error')).toBeFalsy();
wrapper.setData({ showError: true });
await submitForm(wrapper);
expect(wrapper.contains('.van-field--error')).toBeTruthy();
});