Skip to content

Commit 5e9194d

Browse files
committed
Add List Value Validator
1 parent 428d9f2 commit 5e9194d

File tree

2 files changed

+75
-20
lines changed

2 files changed

+75
-20
lines changed

lib/validators/value.js

Lines changed: 41 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ var util = require('../util');
99
* max: Number, // Maximum allowed value
1010
* min: Number, // Minimum allowed value
1111
* contains: String || Number // The value contains
12+
* list: Array // List of exact allowed values
1213
* }
1314
* }
1415
*/
@@ -20,30 +21,21 @@ function isValid(data, model) {
2021

2122
// Data is different than equals
2223
if (model.value.eq) {
23-
// Same data type and different values
24-
if (typeof (data) === typeof (model.value.eq) && data !== model.value.eq) {
25-
// If object, return util.compare. Else, return false.
26-
return (typeof data === 'object') ? util.equal(data, model.value.eq) : false;
24+
if(!equals(data, model.value.eq)) {
25+
return false;
2726
}
27+
}
2828

29-
// Different types: Try to convert one to other.
30-
var parsed = data;
31-
var type = typeof (model.value.eq);
32-
switch (type.toLowerCase()) {
33-
case 'string':
34-
parsed = String(data);
35-
break;
36-
case 'number':
37-
parsed = Number(data);
38-
break;
39-
case 'boolean':
40-
parsed = Boolean(data);
41-
break;
42-
}
43-
44-
if (data !== model.value.eq) {
29+
if (model.value.list) {
30+
if(!Array.isArray(model.value.list)) {
4531
return false;
4632
}
33+
34+
for (var i = model.value.list.length - 1; i >= 0; i--) {
35+
if(!equals(data, model.value.list[i])) {
36+
return false;
37+
}
38+
}
4739
}
4840

4941
// Data is higher than max
@@ -69,4 +61,33 @@ function isValid(data, model) {
6961
return true;
7062
}
7163

64+
function equals(data, expected) {
65+
// Same data type and different values
66+
if (typeof (data) === typeof (expected) && data !== expected) {
67+
// If object, return util.compare. Else, return false.
68+
return (typeof data === 'object') ? util.equal(data, expected) : false;
69+
}
70+
71+
// Different types: Try to convert one to other.
72+
var parsed = data;
73+
var type = typeof (expected);
74+
switch (type.toLowerCase()) {
75+
case 'string':
76+
parsed = String(data);
77+
break;
78+
case 'number':
79+
parsed = Number(data);
80+
break;
81+
case 'boolean':
82+
parsed = Boolean(data);
83+
break;
84+
}
85+
86+
if (data !== expected) {
87+
return false;
88+
}
89+
90+
return true;
91+
}
92+
7293
module.exports = isValid;

spec/validators/value.spec.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,40 @@ describe(' - Date validator', () => {
237237
const result = valid('', model);
238238
expect(result).toEqual(false);
239239
});
240+
});
241+
242+
describe('list filter', () => {
243+
244+
it('shall fail when non-array value parsed', () => {
245+
const model = {
246+
value: {
247+
list: 'string'
248+
}
249+
};
240250

251+
expect(valid('string', model)).toEqual(false);
252+
});
253+
254+
// Again the for loop here! ^^
255+
for (let validType in typesKeys) {
256+
describe('type ' + typesKeys[validType], () => {
257+
const model = {
258+
value: {}
259+
};
260+
261+
beforeEach(function () {
262+
const val = (typesKeys[validType] === 'object') ? util.clone(obj) : types[typesKeys[validType]];
263+
model.value = {
264+
list: [val]
265+
};
266+
});
267+
268+
for (let check in typesKeys) {
269+
it('shall not be equal than ' + typesKeys[check], () => {
270+
expect(valid(types[typesKeys[check]], model)).toEqual( (validType === check) );
271+
});
272+
}
273+
});
274+
}
241275
});
242276
});

0 commit comments

Comments
 (0)