diff options
author | Mike Gerwitz <gerwitzm@lovullo.com> | 2017-02-20 12:08:55 -0500 |
---|---|---|
committer | Mike Gerwitz <gerwitzm@lovullo.com> | 2017-02-20 12:16:24 -0500 |
commit | c5194b4ec5efc6469b0d5753cb0b044ce822b059 (patch) | |
tree | 6bca2fccfb6f0c20e5c7e693783f49ade4f06e1a /test | |
parent | 4f7654c7c48b7ca2bd09dbabca2d1a673d9581be (diff) | |
download | liza-c5194b4ec5efc6469b0d5753cb0b044ce822b059.tar.gz liza-c5194b4ec5efc6469b0d5753cb0b044ce822b059.tar.bz2 liza-c5194b4ec5efc6469b0d5753cb0b044ce822b059.zip |
StagingBucket: Do not process non-changes
Since changes trigger any event observers---which can be
expensive---it is ideal to ignore sets that do not result in any
changes to the bucket.
This also resolves issues with systems that are confused by empty
diffs.
* src/bucket/StagingBucket.js
(_hasChanged): Add method.
(setValues): Use it.
* test/bucket/StagingBucketTest.js: Add test case.
DEV-2299
Diffstat (limited to 'test')
-rw-r--r-- | test/bucket/StagingBucketTest.js | 185 |
1 files changed, 185 insertions, 0 deletions
diff --git a/test/bucket/StagingBucketTest.js b/test/bucket/StagingBucketTest.js new file mode 100644 index 0000000..b90d359 --- /dev/null +++ b/test/bucket/StagingBucketTest.js @@ -0,0 +1,185 @@ +/** + * Test of staging key/value store + * + * Copyright (C) 2017 LoVullo Associates, Inc. + * + * This file is part of liza. + * + * liza is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * @todo This needs tests for the rest of StagingBucket + */ + +"use strict"; + +const { Class } = require( 'easejs' ); +const root = require( '../../' ); +const expect = require( 'chai' ).expect; + +const { + Bucket, + StagingBucket: Sut +} = root.bucket; + + +describe( 'StagingBucket', () => +{ + describe( 'pre-update event', () => + { + it( 'allows updating data before set', () => + { + const sut = Sut( createStubBucket() ); + + const data = { + foo: [ 'bar', 'baz' ], + }; + + sut.on( 'preStagingUpdate', data => + { + data.foo[ 1 ] = 'quux'; + } ); + + // triggers setValues + sut.setValues( data ); + + expect( sut.getDataByName( 'foo' ) ) + .to.deep.equal( [ 'bar', 'quux' ] ); + } ); + + + [ + { + initial: { foo: [ 'bar', 'baz' ] }, + update: { foo: [ 'bar', 'baz' ] }, + merge_index: true, + is_change: false, + }, + { + initial: { foo: [ 'bar', 'baz' ] }, + update: { foo: [ 'bar', 'baz' ] }, + merge_index: false, + is_change: false, + }, + + // actual changes + { + initial: { foo: [ 'bar', 'baz' ] }, + update: { foo: [ 'change', 'baz' ] }, + merge_index: true, + is_change: true, + }, + { + initial: { foo: [ 'bar', 'baz' ] }, + update: { foo: [ 'bar', 'change' ] }, + merge_index: true, + is_change: true, + }, + { + initial: { foo: [ 'bar', 'baz' ] }, + update: { foo: [ undefined, 'change' ] }, + merge_index: true, + is_change: true, + }, + + // single-index changes make sense only if merge_index + { + initial: { foo: [ 'bar', 'baz' ] }, + update: { foo: [ undefined, 'baz' ] }, + merge_index: true, + is_change: false, + }, + { + initial: { foo: [ 'bar', 'baz' ] }, + update: { foo: [ 'bar', undefined ] }, + merge_index: true, + is_change: false, + }, + { + initial: { foo: [ 'bar', 'baz' ] }, + update: { foo: [ 'bar', null ] }, + merge_index: true, + is_change: true, + }, + { + initial: { foo: [ 'bar', 'baz' ] }, + update: { foo: [] }, + merge_index: true, + is_change: false, + }, + { + initial: { foo: [ 'bar', 'baz' ] }, + update: { foo: [] }, + merge_index: false, + is_change: true, + }, + { + initial: { foo: [ 'bar' ] }, + update: { foo: [ 'bar', undefined ] }, + merge_index: false, + is_change: true, + }, + + // only interpreted as a diff if merge_index + { + initial: { foo: [ 'bar', 'baz' ] }, + update: { foo: [ 'bar', undefined ] }, + merge_index: false, + is_change: true, + }, + + // no index at all + { + initial: { foo: [ 'bar', 'baz' ] }, + update: {}, + merge_index: true, + is_change: false, + }, + ].forEach( ( { initial, update, merge_index, is_change }, i ) => + { + it( `is emitted only when data is changed (${i})`, () => + { + const sut = Sut( createStubBucket() ); + let called = false; + + sut.setValues( initial, merge_index ); + + sut.on( 'preStagingUpdate', () => called = true ); + sut.setValues( update, merge_index ); + + expect( called ).to.equal( is_change ); + } ); + } ); + } ); +} ); + + +function createStubBucket( bucket_obj ) +{ + return Class.implement( Bucket ).extend( + { + 'public getData'() + { + return bucket_obj; + }, + + 'public setValues'( data, merge_index, merge_null ) {}, + 'public overwriteValues'( data ) {}, + 'public clear'() {}, + 'public each'( callback ) {}, + 'public getDataByName'( name ) {}, + 'public getDataJson'() {}, + 'public filter'( pred, callback) {}, + 'on'() {}, + } )(); +} |