diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/server/db/MongoDeltaDaoTest.ts | 168 | ||||
-rw-r--r-- | test/system/DeltaProcessorTest.ts | 299 |
2 files changed, 299 insertions, 168 deletions
diff --git a/test/server/db/MongoDeltaDaoTest.ts b/test/server/db/MongoDeltaDaoTest.ts deleted file mode 100644 index c3d0711..0000000 --- a/test/server/db/MongoDeltaDaoTest.ts +++ /dev/null @@ -1,168 +0,0 @@ -/** - * Token state management test - * - * Copyright (C) 2010-2019 R-T Specialty, LLC. - * - * This file is part of the Liza Data Collection Framework. - * - * liza is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -import { MongoDeltaDao as Sut } from "../../../src/server/db/MongoDeltaDao"; -import { MongoCollection } from "mongodb"; -import { PositiveInteger } from "../../../src/numeric"; -import { DocumentId } from "../../../src/document/Document"; - -import { expect, use as chai_use } from 'chai'; -chai_use( require( 'chai-as-promised' ) ); - - -describe( 'server.db.MongoDeltaDao', () => -{ - describe( '#getUnprocessedDocuments', () => - { - it( 'gets documents', () => - { - let returned_data = { foo: 'bar' }; - let callback_called = false; - - const collection = _createMockMongoCollection(); - collection.find = ( _: any, __: any, c: any ) => - { - c( null, { - toArray: ( c: any ) => c( null, returned_data ), - } ); - }; - - const callback = ( data: Record<string, any> | null ) => - { - expect( returned_data ).to.deep.equal( data ); - - callback_called = true; - - return; - }; - - new Sut( collection ).getUnprocessedDocuments( callback ); - - expect( callback_called ).to.equal( true ); - }); - }); - - describe( '#advanceDeltaIndexByType', () => - { - it( 'advances specified index', () => - { - const quote_id = <DocumentId>123, - delta_type = 'ratedata', - expected_field = 'lastPublishDelta.ratedata', - index = <PositiveInteger>1; - - let callback_called = false; - - const collection = _createMockMongoCollection(); - collection.update = ( - given_quote_id: any, - given_delta_type: any, - _given_index: any, - given_callback: any - ) => - { - const expected_set: Record<string, any> = {}; - - expected_set[ expected_field ] = index - - expect( given_quote_id ).to.deep.equal( { id: quote_id } ); - expect( given_delta_type ) - .to.deep.equal( { $set: expected_set } ); - - given_callback( null ); - }; - - const callback = ( _err: NullableError, _indexAdvanced: boolean ) => - { - callback_called = true; - - return; - }; - - new Sut( collection ).advanceDeltaIndexByType( - quote_id, - delta_type, - index, - callback, - ); - - expect( callback_called ).to.equal( true ); - }); - }); - - describe( '#markDocumentAsProcessed', () => - { - it( 'doc marked if provided timestamp <= doc timestamp', () => - { - const quote_id = <DocumentId>123, - last_update_ts = <UnixTimestamp>1573582767; - - let callback_called = false; - - const collection = _createMockMongoCollection(); - collection.update = ( - given_filter: any, - _: any, - __: any, - given_callback: any - ) => - { - const expected_filter: Record<string, any> = { - id: quote_id, - lastUpdate: { $gt: last_update_ts } - }; - - expect( given_filter ).to.deep.equal( expected_filter ); - - given_callback( null ); - }; - - const callback = ( _err: NullableError, _indexAdvanced: boolean ) => - { - callback_called = true; - - return; - }; - - new Sut( collection ).markDocumentAsProcessed( - quote_id, - last_update_ts, - callback, - ); - - expect( callback_called ).to.equal( true ); - }); - }); - -} ); - - -function _createMockMongoCollection(): MongoCollection -{ - return <MongoCollection> { - findOne() {}, - update() {}, - findAndModify() {}, - find() {}, - createIndex() {}, - insert() {}, - }; -} diff --git a/test/system/DeltaProcessorTest.ts b/test/system/DeltaProcessorTest.ts new file mode 100644 index 0000000..26923ae --- /dev/null +++ b/test/system/DeltaProcessorTest.ts @@ -0,0 +1,299 @@ +/** + * Delta Processor test + * + * Copyright (C) 2010-2019 R-T Specialty, LLC. + * + * This file is part of the Liza Data Collection Framework. + * + * liza is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +import { DeltaProcessor as Sut } from '../../src/system/DeltaProcessor'; +import { DeltaDao } from '../../src/system/db/DeltaDao'; +import { MongoDeltaType } from '../../src/system/db/MongoDeltaDao'; + + +import { expect, use as chai_use } from 'chai'; +chai_use( require( 'chai-as-promised' ) ); + + +describe( 'system.DeltaProcessor', () => +{ + describe( '#getTimestampSortedDeltas', () => + { + ( <{ label: string, given: any, expected: any }[]>[ + { + label: 'creates list', + given: { + rdelta: { + data: [ + { + data: { foo: 'first_bar' }, + timestamp: 123, + }, + { + data: { foo: 'second_bar' }, + timestamp: 234, + }, + ], + ratedata: [ + { + data: { foo: 'third_bar' }, + timestamp: 345, + }, + { + data: { foo: 'fourth_bar' }, + timestamp: 456, + }, + ] + } + }, + expected: [ + { + data: { foo: 'first_bar' }, + timestamp: 123, + type: 'data', + }, + { + data: { foo: 'second_bar' }, + timestamp: 234, + type: 'data', + }, + { + data: { foo: 'third_bar' }, + timestamp: 345, + type: 'ratedata', + }, + { + data: { foo: 'fourth_bar' }, + timestamp: 456, + type: 'ratedata', + }, + ], + }, + { + label: 'creates list with no ratedata', + given: { + rdelta: { + data: [ + { + data: { foo: 'first_bar' }, + timestamp: 123, + }, + { + data: { foo: 'second_bar' }, + timestamp: 234, + }, + ], + ratedata: [] + } + }, + expected: [ + { + data: { foo: 'first_bar' }, + timestamp: 123, + type: 'data', + }, + { + data: { foo: 'second_bar' }, + timestamp: 234, + type: 'data', + }, + ], + }, + { + label: 'creates list when rate occurs between two saves', + given: { + rdelta: { + data: [ + { + data: { foo: 'first_bar' }, + timestamp: 123, + }, + { + data: { foo: 'second_bar' }, + timestamp: 234, + }, + { + data: { foo: 'fourth_bar' }, + timestamp: 456, + }, + ], + ratedata: [ + { + data: { foo: 'third_bar' }, + timestamp: 345, + }, + ], + }, + }, + expected: [ + { + data: { foo: 'first_bar' }, + timestamp: 123, + type: 'data', + }, + { + data: { foo: 'second_bar' }, + timestamp: 234, + type: 'data', + }, + { + data: { foo: 'third_bar' }, + timestamp: 345, + type: 'ratedata', + }, + { + data: { foo: 'fourth_bar' }, + timestamp: 456, + type: 'data', + }, + ], + }, + ] ).forEach( ( { given, expected, label } ) => it( label, () => + { + const sut = new Sut( createMockDeltaDao() ); + const actual = sut.getTimestampSortedDeltas( given ); + + expect( actual ).to.deep.equal( expected ); + } ) ); + } ); + + + describe( '#getDeltas', () => + { + ( <{ + label: string, + type: MongoDeltaType, + given: any, + expected: any + }[]>[ + { + label: 'return empty array if no deltas are present', + type: 'data', + given: { + rdelta: {}, + }, + expected: [], + }, + { + label: 'return full list if no lastPublished index is found', + type: 'data', + given: { + rdelta: { + data: [ + { + data: { foo: 'first_bar' }, + timestamp: 123, + }, + { + data: { foo: 'second_bar' }, + timestamp: 234, + }, + ], + }, + }, + expected: [ + { + data: { foo: 'first_bar' }, + timestamp: 123, + type: 'data', + }, + { + data: { foo: 'second_bar' }, + timestamp: 234, + type: 'data', + }, + ], + }, + { + label: 'marks deltas with their type', + type: 'data', + given: { + rdelta: { + data: [ + { + data: { foo: 'first_bar' }, + timestamp: 123, + }, + { + data: { foo: 'second_bar' }, + timestamp: 234, + }, + ], + }, + lastPublishDelta: { + data: 0, + }, + }, + expected: [ + { + data: { foo: 'first_bar' }, + timestamp: 123, + type: 'data', + }, + { + data: { foo: 'second_bar' }, + timestamp: 234, + type: 'data', + }, + ], + }, + { + label: 'trims delta array based on index', + type: 'data', + given: { + rdelta: { + data: [ + { + data: { foo: 'first_bar' }, + timestamp: 123, + }, + { + data: { foo: 'second_bar' }, + timestamp: 234, + }, + ], + }, + lastPublishDelta: { + data: 1, + }, + }, + expected: [ + { + data: { foo: 'second_bar' }, + timestamp: 234, + type: 'data', + }, + ], + }, + ] ).forEach( ( { type, given, expected, label } ) => it( label, () => + { + const sut = new Sut( createMockDeltaDao() ); + const actual = sut.getDeltas( given, type ); + + expect( actual ).to.deep.equal( expected ); + } ) ); + } ); +} ); + + +function createMockDeltaDao(): DeltaDao +{ + return <DeltaDao>{ + getUnprocessedDocuments() { return this }, + advanceDeltaIndexByType() { return this }, + markDocumentAsProcessed() { return this }, + }; +} |