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.
220 lines
4.6 KiB
220 lines
4.6 KiB
var tape = require('tape') |
|
var pull = require('pull-stream') |
|
var path = require('path') |
|
|
|
//the mock is partical levelup api. |
|
var mock = require('./mock') |
|
var nut = require('../nut') |
|
var shell = require('../shell') //the shell surrounds the nut |
|
var codec = require('levelup/lib/codec') |
|
var concat = require('../codec') |
|
var legacy = require('../codec/legacy') |
|
var bytewise = require('../codec/bytewise') |
|
|
|
|
|
var codex = [ |
|
concat, |
|
legacy, |
|
bytewise |
|
] |
|
|
|
var pullReadStream = require('../pull') |
|
|
|
function create (precodec, db) { |
|
|
|
//convert pull stream to iterators |
|
return shell ( nut ( db || mock(), precodec, codec ), [], pullReadStream) |
|
} |
|
|
|
function prehookPut (db) { |
|
tape('test - prehook - put', function (t) { |
|
|
|
var log = db.sublevel('log') |
|
var c = 0 |
|
db.pre(function (op, add) { |
|
add({key: ''+c++, value: op.key, prefix: log.prefix()}) |
|
}) |
|
|
|
db.put('hello', 'there?', function (err) { |
|
|
|
if(err) throw err |
|
log.get('0', function (err, value) { |
|
if(err) throw err |
|
t.equal(value, 'hello') |
|
t.end() |
|
}) |
|
}) |
|
}) |
|
} |
|
|
|
function prehookBatch (db) { |
|
tape('test - prehook - put', function (t) { |
|
// var db = shell ( nut ( mock(), precodec, codec ) ) |
|
|
|
var log = db.sublevel('log') |
|
var c = 0 |
|
db.pre(function (op, add) { |
|
add({key: ''+c++, value: op.key, prefix: log.prefix()}) |
|
}) |
|
|
|
db.batch([ |
|
{key:'hello1', value: 'there.', type: 'put'}, |
|
{key:'hello2', value: 'there!', type: 'put'}, |
|
{key:'hello3', value: 'where?', type: 'put'}, |
|
], function (err) { |
|
if(err) throw err |
|
log.get('0', function (err, value) { |
|
if(err) throw err |
|
t.equal(value, 'hello1') |
|
log.get('1', function (err, value) { |
|
if(err) throw err |
|
t.equal(value, 'hello2') |
|
log.get('2', function (err, value) { |
|
if(err) throw err |
|
t.equal(value, 'hello3') |
|
t.end() |
|
}) |
|
}) |
|
}) |
|
}) |
|
}) |
|
} |
|
|
|
function createPostHooks (db) { |
|
|
|
function posthook (args, calls, db) { |
|
//db = db || shell ( nut ( mock(), concat, codec ) ) |
|
|
|
var method = args.shift() |
|
tape('test - posthook - ' + method, function (t) { |
|
|
|
var cb = 0, hk = 0 |
|
var rm = db.post(function (op) { |
|
hk ++ |
|
next() |
|
}) |
|
|
|
console.log(db, args) |
|
db[method].apply(db, args.concat(function (err) { |
|
console.log('**************8') |
|
if(err) console.log(err.stack) |
|
// if(err) throw err |
|
cb ++ |
|
next() |
|
})) |
|
|
|
function next () { |
|
if(cb + hk < calls + 1) return |
|
t.equal(cb, 1) |
|
t.equal(hk, calls) |
|
rm() |
|
t.end() |
|
} |
|
|
|
}) |
|
} |
|
|
|
// test posthooks trigger correct number of times |
|
|
|
|
|
posthook(['put', 'hello', 'there?'], 1, db) |
|
posthook(['del', 'hello'], 1, db) |
|
posthook(['batch', [ |
|
{ key: 'foo', value: 'bar', type: 'put'}, |
|
{ key: 'fuz', value: 'baz', type: 'put'}, |
|
{ key: 'fum', value: 'boo', type: 'put'} |
|
]], 3, db) |
|
|
|
} |
|
|
|
// test posthooks also work in sublevels |
|
|
|
//test removing hooks. |
|
|
|
function rmHook (db) { |
|
tape('test - prehook - put', function (t) { |
|
// db = db || shell ( nut ( mock(), precodec, codec ) ) |
|
|
|
var hk = 0 |
|
var rm = db.pre(function (op, add) { |
|
hk ++ |
|
t.equal(op.key, 'hello') |
|
t.equal(op.value, 'there') |
|
}) |
|
|
|
db.put('hello', 'there', function (err) { |
|
if(err) throw err |
|
t.equal(hk, 1) |
|
db.put('hello', 'where?', function (err) { |
|
if(err) throw err |
|
t.equal(hk, 1) |
|
t.end() |
|
}) |
|
}) |
|
rm() |
|
|
|
}) |
|
|
|
} |
|
|
|
function stream (db) { |
|
|
|
tape('pull-stream', function (t) { |
|
var batch = [ |
|
{ key: 'foo', value: 'bar'}, |
|
{ key: 'fum', value: 'boo'}, |
|
{ key: 'fuz', value: 'baz'} |
|
] |
|
|
|
db.batch(batch, function (err) { |
|
if(err) throw err |
|
|
|
pull(db.createReadStream(), pull.collect(function (err, ary) { |
|
if(err) throw err |
|
console.log(ary) |
|
t.deepEqual(ary, batch) |
|
t.end() |
|
})) |
|
}) |
|
}) |
|
} |
|
|
|
|
|
var tests = [ |
|
prehookPut, |
|
prehookBatch, |
|
createPostHooks, |
|
rmHook, |
|
stream |
|
] |
|
|
|
var LevelDown = require('leveldown') |
|
var i = 0 |
|
var rimraf = require('rimraf') |
|
|
|
function createTestDb () { |
|
var dir = path.join('/tmp', 'level-sublevel_test' + (i++)) |
|
rimraf.sync(dir) |
|
return new LevelDown(dir) |
|
} |
|
|
|
codex.forEach(function (codec) { |
|
|
|
tests.forEach(function (test) { |
|
|
|
var db1 = create(codec) |
|
|
|
test(db1) |
|
test(db1.sublevel('foo')) |
|
test(db1.sublevel('foo').sublevel('blah')) |
|
|
|
var db3 = create(codec, createTestDb()) |
|
|
|
test(db3) |
|
test(db3.sublevel('foo')) |
|
test(db3.sublevel('foo').sublevel('blah')) |
|
|
|
}) |
|
|
|
}) |
|
|
|
|