Skip to content

Commit 3fc0cad

Browse files
authored
Merge pull request #183 from data-driven-forms/fix-data-type-array-validation
fix(renderer): data-type validation for arrays.
2 parents a5c4a95 + ab7a361 commit 3fc0cad

File tree

2 files changed

+54
-0
lines changed

2 files changed

+54
-0
lines changed

packages/react-form-renderer/src/tests/validators/validators.test.js

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,41 @@ describe('New validators', () => {
189189
it('should return numberValidator and fail', () => {
190190
expect(dataTypeValidator('integer')({ message: 'Should be super interger' })('Foo')).toEqual('Should be super interger');
191191
});
192+
193+
describe('data-type arrays', () => {
194+
it('should pass validation of an array of strings', () => {
195+
expect(dataTypeValidator('string')()([ 'Foo', 'Bar', 'Baz' ])).toBeUndefined();
196+
});
197+
198+
it('should fail validation of an array of strings', () => {
199+
expect(dataTypeValidator('string')()([ 'Foo', 'Bar', 2 ])).toBe('Field value has to be string');
200+
});
201+
202+
it('should pass validation of an array of integers', () => {
203+
expect(dataTypeValidator('integer')()([ 1, 2, 3 ])).toBeUndefined();
204+
});
205+
206+
it('should fail validation of an array of strings', () => {
207+
expect(dataTypeValidator('integer')()([ 1, 2, 2.1 ])).toBe('Value must be integer');
208+
expect(dataTypeValidator('integer')()([ 1, 2, 'foo' ])).toBe('Value must be integer');
209+
});
210+
211+
it('should pass validation of an array of numbers', () => {
212+
expect(dataTypeValidator('number')()([ 1, 2, 3.1 ])).toBeUndefined();
213+
});
214+
215+
it('should fail validation of an array of numbers', () => {
216+
expect(dataTypeValidator('number')()([ 1, 2, 'foo' ])).toBe('Values must be number');
217+
});
218+
219+
it('should pass validation of an array of booleans', () => {
220+
expect(dataTypeValidator('boolean')()([ true, true, false, false ])).toBeUndefined();
221+
});
222+
223+
it('should fail validation of an array of booleans', () => {
224+
expect(dataTypeValidator('boolean')()([ 'foo', 2, true ])).toBe('Field value has to be boolean');
225+
});
226+
});
192227
});
193228
describe('Validators default messages overrides', () => {
194229
beforeAll(() => {

packages/react-form-renderer/src/validators/index.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,15 @@ export const pattern = memoize(({ pattern, message } = {}) => {
4646
return;
4747
}
4848

49+
if (Array.isArray(value)) {
50+
const error = value.find(item => {
51+
const parsedValue = typeof item === 'string' ? item : item.toString();
52+
return pattern && !parsedValue.match(verifiedPattern);
53+
});
54+
const msg = prepareMsg(message, 'pattern').defaultMessage;
55+
return error ? typeof msg === 'string' ? msg : msg(pattern) : undefined;
56+
}
57+
4958
const parsedValue = typeof value === 'string' ? value : value.toString();
5059
if (pattern && !parsedValue.match(verifiedPattern)) {
5160
const msg = prepareMsg(message, 'pattern').defaultMessage;
@@ -133,6 +142,11 @@ const stringValidator = memoize(({ message } = {}) => {
133142
return;
134143
}
135144

145+
if (Array.isArray(value)) {
146+
const error = value.find(item => typeof item !== 'string');
147+
return error ? prepareMsg(message, 'mustBeString').defaultMessage : undefined;
148+
}
149+
136150
if (typeof value !== 'string') {
137151
return prepareMsg(message, 'mustBeString').defaultMessage;
138152
}
@@ -145,6 +159,11 @@ const booleanValidator = memoize(({ message } = {}) =>
145159
return;
146160
}
147161

162+
if (Array.isArray(value)) {
163+
const error = value.find(item => typeof item !== 'boolean');
164+
return error ? prepareMsg(message, 'mustBeBool').defaultMessage : undefined;
165+
}
166+
148167
if (typeof value !== 'boolean') {
149168
return prepareMsg(message, 'mustBeBool').defaultMessage;
150169
}

0 commit comments

Comments
 (0)