UNPKG

rethinkdbdash

Version:

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

513 lines (433 loc) 15.9 kB
var config = require(__dirname+'/config.js'); var r = require(__dirname+'/../lib')({pool: false, silent: true}); var util = require(__dirname+'/util/common.js'); var assert = require('assert'); var uuid = util.uuid; var It = util.It; var connection; // global connection var dbName, tableName, result; It('Testing `run` without connection', function* (done) { try { r.expr(1).run() } catch(e) { if (e.message === '`run` was called without a connection and no pool has been created after:\nr.expr(1)') { done() } else { done(e); } } }) It('Testing `run` with a closed connection', function* (done) { try { connection = yield r.connect(config); assert(connection); connection.close() yield r.expr(1).run(connection) } catch(e) { if (e.message === '`run` was called with a closed connection after:\nr.expr(1)') { done() } else { done(e); } } }) It('Init for `cursor.js`', function* (done) { try { connection = yield r.connect(config); assert(connection); dbName = uuid(); var tableName = uuid(); result = yield r.dbCreate(dbName).run(connection); assert.equal(result.config_changes.length, 1); assert.equal(result.dbs_created, 1); result = yield r.db(dbName).tableCreate(tableName).run(connection); assert.equal(result.tables_created, 1); result = yield r.db(dbName).table(tableName).insert(eval('['+new Array(100).join('{}, ')+'{}]')).run(connection); assert.equal(result.inserted, 100); done(); } catch(e) { done(e); } }) It('`run` should use the default database', function* (done) { try{ dbName = uuid(); tableName = uuid(); var result = yield r.dbCreate(dbName).run(connection); assert.equal(result.dbs_created, 1); result = yield r.db(dbName).tableCreate(tableName).run(connection); assert.equal(result.tables_created, 1); result = yield connection.close(); connection = yield r.connect({db: dbName, host: config.host, port: config.port, authKey: config.authKey}); assert(connection); result = yield r.tableList().run(connection); assert.deepEqual(result, [tableName]) done(); } catch(e) { done(e); } }) It('`use` should work', function* (done) { try{ dbName = uuid(); tableName = uuid(); var result = yield r.dbCreate(dbName).run(connection); assert.equal(result.dbs_created, 1); result = yield r.db(dbName).tableCreate(tableName).run(connection); assert.equal(result.tables_created, 1); connection.use(dbName); result = yield r.tableList().run(connection); assert.deepEqual(result, [tableName]) done(); } catch(e) { done(e); } }) It('`reconnect` should work', function* (done) { try{ var result = yield r.expr(1).run(connection); assert.equal(result, 1); result = yield connection.close(); assert(connection); connection = yield connection.reconnect(); assert(connection); result = yield r.tableList().run(connection); assert.deepEqual(result, [tableName]) done(); } catch(e) { done(e); } }) It('`reconnect` should work with options', function* (done) { try{ var result = yield r.expr(1).run(connection); assert.equal(result, 1); assert(connection); connection = yield connection.reconnect({noreplyWait: true}); assert(connection); result = yield r.expr(1).run(connection); assert.equal(result, 1); connection = yield connection.reconnect({noreplyWait: false}); assert(connection); result = yield r.expr(1).run(connection); assert.equal(result, 1); connection = yield connection.reconnect(); assert(connection); result = yield r.expr(1).run(connection); assert.equal(result, 1); done(); } catch(e) { done(e); } }) It('`noReplyWait` should throw', function* (done) { try{ result = yield connection.noReplyWait() } catch(e) { if (e.message === 'Did you mean to use `noreplyWait` instead of `noReplyWait`?') { done(); } else { done(e); } } }) It('`noreplyWait` should work', function* (done) { try{ result = yield connection.noreplyWait() done(); } catch(e) { done(e); } }) It('`run` should take an argument', function* (done) { try { var result = yield connection.close(); assert(connection); connection = yield r.connect(config); assert(connection); result = yield r.expr(1).run(connection, {readMode: 'primary'}); assert.equal(result, 1); result = yield r.expr(1).run(connection, {readMode: 'majority'}); assert.equal(result, 1); result = yield r.expr(1).run(connection, {profile: false}); assert.equal(result, 1); result = yield r.expr(1).run(connection, {profile: true}); assert(result.profile); assert.equal(result.result, 1); result = yield r.expr(1).run(connection, {durability: 'soft'}); assert.equal(result, 1); result = yield r.expr(1).run(connection, {durability: 'hard'}); assert.equal(result, 1); done(); } catch(e) { done(e); } }) It('`run` should throw on an unrecognized argument', function* (done) { try { result = yield r.expr(1).run(connection, {foo: 'bar'}); } catch(e) { if (e.message === 'Unrecognized option `foo` in `run`. Available options are readMode <string>, durability <string>, noreply <bool>, timeFormat <string>, groupFormat: <string>, profile <bool>, binaryFormat <bool>, cursor <bool>, stream <bool>.') { done(); } else{ done(e); } } }) It('`r()` should be a shortcut for r.expr()', function* (done) { try { result = yield r(1).run(connection); assert.deepEqual(result, 1) done(); } catch(e) { done(e); } }) It('`timeFormat` should work', function* (done) { try { result = yield r.now().run(connection); assert(result instanceof Date); result = yield r.now().run(connection, {timeFormat: 'native'}); assert(result instanceof Date); result = yield r.now().run(connection, {timeFormat: 'raw'}); assert.equal(result.$reql_type$, 'TIME') done(); } catch(e) { done(e); } }) It('`binaryFormat` should work', function* (done) { try { result = yield r.binary(new Buffer([1,2,3])).run(connection, {binaryFormat: 'raw'}); assert.equal(result.$reql_type$, 'BINARY'); done(); } catch(e) { done(e); } }) It('`groupFormat` should work', function* (done) { try { var result = yield r.expr([{name: 'Michel', grownUp: true},{name: 'Laurent', grownUp: true}, {name: 'Sophie', grownUp: true},{name: 'Luke', grownUp: false},{name: 'Mino', grownUp: false}]).group('grownUp').run(connection, {groupFormat: 'raw'}); assert.deepEqual(result, { '$reql_type$': 'GROUPED_DATA', 'data': [ [ false, [ { 'grownUp': false, 'name': 'Luke' }, { 'grownUp': false, 'name': 'Mino' } ] ], [ true, [ { 'grownUp': true, 'name': 'Michel' }, { 'grownUp': true, 'name': 'Laurent' }, { 'grownUp': true, 'name': 'Sophie' } ] ] ] }) done(); } catch(e) { done(e); } }) It('`profile` should work', function* (done) { try{ result = yield r.expr(true).run(connection, {profile: false}); assert(result) result = yield r.expr(true).run(connection, {profile: true}); assert(result.profile) assert.equal(result.result, true) result = yield r.expr(true).run(connection, {profile: false}); assert.equal(result, true) done(); } catch(e){ } }) It('Test error message when running a query on a closed connection', function* (done) { try { yield connection.close(); yield r.expr(1).run(connection) } catch(e) { if (e.message.match('`run` was called with a closed connection after:')) { done(); } else { done(e); } } }) It('Test timeout', function* (done) { var server; try { var port = Math.floor(Math.random()*(65535-1025)+1025) server = require('net').createServer(function(c) { }).listen(port); connection = yield r.connect({ port: port, timeout: 1 }); done(new Error('Was expecting an error')); } catch(err) { //close server if (err.message === 'Failed to connect to localhost:'+port+' in less than 1s.') { done(); } else { done(err) } } }) It('`server` should work', function* (done) { try{ connection = yield r.connect(config); var response = yield connection.server(); assert(typeof response.name === 'string'); assert(typeof response.id === 'string'); done(); } catch(e) { done(e); } }) It('`grant` should work', function* (done) { try{ connection = yield r.connect(config); assert(connection); var restrictedDbName = uuid(); var restrictedTableName = uuid(); result = yield r.dbCreate(restrictedDbName).run(connection); assert.equal(result.config_changes.length, 1); assert.equal(result.dbs_created, 1); result = yield r.db(restrictedDbName).tableCreate(restrictedTableName).run(connection); assert.equal(result.tables_created, 1); var user = uuid(); var password = uuid(); result = yield r.db('rethinkdb').table('users').insert({ id: user, password: password }).run(connection); result = yield r.db(restrictedDbName).table(restrictedTableName).grant(user, { read: true, write: true, config: true }).run(connection); assert.deepEqual(result, { granted: 1, permissions_changes: [{ new_val: { config: true, read: true, write: true }, old_val: null }] }); done(); } catch(e) { done(e); } }) It('If `servers` is specified, it cannot be empty', function* (done) { try{ var r = require(__dirname+'/../lib')({ servers: [] }); } catch(e) { assert.equal(e.message, 'If `servers` is an array, it must contain at least one server.'); done(); } }) /* Since 1.13, the token is stored oustide the query, so this error shouldn't happen anymore It('`connection` should extend events.Emitter and emit an error if the server failed to parse the protobuf message', function* (done) { try{ connection.addListener('error', function() { done(); }); result = yield r.expr(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1).add(1) .run(connection); } catch(e){ if (e.message === 'Client is buggy (failed to deserialize protobuf).\nClosing all outstanding queries...') { //done will be called by the listener on 'error' //done() } else { done(e); } } }) */