From a794387af223e1cc00889339927198e19dc90bba Mon Sep 17 00:00:00 2001 From: Nolan Lawson Date: Thu, 8 Sep 2016 22:01:03 -0700 Subject: [PATCH] get code coverage up to 100% (#53) --- memdown.js | 24 ++----- test.js | 201 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 206 insertions(+), 19 deletions(-) diff --git a/memdown.js b/memdown.js index e39962a..b3ceb59 100644 --- a/memdown.js +++ b/memdown.js @@ -2,13 +2,10 @@ var inherits = require('inherits') , AbstractLevelDOWN = require('abstract-leveldown').AbstractLevelDOWN , AbstractIterator = require('abstract-leveldown').AbstractIterator , ltgt = require('ltgt') - , setImmediate = global.setImmediate || process.nextTick , createRBT = require('functional-red-black-tree') , globalStore = {} - -function toKey (key) { - return typeof key == 'string' ? '$' + key : JSON.stringify(key) -} +/* istanbul ignore next */ +var setImmediate = global.setImmediate || process.nextTick function gt(value) { return ltgt.compare(value, this._end) > 0 @@ -123,7 +120,7 @@ function MemDOWN (location) { AbstractLevelDOWN.call(this, typeof location == 'string' ? location : '') - this._location = this.location ? toKey(this.location) : '_tree' + this._location = this.location ? ('$' + this.location) : '_tree' this._store = this.location ? globalStore: this this._store[this._location] = this._store[this._location] || createRBT(ltgt.compare) } @@ -183,8 +180,7 @@ MemDOWN.prototype._del = function (key, options, callback) { } MemDOWN.prototype._batch = function (array, options, callback) { - var err - , i = -1 + var i = -1 , key , value , iter @@ -196,20 +192,10 @@ MemDOWN.prototype._batch = function (array, options, callback) { continue; key = this._isBuffer(array[i].key) ? array[i].key : String(array[i].key) - err = this._checkKey(key, 'key') - if (err) - return setImmediate(function errorCall() { callback(err) }) - iter = tree.find(key) if (array[i].type === 'put') { value = this._isBuffer(array[i].value) ? array[i].value : String(array[i].value) - if (value === null || value === undefined) - err = new Error('value cannot be `null` or `undefined`') - - if (err) - return setImmediate(function errorCall() { callback(err) }) - tree = iter.valid ? iter.update(value) : tree.insert(key, value) } else { tree = iter.remove() @@ -230,7 +216,7 @@ MemDOWN.prototype._isBuffer = function (obj) { } MemDOWN.destroy = function (name, callback) { - var key = toKey(name) + var key = '$' + name if (key in globalStore) delete globalStore[key] diff --git a/test.js b/test.js index 1145f0b..5c9c9f5 100644 --- a/test.js +++ b/test.js @@ -289,3 +289,204 @@ test('empty value in batch', function (t) { }) }) }) + +test('empty buffer key in batch', function (t) { + + var db = new MemDOWN('empty-buffer') + var noerr = function (err) { + t.error(err, 'opens correctly') + } + + db.open(noerr) + + db.batch([{ + type: 'put', + key: new Buffer(0), + value: '' + }], function (err) { + t.ok(err, 'got an error') + t.end() + }) +}) + +test('buffer key in batch', function (t) { + + var db = new MemDOWN('buffer-key') + var noerr = function (err) { + t.error(err, 'opens correctly') + } + + db.open(noerr) + + db.batch([{ + type: 'put', + key: new Buffer('foo', 'utf8'), + value: 'val1' + }], function (err) { + t.error(err, 'no error') + db.get(new Buffer('foo', 'utf8'), {asBuffer:false}, function (err, val) { + t.error(err, 'no error') + t.same(val, 'val1') + t.end() + }) + }) +}) + +test('array with holes in batch()', function (t) { + + var db = new MemDOWN('holey') + , noerr = function (err) { + t.error(err, 'opens correctly') + } + , noop = function () {} + + db.open(noerr) + + db.batch([ + { + type: 'put', + key: 'key1', + value: 'val1' + }, + void 0, + { + type: 'put', + key: 'key2', + value: 'val2' + } + ], function (err) { + t.error(err, 'no error') + db.get('key1', {asBuffer: false}, function (err, val) { + t.error(err, 'no error') + t.same(val, 'val1') + db.get('key2', {asBuffer: false}, function (err, val) { + t.error(err, 'no error') + t.same(val, 'val2') + t.end() + }) + }) + }) +}) + +test('put multiple times', function (t) { + t.plan(5) + + var db = new MemDOWN() + + var noerr = function (err) { + t.error(err, 'opens correctly') + } + + db.open(noerr) + + db.put('key', 'val', function (err) { + t.error(err, 'no error') + db.put('key', 'val2', function (err) { + t.error(err, 'no error') + db.get('key', {asBuffer: false}, function (err, val) { + t.error(err, 'no error') + t.same(val, 'val2') + }) + }) + }) +}) + +test('global store', function (t) { + + var db = new MemDOWN('foobar') + + var noerr = function (err) { + t.error(err, 'opens correctly') + } + + db.open(noerr) + + db.put('key', 'val', function (err) { + t.error(err, 'no error') + db.get('key', {asBuffer: false}, function (err, val) { + t.error(err, 'no error') + t.same(val, 'val') + var db2 = new MemDOWN('foobar') + db2.open(noerr) + db2.get('key', { asBuffer: false }, function (err, val) { + t.error(err, 'no error') + t.same(val, 'val') + MemDOWN.clearGlobalStore() + var db3 = new MemDOWN('foobar') + db3.open(noerr) + db3.get('key', { asBuffer: false }, function (err) { + t.ok(err, 'should be an error') + t.end() + }) + }) + }) + }) +}) + +test('global store, strict', function (t) { + + var db = new MemDOWN('foobar') + + var noerr = function (err) { + t.error(err, 'opens correctly') + } + + db.open(noerr) + + db.put('key', 'val', function (err) { + t.error(err, 'no error') + db.get('key', {asBuffer: false}, function (err, val) { + t.error(err, 'no error') + t.same(val, 'val') + var db2 = new MemDOWN('foobar') + db2.open(noerr) + db2.get('key', { asBuffer: false }, function (err, val) { + t.error(err, 'no error') + t.same(val, 'val') + MemDOWN.clearGlobalStore(true) + var db3 = new MemDOWN('foobar') + db3.open(noerr) + db3.get('key', { asBuffer: false }, function (err) { + t.ok(err, 'should be an error') + t.end() + }) + }) + }) + }) +}) + +test('call .destroy twice', function (t) { + var db = new MemDOWN('destroy-test') + var db2 = new MemDOWN('other-db') + db2.put('key2', 'value2', function (err) { + t.notOk(err, 'no error') + db.put('key', 'value', function (err) { + t.notOk(err, 'no error') + db.get('key', {asBuffer: false}, function (err, value) { + t.notOk(err, 'no error') + t.equal(value, 'value', 'should have value') + db.close(function (err) { + t.notOk(err, 'no error') + db2.close(function (err) { + t.notOk(err, 'no error') + MemDOWN.destroy('destroy-test', function (err) { + t.notOk(err, 'no error') + MemDOWN.destroy('destroy-test', function (err) { + var db3 = new MemDOWN('destroy-test') + var db4 = new MemDOWN('other-db') + db3.get('key', function (err, value) { + t.ok(err, 'key is not there') + db4.get('key2', {asBuffer: false}, function (err, value) { + t.notOk(err, 'no error') + t.equal(value, 'value2', 'should have value2') + t.end() + }) + }) + }) + }) + }) + }) + }) + }) + }) +}) \ No newline at end of file