orwelldb
Version:
Library, wich helps syncronize blockchain and any database use datascript protocol to write operations (can be wroten in blockchain transactions hex like scriptSig or scriptPubKey)
384 lines (295 loc) • 15.2 kB
JavaScript
var assert = require('assert');
var orwell = require('../orwelldb')
var datascript = orwell.datascript
var $ = orwell.$;
var fs = require('fs')
var pem = fs.readFileSync('./_tests/pem').toString();
describe('orwelldb', function () {
it('add Pem', function (done) {
$({
name: 'community',
public_key: "047f3cd8b44caccd0af9b05ea31f7151520df30c2f2c3b8c451180f9632bc3604e9b77abfa3232f1247ae44fdf380404851211135012b3caf2fca22a7795e95fdb"
})
.then(function (db) {
return db.addPem(pem)
})
.then(function (args) {
assert(args.data.oid && args.data.pem)
done();
})
});
it('remove Pem', function (done) {
var id, _ks;
$({
name: 'test1',
public_key: "047f3cd8b44caccd0af9b05ea31f7151520df30c2f2c3b8c451180f9632bc3604e9b77abfa3232f1247ae44fdf380404851211135012b3caf2fca22a7795e95fdb"
})
.then(function (db) {
return db.addPem(pem)
})
.then(function (args) {
id = args.data.oid;
assert(args.data.oid && args.data.pem)
return $({name: 'test1', public_key: "047f3cd8b44caccd0af9b05ea31f7151520df30c2f2c3b8c451180f9632bc3604e9b77abfa3232f1247ae44fdf380404851211135012b3caf2fca22a7795e95fdb"})
})
.then(function (db) {
return db.keyStoreAccess()
})
.then(function (keystore) {
_ks = keystore;
return keystore.deleteItem('pem', id)
})
.then(function (res) {
assert.equal(res.data.oid, id);
return new Promise(function (resolve) {
resolve()
})
})
.then(function () {
return _ks.getItem('pem', id);
})
.then(function (item) {
assert.equal(item, undefined);
done();
})
});
});
describe('datascriptArray test', function () {
it('read/write', function () {
var hex1 = new datascript({
operation: 'create',
dataset: 'posts',
content: {privileges: [], writeScript: "", owner_key: '047f3cd8b44caccd0af9b05ea31f7151520df30c2f2c3b8c451180f9632bc3604e9b77abfa3232f1247ae44fdf380404851211135012b3caf2fca22a7795e95fdb'}
}).toHEX();
var hex2 = new datascript({
operation: 'write',
dataset: 'posts',
content: {oid: 'c5e5b7f54d2f', test: 6436, act: 3}
}).toHEX();
var hex3 = new datascript({
operation: 'write',
dataset: 'posts',
content: {oid: '34a858ec44ab', test: 12125, act: 4}
}).toHEX()
var hex = datascript.writeArray([
hex1,
hex2,
hex3
]);
var arr = datascript.readArray(hex)
assert.equal(arr[0], hex1)
assert.equal(arr[1], hex2)
assert.equal(arr[2], hex3)
assert.equal(new Buffer(hex, 'hex')[0], 0xef)
})
})
describe('orwelldb', function () {
it('import without encryption', function (done) {
orwell.import({//create db community, add collection, update settings and import 1 entry.
name: 'community1',
public_key: "047f3cd8b44caccd0af9b05ea31f7151520df30c2f2c3b8c451180f9632bc3604e9b77abfa3232f1247ae44fdf380404851211135012b3caf2fca22a7795e95fdb"
},
'ef02bc1905706f737473b454b2010070d976c405000304096f776e65725f6b65798230343766336364386234346361636364306166396230356561333166373135313532306466333063326632633362386334353131383066393633326263333630346539623737616266613332333266313234376165343466646633383034303438353132313131333530313262336361663266636132326137373935653935666462040b777269746553637269707400060a70726976696c65676573003f2005706f7374733754350100f40fff9b05000304036f69640c37663561656132666639376604057469746c6505746573743104047465787406776861743f21'
)
.then(function (results) {
assert.equal(results.length, 2)
assert.equal(results[0].status, 0)//status
assert.equal(results[0].data.oid, 1)//object
assert.equal(results[0].operation, 'update')//operation
assert.equal(results[1].status, 0)
assert.equal(results[1].data.oid, '7f5aea2ff97f')//object
assert(results[1].operation == 'update' || results[1].operation == 'insert')//operation
done();
})
.catch(function (e) {
done(e)
})
});
it('export without encryption', function (done) {
orwell.export({
name: 'community1',
public_key: "047f3cd8b44caccd0af9b05ea31f7151520df30c2f2c3b8c451180f9632bc3604e9b77abfa3232f1247ae44fdf380404851211135012b3caf2fca22a7795e95fdb"
}, function (db) {
return db.create('posts', {privileges: [], writeScript: ''})
.then(function (res) {
return db.write("posts", {oid: '7f5aea2ff97f', title: 'test1', 'text': 'what?!'})
})
})
.then(function (hex) {
var l = datascript.readArray(hex)
assert.equal(l.length, 2);
var arr = [];
for (var i in l) {
var res = new datascript(l[i]);
arr.push(res.toJSON())
}
assert.equal(arr[0].dataset, 'posts')
assert.equal(arr[0].operator, 'create')
assert.equal(arr[0].canRead, true)
assert.equal(arr[0].success, true)
assert.equal(arr[1].dataset, 'posts')
assert.equal(arr[1].operator, 'write')
assert.equal(arr[1].content.oid, '7f5aea2ff97f')
assert.equal(arr[1].canRead, true)
assert.equal(arr[1].success, true)
done();
})
.catch(function (e) {
done(e)
})
});
});
describe('orwelldb encryption', function () {
it('import', function (done) {
orwell.import({//create db community, add collection, update settings and import 1 entry.
name: 'community',
public_key: "047f3cd8b44caccd0af9b05ea31f7151520df30c2f2c3b8c451180f9632bc3604e9b77abfa3232f1247ae44fdf380404851211135012b3caf2fca22a7795e95fdb"
},
'ef02342005706f7374732c542a010003caf5c105000304036f69640c333461383538656334346162020474657374fd5d2f020361637404342005706f7374732c542a0100c27c249705000304036f69640c626361343438656334616666020474657374fd5d2f020361637404'
)
.then(function (results) {
assert.equal(results.length, 2)
assert.equal(results[0].status, 0)//status
assert.equal(results[0].data.oid, '34a858ec44ab')//object
assert.equal(results[0].operation, 'update')//operation
assert.equal(results[1].status, 0)
assert.equal(results[1].data.oid, 'bca448ec4aff')//object
assert(results[1].operation == 'update' || results[1].operation == 'insert')//operation
done();
})
.catch(function (e) {
done(e)
})
});
it('import no key - can not read data, not saving', function (done) {
orwell.import({//create db community, add collection, update settings and import 1 entry.
name: 'community1', //try to sync to another database, wich no have keys in keystore
public_key: "047f3cd8b44caccd0af9b05ea31f7151520df30c2f2c3b8c451180f9632bc3604e9b77abfa3232f1247ae44fdf380404851211135012b3caf2fca22a7795e95fdb"
},
'ef02fd34011905706f737473fd2a0153fd00019b76ff3429cc75249c8d0e1c3b96b62f143ad7f50cacb135513d89adbbd76aeb7ed3d54a035017a1a9d7ba5ef3f68bd29dfc241aa452b48a97232a4cc8bf80cd86fbb26078d1512eed5b40f520c7bc2f8f32abfe936f062255e32458a0eb747771ddcc7d43938d377ebb1e0c2c000b154fa9de0c00a80535c91c04dc0898d342b1006dbaf97af0eb941cad4e4ca1189c7e6c84be366ea085ca47ee6ff5a298d21b0d897de426c46b59d23fe5a5f29500e5c7557ce2cfe8d6ea6a694614928132ea68b095c99a95a274df928ee3100319db3e8b018bb85f3ba8245f96b9fc48586cbe14cbd6238656d468e6570d7202b0f425e6432b6e3b7accacdf8ebd58ba5856015759585e929b496e255e3e8ec6f826523292ddb35ec05e90163559e0819c6ffc4d228787fd34012005706f737473fd2a0153fd000146254e9c7d0b93130f69cc2d2c29d367ae4b8db7a9188bd2d2127d2fa846cf6e084515d1206c23358d40826e0133b8be15de8186f586e4fe6fffb54ca6e746c8f9da91aa1c7320c2dc1f88fcd276fa644a4daafdd37a9dd178a1953281e7dfe4f795da750490a9eb5d12bcc65508382c6d872428ac11b300e5e639605b754f0a54c8142c2255dcefcac2ccade40866e0f58c2567bf8303932270c9126f5da8773722482e2bebb00de1224a60fb10aa12059a96c49ccc2143f8ef8ddd526f35c3019a352c7c3b636fd8c8574e6b532151ace3117512b27959658cee9b3ab747a360d42d931c91bba8d98eff8f7f45fd0737efbec4ae586028ad6cd890a74f3c255601575958bf5d04e52da1ba417707e6c0dfd44e3cee32a0992825cb8a62d48321eb8ac44987'
)
.then(function (results) {
assert.equal(results.length, 2)
assert.equal(results[0].status, 'cantRead')//status
assert.equal(results[1].status, 'cantRead')
assert.equal(results[0].operation, 'create')
assert.equal(results[1].operation, 'write')
done();
})
.catch(function (e) {
done(e)
})
});
it('export', function (done) {
orwell.export({
name: 'community',
public_key: "047f3cd8b44caccd0af9b05ea31f7151520df30c2f2c3b8c451180f9632bc3604e9b77abfa3232f1247ae44fdf380404851211135012b3caf2fca22a7795e95fdb"
}, function (db) {
return db.create('posts', {privileges: [], writeScript: ''})
.then(function (res) {
return db.write("posts", {oid: '7f5aea2ff97f', title: 'test1', 'text': 'what?!'})
})
})
.then(function (hex) {
//try read encrypted content without keys. CanRead must be false
var l = datascript.readArray(hex)
assert.equal(l.length, 2);
var arr = [];
for (var i in l) {
var res = new datascript(l[i]);
arr.push(res.toJSON())
}
assert.equal(arr[0].dataset, 'posts')
assert.equal(arr[0].operator, 'create')
assert.equal(arr[0].canRead, false)
assert.equal(arr[0].success, true)
assert.equal(arr[1].dataset, 'posts')
assert.equal(arr[1].operator, 'write')
assert.equal(arr[1].content, null)
assert.equal(arr[1].canRead, false)
assert.equal(arr[1].success, true)
done();
})
.catch(function (e) {
done(e)
})
});
});
describe('orwelldb manual', function () {
it('list', function (done) {
$({
name: 'community',
public_key: "047f3cd8b44caccd0af9b05ea31f7151520df30c2f2c3b8c451180f9632bc3604e9b77abfa3232f1247ae44fdf380404851211135012b3caf2fca22a7795e95fdb"
})
.then(function (db) {
return db.getCollection("posts")
})
.then(function (dataset) {//first time may be throwned, but second and next - okay
return dataset.findItems()
})
.then(function (lst) {
assert.equal(lst.length, 3);
done()
})
.catch(function (err) {
console.log(err)
})
})
it('cnt1', function (done) {
$({
name: 'community',
public_key: "047f3cd8b44caccd0af9b05ea31f7151520df30c2f2c3b8c451180f9632bc3604e9b77abfa3232f1247ae44fdf380404851211135012b3caf2fca22a7795e95fdb"
})
.then(function (db) {
return db.getCollection("posts")
})
.then(function (dataset) {//first time may be throwned, but second and next - okay
return dataset.count()
})
.then(function (cnt) {
assert.equal(cnt, 3);
done()
})
.catch(function (err) {
console.log(err)
})
})
it('cnt2', function (done) {
$({
name: 'community',
public_key: "047f3cd8b44caccd0af9b05ea31f7151520df30c2f2c3b8c451180f9632bc3604e9b77abfa3232f1247ae44fdf380404851211135012b3caf2fca22a7795e95fdb"
})
.then(function (db) {
return db.getCollection("posts")
})
.then(function (dataset) {
return dataset.getItem('7f5aea2ff97f')
})
.then(function (itm) {
assert.equal('7f5aea2ff97f', itm.oid)
assert.equal('test1', itm.title)
done()
})
.catch(function (err) {
console.log(err)
})
})
it('settings', function (done) {
$({
name: 'community',
public_key: "047f3cd8b44caccd0af9b05ea31f7151520df30c2f2c3b8c451180f9632bc3604e9b77abfa3232f1247ae44fdf380404851211135012b3caf2fca22a7795e95fdb"
})
.then(function (db) {
return db.getSettings("posts")
})
.then(function (settings) {
assert.equal(settings.oid, 1)
assert.equal(settings.owner_key, '047f3cd8b44caccd0af9b05ea31f7151520df30c2f2c3b8c451180f9632bc3604e9b77abfa3232f1247ae44fdf380404851211135012b3caf2fca22a7795e95fdb')
assert.equal(settings.writeScript, '') //0x55 0x60
done()
})
.catch(function (err) {
console.log(err)
})
})
})