UNPKG

save

Version:

A simple CRUD based persistence abstraction for storing objects to any backend data store. eg. Memory, MongoDB, Redis, CouchDB, Postgres, Punch Card etc.

136 lines (125 loc) 3.98 kB
var assert = require('assert') var Stream = require('stream').Stream var streamAssert = require('stream-assert') var mapSeries = require('async').mapSeries module.exports = function(idProperty, getEngine) { describe('WriteStream', function() { it('should be a write stream', function(done) { getEngine(function(ignoreError, engine) { assert.ok(engine instanceof Stream, 'not a Stream') done() }) }) it('should create new documents when data is written', function(done) { getEngine(function(ignoreError, engine) { engine .pipe( streamAssert.first(function(data) { assert.deepStrictEqual(data.a, 1) }) ) .pipe(streamAssert.end(done)) engine.write({ a: 1 }) engine.end() }) }) it('should update documents if data has a idProperty when written to stream', function(done) { getEngine(function(ignoreError, engine) { engine.create({ a: 1 }, function(ignoreError, existingEntity) { engine .pipe( streamAssert.first(function(data) { assert.strictEqual(data.a, 2) assert.strictEqual(existingEntity._id, data._id) }) ) .pipe(streamAssert.end(done)) engine.write({ _id: existingEntity._id, a: 2 }) engine.end() }) }) }) it('should insert if idProperty is given but not found', function(done) { getEngine(function(ignoreError, engine) { engine .pipe( streamAssert.first(function(data) { assert.strictEqual(data.a, 2) }) ) .pipe(streamAssert.end(done)) engine.write({ _id: 1, a: 2 }) engine.end() }) }) }) describe('ReadStream', function() { it('should return ReadStream if no callback is provided', function(done) { getEngine(function(ignoreError, engine) { assert.ok(engine.find({}) instanceof Stream, 'not a instance of Stream') done() }) }) it('should stream result data via ‘objectIdToString’ transformation', function(done) { getEngine(function(ignoreError, engine) { mapSeries( [ { a: 1, b: 0 }, { a: 2, b: 0 } ], engine.create, function(ignoreError, documents) { var stream = engine.find({ b: 0 }) stream .pipe( streamAssert.first(function(data) { assert.deepStrictEqual(data, documents[0]) }) ) .pipe( streamAssert.second(function(data) { assert.deepStrictEqual(data, documents[1]) }) ) .pipe(streamAssert.end(done)) } ) }) }) it('should emit `received`', function(done) { getEngine(function(ignoreError, engine) { mapSeries( [ { a: 1, b: 0 }, { a: 2, b: 0 } ], engine.create, function(ignoreError, documents) { var receivedData = [] engine.on('received', function(data) { receivedData.push(data) if (data.length === 2) { done() } else if (data.length > 2) { done(new Error('Too many events emitted')) } }) var stream = engine.find({ b: 0 }) stream .pipe( streamAssert.first(function(data) { assert.deepStrictEqual(data, documents[0]) }) ) .pipe( streamAssert.second(function(data) { assert.deepStrictEqual(data, documents[1]) }) ) .pipe(streamAssert.end(done)) } ) }) }) }) }