UNPKG

rethinkdbdash

Version:

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

280 lines (257 loc) 7.45 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 Stream = require('stream') var _util = require('util'); var devnull = require('dev-null'); 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 It('Init for `transform-stream.js`', function* (done) { try { dbName = uuid(); tableName = uuid(); // Big table to test partial 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(dumpTable)('tables_created').run()] assert.deepEqual(result, [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('test pipe transform - fast input', function* (done) { var stream = new Readable({objectMode: true}); var size = 35; var value = uuid(); for(var i=0; i<size; i++) { stream.push({field: value}); } stream.push(null); var table = r.db(dbName).table(dumpTable).toStream({transform: true, debug: true, highWaterMark: 10}); stream.pipe(table) .on('error', done) .on('end', function() { r.db(dbName).table(dumpTable).filter({field: stream._value}).count().run().then(function(result) { assert.deepEqual(result, size); assert.deepEqual(table._sequence, [10, 10, 10, 5]) done(); }); }).pipe(devnull({objectMode: true})); }) It('test pipe transform - slow input - 1', function* (done) { var stream = new Readable({objectMode: true}); var size = 10; var values = [uuid(), uuid()]; var table = r.db(dbName).table(dumpTable).toStream({transform: true, debug: true, highWaterMark: 5}); var i = 0; stream._read = function() { var self = this; i++; if (i <= 3) { self.push({field: values[0]}); } else if (i === 4) { setTimeout(function() { self.push({field: values[1]}); }, 3000) } else if (i <= 10) { self.push({field: values[1]}); } else { self.push(null); } } stream.pipe(table) .on('error', done) .on('end', function() { r.expr([ r.db(dbName).table(dumpTable).filter({field: values[0]}).count(), r.db(dbName).table(dumpTable).filter({field: values[1]}).count() ]).run().then(function(result) { assert.deepEqual(result, [3, 7]); assert.deepEqual(table._sequence, [3, 5, 2]) done(); }); }).pipe(devnull({objectMode: true})); }) It('test pipe transform - slow input - 2', function* (done) { var stream = new Readable({objectMode: true}); var size = 10; var values = [uuid(), uuid()]; var table = r.db(dbName).table(dumpTable).toStream({transform: true, debug: true, highWaterMark: 5}); var i = 0; stream._read = function() { var self = this; i++; if (i <= 5) { self.push({field: values[0]}); } else if (i === 6) { setTimeout(function() { self.push({field: values[1]}); }, 3000) } else if (i <= 10) { self.push({field: values[1]}); } else { self.push(null); } } stream.pipe(table) .on('error', done) .on('end', function() { r.expr([ r.db(dbName).table(dumpTable).filter({field: values[0]}).count(), r.db(dbName).table(dumpTable).filter({field: values[1]}).count() ]).run().then(function(result) { assert.deepEqual(result, [5, 5]); assert.deepEqual(table._sequence, [5, 5]) done(); }); }).pipe(devnull({objectMode: true})); }) It('test pipe transform - single insert', function* (done) { // Create a transform stream that will convert data to a string //var stream = new Input(); var stream = new Readable({objectMode: true}); var size = 10; var value = uuid(); var table = r.db(dbName).table(dumpTable).toStream({transform: true, debug: true, highWaterMark: 5}); var i = 0; stream._read = function() { i++; if (i > 10) { this.push(null); } else { var self = this; setTimeout(function() { self.push({field: value}); }, 100); // suppose that each insert take less than 100 ms } } stream.pipe(table) .on('error', done) .on('end', function() { r.expr(r.db(dbName).table(dumpTable).filter({field: value}).count()).run().then(function(result) { assert.deepEqual(result, 10); assert.deepEqual(table._sequence, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) done(); }); }).pipe(devnull({objectMode: true})); }) It('test transform output - object', function* (done) { var stream = new Readable({objectMode: true}); var i = 0; var values = [uuid(), uuid()]; stream._read = function() { var self = this; i++; if (i <= 3) { self.push({field: values[0]}); } else if (i === 4) { setTimeout(function() { self.push({field: values[1]}); }, 300) } else if (i <= 10) { self.push({field: values[1]}); } else { self.push(null); } } var table = r.db(dbName).table(dumpTable).toStream({ transform: true }); var result = []; var endStream = new Stream.Transform(); endStream._writableState.objectMode = true; endStream._readableState.objectMode = true; endStream._transform = function (data, encoding, done) { result.push(data); this.push(data); done(); } stream.pipe(table) .on('error', done) .pipe(endStream) .on('error', done) .on('finish', function() { assert(result.length, 10); for(var i=0; i<result.length; i++) { assert(Object.prototype.toString.call(result[i]), '[object Object]'); } done(); }); }) It('test transform output - string', function* (done) { var stream = new Readable({objectMode: true}); var i = 0; var values = [uuid(), uuid()]; stream._read = function() { var self = this; i++; if (i <= 3) { self.push({field: values[0]}); } else if (i === 4) { setTimeout(function() { self.push({field: values[1]}); }, 300) } else if (i <= 10) { self.push({field: values[1]}); } else { self.push(null); } } var table = r.db(dbName).table(dumpTable).toStream({ transform: true, format: 'primaryKey' }); var result = []; var endStream = new Stream.Transform(); endStream._writableState.objectMode = true; endStream._readableState.objectMode = true; endStream._transform = function (data, encoding, done) { result.push(data); this.push(data); done(); } stream.pipe(table) .on('error', done) .pipe(endStream) .on('error', done) .on('finish', function() { assert(result.length, 10); for(var i=0; i<result.length; i++) { assert(typeof result[i], 'string'); } done(); }); })