From 14084c3279dec8ef46eb3ae8ca5d020db4fef055 Mon Sep 17 00:00:00 2001 From: Adam Kariv Date: Mon, 16 May 2016 12:36:09 +0300 Subject: [PATCH] fix(multi-field-validation): Make sure that data for multiple fields can be validated --- src/index.js | 4 ++-- src/index.test.js | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/src/index.js b/src/index.js index d203926..0f8a402 100644 --- a/src/index.js +++ b/src/index.js @@ -105,7 +105,7 @@ class TypeProcessor { }); // ... and data samples match the selected datatype ... valid = valid && - _.every(fields, (f) => { + _.every(_.map(fields, (f) => { if ( !f.type ) { return true; } if ( f.data ) { var options = _.pick(f.options, @@ -121,7 +121,7 @@ class TypeProcessor { } else { return true; } - }); + })); return valid; } diff --git a/src/index.test.js b/src/index.test.js index dad2198..a9562b7 100644 --- a/src/index.test.js +++ b/src/index.test.js @@ -216,6 +216,46 @@ describe('os-types', function() { } }); }); + it('detects bad data samples and raises proper errors for multiple fields', function() { + var cases = [ + ['value', {}, ['abcz'], true], + ['value', {}, ['123', 'abcz'], true], + ['value', {}, ['abcz', '123'], true], + ['value', {}, ['123'], false], + ['value', {}, ['12.3'], false], + ['value', {}, ['12.3'], false], + ['value', {}, ['12.3'], false], + ['date:generic', {}, ['1978-12-31'], false], + ['date:generic', {format:'fmt:YYYY/MM/DD'}, ['1978-12-31'], true], + ['date:generic', {format:'fmt:YYYY/MM/DD'}, ['1978/12/31'], false], + ['value', {}, ['1,234'], false], + ['value', {}, ['1,234.56'], false], + ['value', { groupChar:' ', decimalChar:','}, ['1 234,56'], false], + ['', {}, ['100'], false], + ]; + var fields = [ + { + name: 'dummy1', + type: 'value', + options: {}, + data: ['123','fsdsd','456'] + }, + { + name: 'dummy2', + type: 'date:fiscal-year', + options: {}, + data: ['2012','2013','xxx'] + } + ]; + var model = tp.fieldsToModel(fields); + expect(model).to.be.ok; + expect(model.errors).to.be.ok; + expect(model.errors.perField).to.be.ok; + expect(model.errors.perField.dummy1).to.be.ok; + expect(model.errors.perField.dummy1).to.match(/^Data cannot be cast to this type/); + expect(model.errors.perField.dummy2).to.be.ok; + expect(model.errors.perField.dummy2).to.match(/^Data cannot be cast to this type/); + }); it('creates correctly dimensions & measures', function () { var fields = _.map(tp.getAllTypes(), (type) => { var name = type.replace(/:/g, ' ');