Skip to content
This repository was archived by the owner on Mar 8, 2020. It is now read-only.

Commit 11c7783

Browse files
authored
Improve Resource Validator (#4566)
This will resolve the specific problem raised in Signed-off-by: Dave Kelsey <[email protected]> #4562
1 parent f8e0095 commit 11c7783

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

packages/composer-common/lib/serializer/resourcevalidator.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ class ResourceValidator {
301301
case 'Double':
302302
case 'Long':
303303
case 'Integer':
304-
if(dataType !== 'number') {
304+
if(dataType !== 'number' || isNaN(obj)) {
305305
invalid = true;
306306
}
307307
break;
@@ -425,6 +425,9 @@ class ResourceValidator {
425425
catch(err) {
426426
value = value.toString();
427427
}
428+
} else if (typeOfValue === 'number' && isNaN(value)) {
429+
value = 'Non-numeric';
430+
typeOfValue = 'unknown';
428431
}
429432
}
430433

packages/composer-common/test/serializer/resourcevalidator.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,43 @@ describe('ResourceValidator', function () {
470470
}).should.throw(/Model violation in instance identifier field propName/);
471471
});
472472

473+
it('should throw if type of data is not a number for a numeric field', () => {
474+
let mockField = sinon.createStubInstance(Field);
475+
mockField.getName.returns('propName');
476+
mockField.getType.returns('Integer');
477+
mockField.isPrimitive.returns(true);
478+
(() => {
479+
resourceValidator.checkItem('fred', mockField, {rootResourceIdentifier: 'identifier'});
480+
}).should.throw(/Model violation in instance identifier field propName.*fred.*string.*Integer/);
481+
});
482+
483+
it('should throw if number is actually NaN', () => {
484+
let mockField = sinon.createStubInstance(Field);
485+
mockField.getName.returns('propName');
486+
mockField.getType.returns('Integer');
487+
mockField.isPrimitive.returns(true);
488+
(() => {
489+
resourceValidator.checkItem(parseInt('fred') /* creates NaN object*/, mockField, {rootResourceIdentifier: 'identifier'});
490+
}).should.throw(/Model violation in instance identifier field propName.*Non-numeric.*unknown.*Integer/);
491+
492+
mockField = sinon.createStubInstance(Field);
493+
mockField.getName.returns('propName');
494+
mockField.getType.returns('Double');
495+
mockField.isPrimitive.returns(true);
496+
(() => {
497+
resourceValidator.checkItem(parseInt('fred') /* creates NaN object*/, mockField, {rootResourceIdentifier: 'identifier'});
498+
}).should.throw(/Model violation in instance identifier field propName.*Non-numeric.*unknown.*Double/);
499+
500+
mockField = sinon.createStubInstance(Field);
501+
mockField.getName.returns('propName');
502+
mockField.getType.returns('Long');
503+
mockField.isPrimitive.returns(true);
504+
(() => {
505+
resourceValidator.checkItem(parseInt('fred') /* creates NaN object*/, mockField, {rootResourceIdentifier: 'identifier'});
506+
}).should.throw(/Model violation in instance identifier field propName.*Non-numeric.*unknown.*Long/);
507+
508+
});
509+
473510
it('should throw if class declaration is not found', () => {
474511
let mockField = sinon.createStubInstance(Field);
475512
mockField.isPrimitive.returns(false);

0 commit comments

Comments
 (0)