UNPKG

rethinkdbdash

Version:

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

395 lines (318 loc) 11 kB
var config = require(__dirname+'/config.js'); var r = require(__dirname+'/../lib')(config); var util = require(__dirname+'/util/common.js'); var assert = require('assert'); var uuid = util.uuid; var It = util.It; var uuid = util.uuid; var dbName, tableName, result; It('Init for `manipulating-tables.js`', function* (done) { try { dbName = uuid(); // export to the global scope var result = yield r.dbCreate(dbName).run(); assert.equal(result.dbs_created, 1); done(); } catch(e) { done(e); } }) It('`tableList` should return a cursor', function* (done) { try { result = yield r.db(dbName).tableList().run(); assert(Array.isArray(result)); done(); } catch(e) { done(e); } }) It('`tableList` should show the table we created', function* (done) { try { tableName = uuid(); // export to the global scope result = yield r.db(dbName).tableCreate(tableName).run(); assert.equal(result.tables_created, 1); result = yield r.db(dbName).tableList().run(); assert(Array.isArray(result)); var found = false; for(var i=0; i<result.length; i++) { if (result[i] === tableName) { found = true; break; } }; if (found === false) { done(new Error("Previously created table not found.")) } else { done(); } } catch(e) { done(e); } }) It('`tableCreate` should create a table', function* (done) { try { tableName = uuid(); // export to the global scope result = yield r.db(dbName).tableCreate(tableName).run(); assert.equal(result.tables_created, 1); done(); } catch(e) { done(e); } }) It('`tableCreate` should create a table -- primaryKey', function* (done) { try { tableName = uuid(); result = yield r.db(dbName).tableCreate(tableName, {primaryKey: "foo"}).run(); assert.equal(result.tables_created, 1); result = yield r.db(dbName).table(tableName).info().run(); assert(result.primary_key, "foo"); done(); } catch(e) { done(e); } }) It('`tableCreate` should create a table -- all args', function* (done) { try { tableName = uuid(); result = yield r.db(dbName).tableCreate(tableName, {durability: "soft", primaryKey: "foo"}).run(); assert.equal(result.tables_created, 1); // We can't really check other parameters... result = yield r.db(dbName).table(tableName).info().run(); assert(result.primary_key, "foo"); done(); } catch(e) { done(e); } }) It('`tableCreate` should throw -- non valid args', function* (done) { try { tableName = uuid(); result = yield r.db(dbName).tableCreate(tableName, {nonValidArg: true}).run(); } catch(e) { if (e.message.match(/^Unrecognized option `nonValidArg` in `tableCreate`/)) { done() } else { done(e) } } }) It('`tableCreate` should throw if no argument is given', function* (done) { try { result = yield r.db(dbName).tableCreate().run(); } catch(e) { if (e.message === '`tableCreate` takes at least 1 argument, 0 provided after:\nr.db("'+dbName+'")') { done() } else { done(e) } } }) It('`tableCreate` should throw is the name contains special char', function* (done) { try { result = yield r.db(dbName).tableCreate("-_-").run(); } catch(e) { if (e.message.match(/Table name `-_-` invalid \(Use A-Za-z0-9_ only\)/)) { done(); } else { done(e); } } }) It('`tableDrop` should drop a table', function* (done) { try { tableName = uuid(); result = yield r.db(dbName).tableCreate(tableName).run(); assert.equal(result.tables_created, 1); result = yield r.db(dbName).tableList().run(); result = yield r.db(dbName).tableDrop(tableName).run(); assert.equal(result.tables_dropped, 1); result = yield r.db(dbName).tableList().run(); assert(Array.isArray(result)); var found = false; for(var i=0; i<result.length; i++) { if (result[i] === tableName) { found = true; break; } }; if (found === true) done(new Error("Previously dropped table found.")); else done(); } catch(e) { done(e); } }) It('`tableDrop` should throw if no argument is given', function* (done) { try { result = yield r.db(dbName).tableDrop().run(); } catch(e) { if (e.message === '`tableDrop` takes 1 argument, 0 provided after:\nr.db("'+dbName+'")') { done() } else { done(e) } } }) It('index operations', function* (done) { try { dbName = uuid(); tableName = uuid(); result = yield r.dbCreate(dbName).run(); assert.equal(result.dbs_created, 1); result = yield r.db(dbName).tableCreate(tableName).run(); assert.equal(result.tables_created, 1); result = yield r.db(dbName).table(tableName).indexCreate("newField").run(); assert.deepEqual(result, {created: 1}); result = yield r.db(dbName).table(tableName).indexList().run(); assert.deepEqual(result, ["newField"]); result = yield r.db(dbName).table(tableName).indexWait().pluck('index', 'ready').run(); assert.deepEqual(result, [ { index: 'newField', ready: true } ]); result = yield r.db(dbName).table(tableName).indexStatus().pluck('index', 'ready').run(); assert.deepEqual(result, [ { index: 'newField', ready: true } ]); result = yield r.db(dbName).table(tableName).indexDrop("newField").run(); assert.deepEqual(result, {dropped: 1}); result = yield r.db(dbName).table(tableName).indexCreate("field1", function(doc) { return doc("field1") }).run(); assert.deepEqual(result, {created: 1}); result = yield r.db(dbName).table(tableName).indexWait('field1').pluck('index', 'ready').run(); assert.deepEqual(result, [ { index: 'field1', ready: true } ]); result = yield r.db(dbName).table(tableName).indexStatus('field1').pluck('index', 'ready').run(); assert.deepEqual(result, [ { index: 'field1', ready: true } ]); result = yield r.db(dbName).table(tableName).indexDrop("field1").run(); assert.deepEqual(result, {dropped: 1}); done(); } catch(e) { done(e) } }) It('`indexCreate` should work with options', function* (done) { try { var result = yield r.db(dbName).table(tableName).indexCreate("foo", {multi: true}).run(); assert.deepEqual(result, {created: 1}); result = yield r.db(dbName).table(tableName).indexCreate("foo1", r.row("foo"), {multi: true}).run(); assert.deepEqual(result, {created: 1}); result = yield r.db(dbName).table(tableName).indexCreate("foo2", function(doc) { return doc("foo")}, {multi: true}).run(); assert.deepEqual(result, {created: 1}); yield r.db(dbName).table(tableName).indexWait().run(); result = yield r.db(dbName).table(tableName).insert({foo: ["bar1", "bar2"], buzz: 1}).run() assert.equal(result.inserted, 1); result = yield r.db(dbName).table(tableName).insert({foo: ["bar1", "bar3"], buzz: 2}).run() assert.equal(result.inserted, 1); result = yield r.db(dbName).table(tableName).getAll("bar1", {index: "foo"}).count().run() assert.equal(result, 2) result = yield r.db(dbName).table(tableName).getAll("bar1", {index: "foo1"}).count().run() assert.equal(result, 2) result = yield r.db(dbName).table(tableName).getAll("bar1", {index: "foo2"}).count().run() assert.equal(result, 2) result = yield r.db(dbName).table(tableName).getAll("bar2", {index: "foo"}).count().run() assert.equal(result, 1) result = yield r.db(dbName).table(tableName).getAll("bar2", {index: "foo1"}).count().run() assert.equal(result, 1) result = yield r.db(dbName).table(tableName).getAll("bar2", {index: "foo2"}).count().run() assert.equal(result, 1) result = yield r.db(dbName).table(tableName).getAll("bar3", {index: "foo"}).count().run() assert.equal(result, 1) result = yield r.db(dbName).table(tableName).getAll("bar3", {index: "foo1"}).count().run() assert.equal(result, 1) result = yield r.db(dbName).table(tableName).getAll("bar3", {index: "foo2"}).count().run() assert.equal(result, 1) // Test when the function is wrapped in an array result = yield r.db(dbName).table(tableName).indexCreate("buzz", [r.row("buzz")]).run(); assert.deepEqual(result, {created: 1}); yield r.db(dbName).table(tableName).indexWait().run(); result = yield r.db(dbName).table(tableName).getAll([1], {index: "buzz"}).count().run() assert.equal(result, 1) done() } catch(e) { done(e) } }) It('`indexCreate` should throw if no argument is passed', function* (done) { try { var result = yield r.db(dbName).table(tableName).indexCreate().run(); } catch(e) { if (e.message === '`indexCreate` takes at least 1 argument, 0 provided after:\nr.db("'+dbName+'").table("'+tableName+'")') { done(); } else { done(e); } } }) It('`indexDrop` should throw if no argument is passed', function* (done) { try { var result = yield r.db(dbName).table(tableName).indexDrop().run(); } catch(e) { if (e.message === '`indexDrop` takes 1 argument, 0 provided after:\nr.db("'+dbName+'").table("'+tableName+'")') { done(); } else { done(e); } } }) It('`indexRename` should work', function* (done) { var toRename = uuid(); var renamed = uuid(); var existing = uuid(); try { var result = yield r.db(dbName).table(tableName).indexCreate(toRename).run(); assert.deepEqual(result, {created: 1}); var result = yield r.db(dbName).table(tableName).indexRename(toRename, renamed).run(); assert.deepEqual(result, {renamed: 1}); var result = yield r.db(dbName).table(tableName).indexCreate(existing).run(); assert.deepEqual(result, {created: 1}); var result = yield r.db(dbName).table(tableName).indexRename(renamed, existing, {overwrite: true}).run(); assert.deepEqual(result, {renamed: 1}); done() } catch(e) { console.log(e); done(e) } }) It('`indexRename` should not overwrite an index if not specified', function* (done) { try { var name = uuid(); var otherName = uuid(); var result = yield r.db(dbName).table(tableName).indexCreate(name).run(); assert.deepEqual(result, {created: 1}); var result = yield r.db(dbName).table(tableName).indexCreate(otherName).run(); assert.deepEqual(result, {created: 1}); var result = yield r.db(dbName).table(tableName).indexRename(otherName, name).run(); } catch(e) { if (e.message.match(/^Index `.*` already exists on table/)) { done() } else { done(e) } } }) It('`indexRename` should throw -- non valid args', function* (done) { try { tableName = uuid(); result = yield r.db(dbName).table(tableName).indexRename("foo", "bar", {nonValidArg: true}).run(); } catch(e) { if (e.message.match(/^Unrecognized option `nonValidArg` in `indexRename`/)) { done() } else { done(e) } } })