UNPKG

rethinkdbdash

Version:

A Node.js driver for RethinkDB with promises and a connection pool

516 lines (474 loc) 14.9 kB
var config = require('./config.js'); var r = require('../lib')(config); var util = require(__dirname+'/util/common.js'); var assert = require('assert'); var Readable = require('stream').Readable; var uuid = util.uuid; var It = util.It var dbName, tableName, tableName2, stream, result, pks, feed, dumpTable; var numDocs = 100; // Number of documents in the "big table" used to test the SUCCESS_PARTIAL var smallNumDocs = 5; // Number of documents in the "small table" It('Init for `stream.js`', function* (done) { try { dbName = uuid(); tableName = uuid(); // Big table to test partial sequence tableName2 = uuid(); // small table to test success sequence dumpTable = uuid(); // dump table result = yield r.dbCreate(dbName).run() assert.equal(result.dbs_created, 1); //yield r.db(dbName).wait().run() result = yield [ r.db(dbName).tableCreate(tableName)('tables_created').run(), r.db(dbName).tableCreate(tableName2)('tables_created').run(), r.db(dbName).tableCreate(dumpTable)('tables_created').run()] assert.deepEqual(result, [1, 1, 1]); done(); } catch(e) { console.log(e); done(e); } }) It('Inserting batch - table 1', function* (done) { try { result = yield r.db(dbName).table(tableName).insert(eval('['+new Array(numDocs).join('{}, ')+'{}]')).run(); assert.equal(result.inserted, numDocs); done(); } catch(e) { done(e); } }) It('Inserting batch - table 2', function* (done) { try { result = yield r.db(dbName).table(tableName2).insert(eval('['+new Array(smallNumDocs).join('{}, ')+'{}]')).run(); assert.equal(result.inserted, smallNumDocs); done(); } catch(e) { done(e); } }) It('Inserting batch', function* (done) { try { // Add a date result = yield r.db(dbName).table(tableName).update({ date: r.now() }).run(); done(); } catch(e) { done(e); } }) It('`table` should return a stream', function* (done) { try { stream = yield r.db(dbName).table(tableName).run({stream: true}); assert(stream); assert(stream instanceof Readable); stream.close(); done(); } catch(e) { done(e); } }) It('Arrays should return a stream', function* (done) { try { var data = [10, 11, 12, 13, 14, 15, 16]; stream = yield r.expr(data).run({stream: true}); assert(stream); assert(stream instanceof Readable); var count = 0; stream.on('data', function() { count++; if (count === data.length) { done(); } }); } catch(e) { done(e); } }) It('changes() should return a stream', function* (done) { try { var data = [{}, {}, {}, {}]; stream = yield r.db(dbName).table(tableName).changes().run({stream: true}); assert(stream); assert(stream instanceof Readable); var count = 0; stream.on('data', function() { count++; if (count === data.length) { done(); stream.close(); } }); yield r.db(dbName).table(tableName).insert(data).run(); } catch(e) { done(e); } }) It('get().changes() should return a stream', function* (done) { try { stream = yield r.db(dbName).table(tableName).get(1).changes().run({stream: true}); assert(stream); assert(stream instanceof Readable); var count = 0; stream.on('data', function() { count++; if (count === 3) { done(); stream.close(); } }); yield r.db(dbName).table(tableName).insert({id: 1}).run(); yield r.db(dbName).table(tableName).get(1).update({update: 1}).run(); yield r.db(dbName).table(tableName).get(1).update({update: 2}).run(); } catch(e) { done(e); } }) It('`table` should return a stream - testing empty SUCCESS_COMPLETE', function* (done) { var i=0; try { var connection = yield r.connect({host: config.host, port: config.port, authKey: config.authKey}); assert(connection); stream = yield r.db(dbName).table(tableName).run(connection, {stream: true, maxBatchRows: 1}); assert(stream); assert(stream instanceof Readable); stream.close(); done(); } catch(e) { done(e); } }) It('Test flowing - event data', function* (done) { var i=0; try { var connection = yield r.connect({host: config.host, port: config.port, authKey: config.authKey}); assert(connection); stream = yield r.db(dbName).table(tableName).run(connection, {stream: true, maxBatchRows: 1}); var count = 0; stream.on('data', function() { count++; if (count === numDocs) { done(); } }); } catch(e) { done(e); } }) It('Test read', function* (done) { try { var connection = yield r.connect({host: config.host, port: config.port, authKey: config.authKey}); assert(connection); stream = yield r.db(dbName).table(tableName).run(connection, {stream: true, maxBatchRows: 1}); stream.once('readable', function() { var doc = stream.read(); if (doc === null) { done(new Error("stream.read() should not return null when readable was emitted")); } var count = 1; stream.on('data', function(data) { count++; if (count === numDocs) { done(); } }); }); } catch(e) { done(e); } }) It('Test flowing - event data', function* (done) { var i=0; try { var connection = yield r.connect({host: config.host, port: config.port, authKey: config.authKey}); assert(connection); stream = yield r.db(dbName).table(tableName).run(connection, {stream: true, maxBatchRows: 1}); var count = 0; stream.on('data', function() { count++; if (count === numDocs) { done(); } }); stream.pause(); if (count > 0) { done(new Error("The stream should have been paused")); } stream.resume(); } catch(e) { done(e); } }) It('Test read with null value', function* (done) { try { var connection = yield r.connect({host: config.host, port: config.port, authKey: config.authKey}); assert(connection); stream = yield r.db(dbName).table(tableName).limit(10).union([null]).union(r.db(dbName).table(tableName).limit(10)).run(connection, {stream: true, maxBatchRows: 1}); stream.once('readable', function() { var count = 0; stream.on('data', function(data) { count++; if (count === 20) { done(); } else if (count > 20) { done(new Error("Should not get null")) } }); }); } catch(e) { done(e); } }) It('Test read', function* (done) { try { var connection = yield r.connect({host: config.host, port: config.port, authKey: config.authKey}); assert(connection); stream = yield r.db(dbName).table(tableName).run(connection, {stream: true, maxBatchRows: 1}); stream.once('readable', function() { var doc = stream.read(); if (doc === null) { done(new Error("stream.read() should not return null when readable was emitted")); } stream.close().then(function() { done(); }).error(function(error) { done(error); }); }); } catch(e) { done(e); } }) It('Import with stream as default', function* (done) { var r1 = require('../lib')({stream: true, host: config.host, port: config.port, authKey: config.authKey, buffer: config.buffer, max: config.max, discovery: false, silent: true}); var i=0; try { stream = yield r1.db(dbName).table(tableName).run(); assert(stream instanceof Readable); done(); } catch(e) { done(e); } }) It('toStream', function* (done) { try { stream = r.db(dbName).table(tableName).toStream(); stream.once('readable', function() { var doc = stream.read(); if (doc === null) { done(new Error("stream.read() should not return null when readable was emitted")); } var count = 1; stream.on('data', function(data) { count++; if (count === numDocs) { done(); } }); }); } catch(e) { done(e); } }) It('toStream - with grouped data', function* (done) { try { stream = r.db(dbName).table(tableName).group({index: 'id'}).toStream(); stream.once('readable', function() { var doc = stream.read(); if (doc === null) { done(new Error("stream.read() should not return null when readable was emitted")); } var count = 1; stream.on('data', function(data) { count++; if (count === numDocs) { done(); } }); }); } catch(e) { done(e); } }) It('pipe should work with a writable stream - 200-200', function* (done) { var r1 = require('../lib')({buffer:1, max: 2, discovery: false, silent: true}); r1.db(dbName).table(tableName).toStream({highWaterMark: 200}) .pipe(r1.db(dbName).table(dumpTable).toStream({writable: true, highWaterMark: 200})) .on('finish', function() { r.expr([ r1.db(dbName).table(tableName).count(), r1.db(dbName).table(dumpTable).count() ]).run().then(function(result) { if (result[0] !== result[1]) { done(new Error('All the data should have been streamed')); } return r1.db(dbName).table(dumpTable).delete() }).then(function() { r1.getPool(0).drain(); }).then(function() { setTimeout(done, 1000); //done(); }).error(done); }); }) It('pipe should work with a writable stream - 200-20', function* (done) { var r1 = require('../lib')({buffer:1, max: 2, discovery: false, silent: true}); r1.db(dbName).table(tableName).toStream({highWaterMark: 200}) .pipe(r1.db(dbName).table(dumpTable).toStream({writable: true, highWaterMark: 20})) .on('finish', function() { r.expr([ r1.db(dbName).table(tableName).count(), r1.db(dbName).table(dumpTable).count() ]).run().then(function(result) { if (result[0] !== result[1]) { done(new Error('All the data should have been streamed')); } return r1.db(dbName).table(dumpTable).delete() }).then(function() { r1.getPool(0).drain(); done(); }).error(done); }); }) It('pipe should work with a writable stream - 20-200', function* (done) { var r1 = require('../lib')({buffer:1, max: 2, discovery: false, silent: true}); r1.db(dbName).table(tableName).toStream({highWaterMark: 20}) .pipe(r1.db(dbName).table(dumpTable).toStream({writable: true, highWaterMark: 200})) .on('finish', function() { r.expr([ r1.db(dbName).table(tableName).count(), r1.db(dbName).table(dumpTable).count() ]).run().then(function(result) { if (result[0] !== result[1]) { done(new Error('All the data should have been streamed')); } return r1.db(dbName).table(dumpTable).delete() }).then(function() { r1.getPool(0).drain(); done(); }).error(done); }); }) It('pipe should work with a writable stream - 50-50', function* (done) { var r1 = require('../lib')({buffer:1, max: 2, discovery: false, silent: true}); r1.db(dbName).table(tableName).toStream({highWaterMark: 50}) .pipe(r1.db(dbName).table(dumpTable).toStream({writable: true, highWaterMark: 50})) .on('finish', function() { r.expr([ r1.db(dbName).table(tableName).count(), r1.db(dbName).table(dumpTable).count() ]).run().then(function(result) { if (result[0] !== result[1]) { console.log(result); done(new Error('All the data should have been streamed')); } return r1.db(dbName).table(dumpTable).delete() }).then(function() { r1.getPool(0).drain(); done(); }).error(function(err) { console.log(err); done(err); }); }); }) It('toStream((writable: true}) should handle options', function* (done) { var r1 = require('../lib')({buffer:1, max: 2, discovery: false, silent: true}); var stream = r1.db(dbName).table(dumpTable).toStream({writable: true, highWaterMark: 50, conflict: 'replace'}); stream.write({id: 1, foo: 1}); stream.write({id: 1, foo: 2}); stream.end({id: 1, foo: 3}); stream.on('finish', function() { r1.db(dbName).table(dumpTable).count().then(function(result) { assert.equal(result, 1); return r1.db(dbName).table(dumpTable).get(1) }).then(function(result) { assert.deepEqual(result, {id: 1, foo: 3}); return r1.db(dbName).table(dumpTable).delete(); }).then(function(result) { r1.getPool(0).drain(); done(); }).error(done); }); }) It('test pipe all streams', function* (done) { // Create a transform stream that will convert data to a string var stream = require('stream') var addfoobar = new stream.Transform(); addfoobar._writableState.objectMode = true; addfoobar._readableState.objectMode = true; addfoobar._transform = function (data, encoding, done) { data.transform = true; this.push(data); done(); } var addbuzzlol = new stream.Transform(); addbuzzlol._writableState.objectMode = true; addbuzzlol._readableState.objectMode = true; addbuzzlol._transform = function (data, encoding, done) { delete data.id data.written = true; this.push(data); done(); } r.db(dbName).table(tableName).without('id').toStream() .on('error', done) .pipe(addfoobar) .on('error', done) .pipe(r.db(dbName).table(dumpTable).toStream({transform: true})) .on('error', done) .pipe(addbuzzlol) .on('error', done) .pipe(r.db(dbName).table(dumpTable).toStream({writable: true})) .on('error', done) .on('finish', function() { r.db(dbName).table(dumpTable).filter({written: true}).count().run().then(function(result) { assert(result, numDocs); return r.db(dbName).table(dumpTable).filter({transform:true}).count().run() }).then(function() { assert(result, numDocs*2); return r.db(dbName).table(dumpTable).delete(); }).then(function(result) { done(); r.getPool(0).drain(); }); }); }) It('toStream({writable: true}) should throw on something else than a table', function* (done) { var r1 = require('../lib')({buffer:1, max: 2, discovery: false, silent: true}); try { r.expr(dumpTable).toStream({writable: true}); } catch(err) { assert(err.message, "Cannot create a writable stream on something else than a table."); done(); } }) It('toStream({transform: true}) should throw on something else than a table', function* (done) { var r1 = require('../lib')({buffer:1, max: 2, discovery: false, silent: true}); try { r.expr(dumpTable).toStream({transform: true}); } catch(err) { assert(err.message, "Cannot create a writable stream on something else than a table."); done(); } })