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

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()
})