Skip to content

Commit 86c05b7

Browse files
committed
Fix #73: Add choice validation for numbers and strings
1 parent b54cb9e commit 86c05b7

File tree

2 files changed

+38
-2
lines changed

2 files changed

+38
-2
lines changed

src/dataValidation.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import {normalizeKeyword, getKeyword, getKey, joinCoords, getSchemaType} from './util';
1+
import {normalizeKeyword, getKeyword, getKey, joinCoords, getSchemaType, valueInChoices} from './util';
22
import {JOIN_SYMBOL} from './constants';
33
import EditorState from './editorState';
44

@@ -255,11 +255,15 @@ export default function DataValidator(schema) {
255255
if ((schema.maxLength || schema.maxLength == 0) && data.length > parseInt(schema.maxLength))
256256
this.addError(coords, 'This value may not be longer than ' + schema.maxLength + ' characters.');
257257

258+
if (!valueInChoices(schema, data)) {
259+
this.addError(coords, 'Invalid choice "' + data + '"');
260+
return;
261+
}
262+
258263
let format = normalizeKeyword(schema.format);
259264
let format_invalid = false;
260265
let format_validator;
261266

262-
263267
switch (format) {
264268
case 'email':
265269
format_validator = this.validateEmail;
@@ -340,6 +344,11 @@ export default function DataValidator(schema) {
340344

341345
if ((schema.multipleOf || schema.multipleOf === 0) && ((data * 100) % (schema.multipleOf * 100)) / 100)
342346
this.addError(coords, 'This value must be a multiple of ' + schema.multipleOf);
347+
348+
if (!valueInChoices(schema, data)) {
349+
this.addError(coords, 'Invalid choice "' + data + '"');
350+
return;
351+
}
343352
};
344353

345354
this.validateEmail = function(schema, data, coords) {

tests/dataValidation.test.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,13 @@ test('validateString method', () => {
542542
schema['properties']['a']['required'] = false;
543543
data = {'a': ''}
544544
expect(validator.validate(data).isValid).toBe(true);
545+
546+
// 8. test invalid choice
547+
schema['properties']['a']['choices'] = ['one', 'two'];
548+
wrong_data = {'a': 'xxx'};
549+
expect(validator.validate(wrong_data).isValid).toBe(false);
550+
data = {'a': 'two'};
551+
expect(validator.validate(data).isValid).toBe(true);
545552
});
546553

547554
/* :TODO: Enable these tests later after writing format validations.
@@ -748,6 +755,16 @@ test('validateInteger method', () => {
748755
validator = new DataValidator(schema);
749756
expect(validator.validate(wrong_data).isValid).toBe(false);
750757
expect(validator.validate(data).isValid).toBe(true);
758+
759+
// 11. test invalid choice
760+
delete schema['properties']['a']['exclusiveMinimum'];
761+
delete schema['properties']['a']['exclusiveMaximum'];
762+
delete schema['properties']['a']['multipleOf'];
763+
schema['properties']['a']['choices'] = [1, 2];
764+
wrong_data = {'a': 3};
765+
expect(validator.validate(wrong_data).isValid).toBe(false);
766+
data = {'a': 1};
767+
expect(validator.validate(data).isValid).toBe(true);
751768
});
752769

753770
test('validateNumber method', () => {
@@ -868,4 +885,14 @@ test('validateNumber method', () => {
868885
validator = new DataValidator(schema);
869886
expect(validator.validate(wrong_data).isValid).toBe(false);
870887
expect(validator.validate(data).isValid).toBe(true);
888+
889+
// 10. test invalid choice
890+
delete schema['properties']['a']['exclusiveMinimum'];
891+
delete schema['properties']['a']['exclusiveMaximum'];
892+
delete schema['properties']['a']['multipleOf'];
893+
schema['properties']['a']['choices'] = [1, 2];
894+
wrong_data = {'a': 3};
895+
expect(validator.validate(wrong_data).isValid).toBe(false);
896+
data = {'a': 1};
897+
expect(validator.validate(data).isValid).toBe(true);
871898
});

0 commit comments

Comments
 (0)