From 3b1df602e18effb66b604c16ace7756c30b2462f Mon Sep 17 00:00:00 2001 From: Mike Gerwitz Date: Mon, 13 Feb 2017 14:51:04 -0500 Subject: [PATCH] DataValidator: Always clear store state In practice, not clearing the store and allowing it to use previous state has the effect of instantly "fixing" failures if there happens to be more than one validation call. This was a log of debugging for a one-line change. * src/validate/DataValidator.js (_populateStore): Always clear store. * test/validate/DataValidatorTest.js: Add test. DEV-2299 --- src/validate/DataValidator.js | 3 ++- test/validate/DataValidatorTest.js | 39 ++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/validate/DataValidator.js b/src/validate/DataValidator.js index 12e663f..3690ac5 100644 --- a/src/validate/DataValidator.js +++ b/src/validate/DataValidator.js @@ -193,7 +193,8 @@ module.exports = Class( 'DataValidator', { if ( data === undefined ) { - return Promise.resolve( [] ); + // it's important that we don't re-use previous state + return store.clear().then( [] ); } const mapf = ( subkey !== undefined ) diff --git a/test/validate/DataValidatorTest.js b/test/validate/DataValidatorTest.js index b31a93e..e2364d3 100644 --- a/test/validate/DataValidatorTest.js +++ b/test/validate/DataValidatorTest.js @@ -212,6 +212,45 @@ describe( 'DataValidator', () => .validate( {} ) ).to.eventually.be.rejectedWith( expected_e ); } ); + + + [ + [], + [ {} ], + [ undefined ], + [ undefined, {} ], + [ undefined, undefined ], + [ {}, undefined ], + ].forEach( args => it( 'does not re-use previous store state', () => + { + const bvalidator = createMockBucketValidator(); + const vmonitor = ValidStateMonitor(); + const dep_factory = createMockDependencyFactory(); + + const stores = { + store: MemoryStore(), + bstore: sinon.createStubInstance( MemoryStore ), + cstore: sinon.createStubInstance( MemoryStore ), + }; + + const { bstore, cstore } = stores; + + const cleared = which => + { + cleared[ which ] = true; + return Promise.resolve(); + }; + + bstore.clear = () => cleared( 'b' ); + cstore.clear = () => cleared( 'c' ); + + const sut = Sut( bvalidator, vmonitor, dep_factory, () => stores ); + + return sut.validate.apply( sut, args ) + .then( () => + expect( cleared.b && cleared.c ).to.be.true + ); + } ) ); } );