You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
559 lines
18 KiB
559 lines
18 KiB
const tap = require('tap') |
|
, sinon = require('sinon') |
|
, util = require('util') |
|
, testCommon = require('./testCommon') |
|
, AbstractLevelDOWN = require('./').AbstractLevelDOWN |
|
, AbstractIterator = require('./').AbstractIterator |
|
, AbstractChainedBatch = require('./').AbstractChainedBatch |
|
|
|
function factory (location) { |
|
return new AbstractLevelDOWN(location) |
|
} |
|
|
|
/*** compatibility with basic LevelDOWN API ***/ |
|
|
|
require('./abstract/leveldown-test').args(factory, tap.test, testCommon) |
|
|
|
require('./abstract/open-test').args(factory, tap.test, testCommon) |
|
|
|
require('./abstract/del-test').setUp(factory, tap.test, testCommon) |
|
require('./abstract/del-test').args(tap.test) |
|
|
|
require('./abstract/get-test').setUp(factory, tap.test, testCommon) |
|
require('./abstract/get-test').args(tap.test) |
|
|
|
require('./abstract/put-test').setUp(factory, tap.test, testCommon) |
|
require('./abstract/put-test').args(tap.test) |
|
|
|
require('./abstract/put-get-del-test').setUp(factory, tap.test, testCommon) |
|
require('./abstract/put-get-del-test').errorKeys(tap.test) |
|
//require('./abstract/put-get-del-test').nonErrorKeys(tap.test, testCommon) |
|
require('./abstract/put-get-del-test').errorValues(tap.test) |
|
//require('./abstract/test/put-get-del-test').nonErrorKeys(tap.test, testCommon) |
|
require('./abstract/put-get-del-test').tearDown(tap.test, testCommon) |
|
|
|
require('./abstract/approximate-size-test').setUp(factory, tap.test, testCommon) |
|
require('./abstract/approximate-size-test').args(tap.test) |
|
|
|
require('./abstract/batch-test').setUp(factory, tap.test, testCommon) |
|
require('./abstract/batch-test').args(tap.test) |
|
|
|
require('./abstract/chained-batch-test').setUp(factory, tap.test, testCommon) |
|
require('./abstract/chained-batch-test').args(tap.test) |
|
|
|
require('./abstract/close-test').close(factory, tap.test, testCommon) |
|
|
|
require('./abstract/iterator-test').setUp(factory, tap.test, testCommon) |
|
require('./abstract/iterator-test').args(tap.test) |
|
require('./abstract/iterator-test').sequence(tap.test) |
|
|
|
/*** extensibility ***/ |
|
|
|
tap.test('test core extensibility', function (t) { |
|
function Test (location) { |
|
AbstractLevelDOWN.call(this, location) |
|
t.equal(this.location, location, 'location set on `this`') |
|
t.end() |
|
} |
|
|
|
util.inherits(Test, AbstractLevelDOWN) |
|
|
|
;new Test('foobar') |
|
}) |
|
|
|
tap.test('test open() extensibility', function (t) { |
|
var spy = sinon.spy() |
|
, expectedCb = function () {} |
|
, expectedOptions = { options: 1 } |
|
, test |
|
|
|
function Test (location) { |
|
AbstractLevelDOWN.call(this, location) |
|
} |
|
|
|
util.inherits(Test, AbstractLevelDOWN) |
|
|
|
Test.prototype._open = spy |
|
|
|
test = new Test('foobar') |
|
test.open(expectedCb) |
|
|
|
t.equal(spy.callCount, 1, 'got _open() call') |
|
t.equal(spy.getCall(0).thisValue, test, '`this` on _open() was correct') |
|
t.equal(spy.getCall(0).args.length, 2, 'got two arguments') |
|
t.deepEqual(spy.getCall(0).args[0], {}, 'got blank options argument') |
|
t.equal(spy.getCall(0).args[1], expectedCb, 'got expected cb argument') |
|
|
|
test.open(expectedOptions, expectedCb) |
|
|
|
t.equal(spy.callCount, 2, 'got _open() call') |
|
t.equal(spy.getCall(1).thisValue, test, '`this` on _open() was correct') |
|
t.equal(spy.getCall(1).args.length, 2, 'got two arguments') |
|
t.deepEqual(spy.getCall(1).args[0], expectedOptions, 'got blank options argument') |
|
t.equal(spy.getCall(1).args[1], expectedCb, 'got expected cb argument') |
|
t.end() |
|
}) |
|
|
|
tap.test('test close() extensibility', function (t) { |
|
var spy = sinon.spy() |
|
, expectedCb = function () {} |
|
, test |
|
|
|
function Test (location) { |
|
AbstractLevelDOWN.call(this, location) |
|
} |
|
|
|
util.inherits(Test, AbstractLevelDOWN) |
|
|
|
Test.prototype._close = spy |
|
|
|
test = new Test('foobar') |
|
test.close(expectedCb) |
|
|
|
t.equal(spy.callCount, 1, 'got _close() call') |
|
t.equal(spy.getCall(0).thisValue, test, '`this` on _close() was correct') |
|
t.equal(spy.getCall(0).args.length, 1, 'got one arguments') |
|
t.equal(spy.getCall(0).args[0], expectedCb, 'got expected cb argument') |
|
t.end() |
|
}) |
|
|
|
tap.test('test get() extensibility', function (t) { |
|
var spy = sinon.spy() |
|
, expectedCb = function () {} |
|
, expectedOptions = { options: 1 } |
|
, expectedKey = 'a key' |
|
, test |
|
|
|
function Test (location) { |
|
AbstractLevelDOWN.call(this, location) |
|
} |
|
|
|
util.inherits(Test, AbstractLevelDOWN) |
|
|
|
Test.prototype._get = spy |
|
|
|
test = new Test('foobar') |
|
test.get(expectedKey, expectedCb) |
|
|
|
t.equal(spy.callCount, 1, 'got _get() call') |
|
t.equal(spy.getCall(0).thisValue, test, '`this` on _get() was correct') |
|
t.equal(spy.getCall(0).args.length, 3, 'got three arguments') |
|
t.equal(spy.getCall(0).args[0], expectedKey, 'got expected key argument') |
|
t.deepEqual(spy.getCall(0).args[1], {}, 'got blank options argument') |
|
t.equal(spy.getCall(0).args[2], expectedCb, 'got expected cb argument') |
|
|
|
test.get(expectedKey, expectedOptions, expectedCb) |
|
|
|
t.equal(spy.callCount, 2, 'got _get() call') |
|
t.equal(spy.getCall(1).thisValue, test, '`this` on _get() was correct') |
|
t.equal(spy.getCall(1).args.length, 3, 'got three arguments') |
|
t.equal(spy.getCall(1).args[0], expectedKey, 'got expected key argument') |
|
t.deepEqual(spy.getCall(1).args[1], expectedOptions, 'got blank options argument') |
|
t.equal(spy.getCall(1).args[2], expectedCb, 'got expected cb argument') |
|
t.end() |
|
}) |
|
|
|
tap.test('test del() extensibility', function (t) { |
|
var spy = sinon.spy() |
|
, expectedCb = function () {} |
|
, expectedOptions = { options: 1 } |
|
, expectedKey = 'a key' |
|
, test |
|
|
|
function Test (location) { |
|
AbstractLevelDOWN.call(this, location) |
|
} |
|
|
|
util.inherits(Test, AbstractLevelDOWN) |
|
|
|
Test.prototype._del = spy |
|
|
|
test = new Test('foobar') |
|
test.del(expectedKey, expectedCb) |
|
|
|
t.equal(spy.callCount, 1, 'got _del() call') |
|
t.equal(spy.getCall(0).thisValue, test, '`this` on _del() was correct') |
|
t.equal(spy.getCall(0).args.length, 3, 'got three arguments') |
|
t.equal(spy.getCall(0).args[0], expectedKey, 'got expected key argument') |
|
t.deepEqual(spy.getCall(0).args[1], {}, 'got blank options argument') |
|
t.equal(spy.getCall(0).args[2], expectedCb, 'got expected cb argument') |
|
|
|
test.del(expectedKey, expectedOptions, expectedCb) |
|
|
|
t.equal(spy.callCount, 2, 'got _del() call') |
|
t.equal(spy.getCall(1).thisValue, test, '`this` on _del() was correct') |
|
t.equal(spy.getCall(1).args.length, 3, 'got three arguments') |
|
t.equal(spy.getCall(1).args[0], expectedKey, 'got expected key argument') |
|
t.deepEqual(spy.getCall(1).args[1], expectedOptions, 'got blank options argument') |
|
t.equal(spy.getCall(1).args[2], expectedCb, 'got expected cb argument') |
|
t.end() |
|
}) |
|
|
|
tap.test('test put() extensibility', function (t) { |
|
var spy = sinon.spy() |
|
, expectedCb = function () {} |
|
, expectedOptions = { options: 1 } |
|
, expectedKey = 'a key' |
|
, expectedValue = 'a value' |
|
, test |
|
|
|
function Test (location) { |
|
AbstractLevelDOWN.call(this, location) |
|
} |
|
|
|
util.inherits(Test, AbstractLevelDOWN) |
|
|
|
Test.prototype._put = spy |
|
|
|
test = new Test('foobar') |
|
test.put(expectedKey, expectedValue, expectedCb) |
|
|
|
t.equal(spy.callCount, 1, 'got _put() call') |
|
t.equal(spy.getCall(0).thisValue, test, '`this` on _put() was correct') |
|
t.equal(spy.getCall(0).args.length, 4, 'got four arguments') |
|
t.equal(spy.getCall(0).args[0], expectedKey, 'got expected key argument') |
|
t.equal(spy.getCall(0).args[1], expectedValue, 'got expected value argument') |
|
t.deepEqual(spy.getCall(0).args[2], {}, 'got blank options argument') |
|
t.equal(spy.getCall(0).args[3], expectedCb, 'got expected cb argument') |
|
|
|
test.put(expectedKey, expectedValue, expectedOptions, expectedCb) |
|
|
|
t.equal(spy.callCount, 2, 'got _put() call') |
|
t.equal(spy.getCall(1).thisValue, test, '`this` on _put() was correct') |
|
t.equal(spy.getCall(1).args.length, 4, 'got four arguments') |
|
t.equal(spy.getCall(1).args[0], expectedKey, 'got expected key argument') |
|
t.equal(spy.getCall(1).args[1], expectedValue, 'got expected value argument') |
|
t.deepEqual(spy.getCall(1).args[2], expectedOptions, 'got blank options argument') |
|
t.equal(spy.getCall(1).args[3], expectedCb, 'got expected cb argument') |
|
t.end() |
|
}) |
|
|
|
tap.test('test approximateSize() extensibility', function (t) { |
|
var spy = sinon.spy() |
|
, expectedCb = function () {} |
|
, expectedStart = 'a start' |
|
, expectedEnd = 'an end' |
|
, test |
|
|
|
function Test (location) { |
|
AbstractLevelDOWN.call(this, location) |
|
} |
|
|
|
util.inherits(Test, AbstractLevelDOWN) |
|
|
|
Test.prototype._approximateSize = spy |
|
|
|
test = new Test('foobar') |
|
test.approximateSize(expectedStart, expectedEnd, expectedCb) |
|
|
|
t.equal(spy.callCount, 1, 'got _approximateSize() call') |
|
t.equal(spy.getCall(0).thisValue, test, '`this` on _approximateSize() was correct') |
|
t.equal(spy.getCall(0).args.length, 3, 'got three arguments') |
|
t.equal(spy.getCall(0).args[0], expectedStart, 'got expected start argument') |
|
t.equal(spy.getCall(0).args[1], expectedEnd, 'got expected end argument') |
|
t.equal(spy.getCall(0).args[2], expectedCb, 'got expected cb argument') |
|
t.end() |
|
}) |
|
|
|
tap.test('test batch() extensibility', function (t) { |
|
var spy = sinon.spy() |
|
, expectedCb = function () {} |
|
, expectedOptions = { options: 1 } |
|
, expectedArray = [ 1, 2 ] |
|
, test |
|
|
|
function Test (location) { |
|
AbstractLevelDOWN.call(this, location) |
|
} |
|
|
|
util.inherits(Test, AbstractLevelDOWN) |
|
|
|
Test.prototype._batch = spy |
|
|
|
test = new Test('foobar') |
|
|
|
test.batch(expectedArray, expectedCb) |
|
|
|
t.equal(spy.callCount, 1, 'got _batch() call') |
|
t.equal(spy.getCall(0).thisValue, test, '`this` on _batch() was correct') |
|
t.equal(spy.getCall(0).args.length, 3, 'got three arguments') |
|
t.equal(spy.getCall(0).args[0], expectedArray, 'got expected array argument') |
|
t.deepEqual(spy.getCall(0).args[1], {}, 'got expected options argument') |
|
t.equal(spy.getCall(0).args[2], expectedCb, 'got expected callback argument') |
|
|
|
test.batch(expectedArray, expectedOptions, expectedCb) |
|
|
|
t.equal(spy.callCount, 2, 'got _batch() call') |
|
t.equal(spy.getCall(1).thisValue, test, '`this` on _batch() was correct') |
|
t.equal(spy.getCall(1).args.length, 3, 'got three arguments') |
|
t.equal(spy.getCall(1).args[0], expectedArray, 'got expected array argument') |
|
t.deepEqual(spy.getCall(1).args[1], expectedOptions, 'got expected options argument') |
|
t.equal(spy.getCall(1).args[2], expectedCb, 'got expected callback argument') |
|
|
|
t.end() |
|
}) |
|
|
|
tap.test('test chained batch() (array) extensibility', function (t) { |
|
var spy = sinon.spy() |
|
, expectedCb = function () {} |
|
, expectedOptions = { options: 1 } |
|
, expectedArray = [ 1, 2 ] |
|
, test |
|
|
|
function Test (location) { |
|
AbstractLevelDOWN.call(this, location) |
|
} |
|
|
|
util.inherits(Test, AbstractLevelDOWN) |
|
|
|
Test.prototype._batch = spy |
|
|
|
test = new Test('foobar') |
|
|
|
test.batch().put('foo', 'bar').del('bang').write(expectedCb) |
|
|
|
t.equal(spy.callCount, 1, 'got _batch() call') |
|
t.equal(spy.getCall(0).thisValue, test, '`this` on _batch() was correct') |
|
t.equal(spy.getCall(0).args.length, 3, 'got three arguments') |
|
t.equal(spy.getCall(0).args[0].length, 2, 'got expected array argument') |
|
t.deepEqual(spy.getCall(0).args[0][0], { type: 'put', key: 'foo', value: 'bar' }, 'got expected array argument[0]') |
|
t.deepEqual(spy.getCall(0).args[0][1], { type: 'del', key: 'bang' }, 'got expected array argument[1]') |
|
t.deepEqual(spy.getCall(0).args[1], {}, 'got expected options argument') |
|
t.equal(spy.getCall(0).args[2], expectedCb, 'got expected callback argument') |
|
|
|
test.batch().put('foo', 'bar').del('bang').write(expectedOptions, expectedCb) |
|
|
|
t.equal(spy.callCount, 2, 'got _batch() call') |
|
t.equal(spy.getCall(1).thisValue, test, '`this` on _batch() was correct') |
|
t.equal(spy.getCall(1).args.length, 3, 'got three arguments') |
|
t.equal(spy.getCall(1).args[0].length, 2, 'got expected array argument') |
|
t.deepEqual(spy.getCall(1).args[0][0], { type: 'put', key: 'foo', value: 'bar' }, 'got expected array argument[0]') |
|
t.deepEqual(spy.getCall(1).args[0][1], { type: 'del', key: 'bang' }, 'got expected array argument[1]') |
|
t.deepEqual(spy.getCall(1).args[1], expectedOptions, 'got expected options argument') |
|
t.equal(spy.getCall(1).args[2], expectedCb, 'got expected callback argument') |
|
|
|
t.end() |
|
}) |
|
|
|
tap.test('test chained batch() (custom _chainedBatch) extensibility', function (t) { |
|
var spy = sinon.spy() |
|
, test |
|
|
|
function Test (location) { |
|
AbstractLevelDOWN.call(this, location) |
|
} |
|
|
|
util.inherits(Test, AbstractLevelDOWN) |
|
|
|
Test.prototype._chainedBatch = spy |
|
|
|
test = new Test('foobar') |
|
|
|
test.batch() |
|
|
|
t.equal(spy.callCount, 1, 'got _chainedBatch() call') |
|
t.equal(spy.getCall(0).thisValue, test, '`this` on _chainedBatch() was correct') |
|
|
|
test.batch() |
|
|
|
t.equal(spy.callCount, 2, 'got _chainedBatch() call') |
|
t.equal(spy.getCall(1).thisValue, test, '`this` on _chainedBatch() was correct') |
|
|
|
t.end() |
|
}) |
|
|
|
tap.test('test AbstractChainedBatch extensibility', function (t) { |
|
function Test (db) { |
|
AbstractChainedBatch.call(this, db) |
|
t.equal(this._db, db, 'db set on `this`') |
|
t.end() |
|
} |
|
|
|
util.inherits(Test, AbstractChainedBatch) |
|
|
|
new Test('foobar') |
|
}) |
|
|
|
tap.test('test write() extensibility', function (t) { |
|
var spy = sinon.spy() |
|
, spycb = sinon.spy() |
|
, test |
|
|
|
function Test (db) { |
|
AbstractChainedBatch.call(this, db) |
|
} |
|
|
|
util.inherits(Test, AbstractChainedBatch) |
|
|
|
Test.prototype._write = spy |
|
|
|
test = new Test('foobar') |
|
test.write(spycb) |
|
|
|
t.equal(spy.callCount, 1, 'got _write() call') |
|
t.equal(spy.getCall(0).thisValue, test, '`this` on _write() was correct') |
|
t.equal(spy.getCall(0).args.length, 1, 'got one argument') |
|
// awkward here cause of nextTick & an internal wrapped cb |
|
t.type(spy.getCall(0).args[0], 'function', 'got a callback function') |
|
t.equal(spycb.callCount, 0, 'spycb not called') |
|
spy.getCall(0).args[0]() |
|
t.equal(spycb.callCount, 1, 'spycb called, i.e. was our cb argument') |
|
t.end() |
|
}) |
|
|
|
tap.test('test put() extensibility', function (t) { |
|
var spy = sinon.spy() |
|
, expectedKey = 'key' |
|
, expectedValue = 'value' |
|
, returnValue |
|
, test |
|
|
|
function Test (db) { |
|
AbstractChainedBatch.call(this, db) |
|
} |
|
|
|
util.inherits(Test, AbstractChainedBatch) |
|
|
|
Test.prototype._put = spy |
|
|
|
test = new Test(factory('foobar')) |
|
returnValue = test.put(expectedKey, expectedValue) |
|
t.equal(spy.callCount, 1, 'got _put call') |
|
t.equal(spy.getCall(0).thisValue, test, '`this` on _put() was correct') |
|
t.equal(spy.getCall(0).args.length, 2, 'got two arguments') |
|
t.equal(spy.getCall(0).args[0], expectedKey, 'got expected key argument') |
|
t.equal(spy.getCall(0).args[1], expectedValue, 'got expected value argument') |
|
t.equal(returnValue, test, 'get expected return value') |
|
t.end() |
|
}) |
|
|
|
tap.test('test del() extensibility', function (t) { |
|
var spy = sinon.spy() |
|
, expectedKey = 'key' |
|
, returnValue |
|
, test |
|
|
|
function Test (db) { |
|
AbstractChainedBatch.call(this, db) |
|
} |
|
|
|
util.inherits(Test, AbstractChainedBatch) |
|
|
|
Test.prototype._del = spy |
|
|
|
test = new Test(factory('foobar')) |
|
returnValue = test.del(expectedKey) |
|
t.equal(spy.callCount, 1, 'got _del call') |
|
t.equal(spy.getCall(0).thisValue, test, '`this` on _del() was correct') |
|
t.equal(spy.getCall(0).args.length, 1, 'got one argument') |
|
t.equal(spy.getCall(0).args[0], expectedKey, 'got expected key argument') |
|
t.equal(returnValue, test, 'get expected return value') |
|
t.end() |
|
}) |
|
|
|
tap.test('test clear() extensibility', function (t) { |
|
var spy = sinon.spy() |
|
, returnValue |
|
, test |
|
|
|
function Test (db) { |
|
AbstractChainedBatch.call(this, db) |
|
} |
|
|
|
util.inherits(Test, AbstractChainedBatch) |
|
|
|
Test.prototype._clear = spy |
|
|
|
test = new Test(factory('foobar')) |
|
returnValue = test.clear() |
|
t.equal(spy.callCount, 1, 'got _clear call') |
|
t.equal(spy.getCall(0).thisValue, test, '`this` on _clear() was correct') |
|
t.equal(spy.getCall(0).args.length, 0, 'got zero arguments') |
|
t.equal(returnValue, test, 'get expected return value') |
|
t.end() |
|
}) |
|
|
|
tap.test('test iterator() extensibility', function (t) { |
|
var spy = sinon.spy() |
|
, expectedOptions = { options: 1, reverse: false } // reverse now explicitly set |
|
, test |
|
|
|
function Test (location) { |
|
AbstractLevelDOWN.call(this, location) |
|
} |
|
|
|
util.inherits(Test, AbstractLevelDOWN) |
|
|
|
Test.prototype._iterator = spy |
|
|
|
test = new Test('foobar') |
|
test.iterator({ options: 1 }) |
|
|
|
t.equal(spy.callCount, 1, 'got _close() call') |
|
t.equal(spy.getCall(0).thisValue, test, '`this` on _close() was correct') |
|
t.equal(spy.getCall(0).args.length, 1, 'got one arguments') |
|
t.deepEqual(spy.getCall(0).args[0], expectedOptions, 'got expected options argument') |
|
t.end() |
|
}) |
|
|
|
tap.test('test AbstractIterator extensibility', function (t) { |
|
function Test (db) { |
|
AbstractIterator.call(this, db) |
|
t.equal(this.db, db, 'db set on `this`') |
|
t.end() |
|
} |
|
|
|
util.inherits(Test, AbstractIterator) |
|
|
|
;new Test('foobar') |
|
}) |
|
|
|
tap.test('test next() extensibility', function (t) { |
|
var spy = sinon.spy() |
|
, spycb = sinon.spy() |
|
, test |
|
|
|
function Test (db) { |
|
AbstractIterator.call(this, db) |
|
} |
|
|
|
util.inherits(Test, AbstractIterator) |
|
|
|
Test.prototype._next = spy |
|
|
|
test = new Test('foobar') |
|
test.next(spycb) |
|
|
|
t.equal(spy.callCount, 1, 'got _next() call') |
|
t.equal(spy.getCall(0).thisValue, test, '`this` on _next() was correct') |
|
t.equal(spy.getCall(0).args.length, 1, 'got one arguments') |
|
// awkward here cause of nextTick & an internal wrapped cb |
|
t.type(spy.getCall(0).args[0], 'function', 'got a callback function') |
|
t.equal(spycb.callCount, 0, 'spycb not called') |
|
spy.getCall(0).args[0]() |
|
t.equal(spycb.callCount, 1, 'spycb called, i.e. was our cb argument') |
|
t.end() |
|
}) |
|
|
|
tap.test('test end() extensibility', function (t) { |
|
var spy = sinon.spy() |
|
, expectedCb = function () {} |
|
, test |
|
|
|
function Test (db) { |
|
AbstractIterator.call(this, db) |
|
} |
|
|
|
util.inherits(Test, AbstractIterator) |
|
|
|
Test.prototype._end = spy |
|
|
|
test = new Test('foobar') |
|
test.end(expectedCb) |
|
|
|
t.equal(spy.callCount, 1, 'got _end() call') |
|
t.equal(spy.getCall(0).thisValue, test, '`this` on _end() was correct') |
|
t.equal(spy.getCall(0).args.length, 1, 'got one arguments') |
|
t.equal(spy.getCall(0).args[0], expectedCb, 'got expected cb argument') |
|
t.end() |
|
})
|
|
|