sharedb
Version:
JSON OT database backend
273 lines (246 loc) • 8.42 kB
JavaScript
var Backend = require('../lib/backend');
var expect = require('chai').expect;
var sinon = require('sinon');
var logger = require('../lib/logger');
describe('Backend', function() {
var backend;
afterEach(function(done) {
backend.close(done);
});
describe('options', function() {
describe('errorHandler', function() {
it('logs by default', function() {
backend = new Backend();
var error = new Error('foo');
sinon.spy(logger, 'error');
backend.errorHandler(error);
expect(logger.error.callCount).to.equal(1);
});
it('overrides with another function', function() {
var handler = sinon.spy();
backend = new Backend({errorHandler: handler});
var error = new Error('foo');
backend.errorHandler(error);
expect(handler.callCount).to.equal(1);
});
});
});
describe('a simple document', function() {
var agent = {
custom: {
foo: 'bar'
}
};
var fetchOptions = {
snapshotOptions: {
fizz: 'buzz'
}
};
beforeEach(function() {
backend = new Backend();
});
beforeEach(function(done) {
var doc = backend.connect().get('books', '1984');
doc.create({title: '1984'}, function(error) {
if (error) return done(error);
doc.submitOp({p: ['author'], oi: 'George Orwell'}, done);
});
});
describe('getOps', function() {
it('fetches all the ops', function(done) {
backend.getOps(agent, 'books', '1984', 0, null, function(error, ops) {
if (error) return done(error);
expect(ops).to.have.length(2);
expect(ops[0].create.data).to.eql({title: '1984'});
expect(ops[1].op).to.eql([{p: ['author'], oi: 'George Orwell'}]);
done();
});
});
it('fetches the ops with metadata', function(done) {
var options = {
opsOptions: {metadata: true}
};
backend.getOps(agent, 'books', '1984', 0, null, options, function(error, ops) {
if (error) return done(error);
expect(ops).to.have.length(2);
expect(ops[0].m).to.be.ok;
expect(ops[1].m).to.be.ok;
done();
});
});
it('passes agent.custom and snapshot options to db', function(done) {
var options = {
opsOptions: {metadata: true}
};
var getOpsSpy = sinon.spy(backend.db, 'getOps');
backend.getOps(agent, 'books', '1984', 0, null, options, function(error) {
if (error) return done(error);
expect(getOpsSpy.getCall(0).args[4]).to.deep.equal({
agentCustom: agent.custom,
metadata: true
});
done();
});
});
});
describe('getOpsBulk', function() {
it('fetches all the ops', function(done) {
backend.getOpsBulk(agent, 'books', {
1984: 0
}, {
1984: null
}, null, function(error, opsPerDoc) {
if (error) return done(error);
var ops = opsPerDoc['1984'];
expect(ops).to.have.length(2);
expect(ops[0].create.data).to.eql({title: '1984'});
expect(ops[1].op).to.eql([{p: ['author'], oi: 'George Orwell'}]);
done();
});
});
it('fetches the ops with metadata', function(done) {
var options = {
opsOptions: {metadata: true}
};
backend.getOpsBulk(agent, 'books', {
1984: 0
}, {
1984: null
}, options, function(error, opsPerDoc) {
if (error) return done(error);
var ops = opsPerDoc['1984'];
expect(ops).to.have.length(2);
expect(ops[0].m).to.be.ok;
expect(ops[1].m).to.be.ok;
done();
});
});
it('passes agent.custom and snapshot options to db', function(done) {
var options = {
opsOptions: {metadata: true}
};
var getOpsBulkSpy = sinon.spy(backend.db, 'getOpsBulk');
backend.getOpsBulk(agent, 'books', {
1984: 0
}, {
1984: null
}, options, function(error) {
if (error) return done(error);
expect(getOpsBulkSpy.getCall(0).args[3]).to.deep.equal({
agentCustom: agent.custom,
metadata: true
});
done();
});
});
});
describe('fetch', function() {
it('fetches the document', function(done) {
backend.fetch(agent, 'books', '1984', function(error, doc) {
if (error) return done(error);
expect(doc.data).to.eql({
title: '1984',
author: 'George Orwell'
});
done();
});
});
it('fetches the document with metadata', function(done) {
var options = {
snapshotOptions: {metadata: true}
};
backend.fetch(agent, 'books', '1984', options, function(error, doc) {
if (error) return done(error);
expect(doc.m).to.be.ok;
done();
});
});
it('passes agent.custom and snapshot options to db', function(done) {
var getSnapshotSpy = sinon.spy(backend.db, 'getSnapshot');
backend.fetch(agent, 'books', '1984', fetchOptions, function(error) {
if (error) return done(error);
expect(getSnapshotSpy.args[0][3]).to.deep.equal({
agentCustom: agent.custom,
fizz: 'buzz'
});
done();
});
});
});
describe('fetchBulk', function() {
it('passes agent.custom and snapshot options to db', function(done) {
var getSnapshotBulkSpy = sinon.spy(backend.db, 'getSnapshotBulk');
backend.fetchBulk(agent, 'books', ['1984'], fetchOptions, function(error) {
if (error) return done(error);
expect(getSnapshotBulkSpy.getCall(0).args[3]).to.deep.equal({
agentCustom: agent.custom,
fizz: 'buzz'
});
done();
});
});
});
describe('subscribe', function() {
it('subscribes to the document', function(done) {
backend.subscribe(agent, 'books', '1984', null, function(error, stream, snapshot) {
if (error) return done(error);
expect(stream.open).to.equal(true);
expect(snapshot.data).to.eql({
title: '1984',
author: 'George Orwell'
});
var op = {op: {p: ['publication'], oi: 1949}};
stream.on('data', function(data) {
expect(data.op).to.eql(op.op);
done();
});
backend.submit(agent, 'books', '1984', op, null, function(error) {
if (error) return done(error);
});
});
});
it('does not support subscribing to the document with options', function(done) {
var options = {
opsOptions: {metadata: true}
};
backend.subscribe(agent, 'books', '1984', null, options, function(error) {
expect(error.code).to.equal('ERR_DATABASE_METHOD_NOT_IMPLEMENTED');
done();
});
});
});
describe('submitRequestEnd', function() {
it('emits after write', function(done) {
var afterWriteCalled = false;
backend.use(backend.MIDDLEWARE_ACTIONS.afterWrite, function(request, next) {
afterWriteCalled = true;
next();
});
backend.on('submitRequestEnd', function(error, request) {
expect(error).not.to.be.ok;
expect(request).to.be.ok;
expect(afterWriteCalled).to.be.true;
done();
});
var op = {op: {p: ['publicationYear'], oi: 1949}};
backend.submit(agent, 'books', '1984', op, null, function(error) {
if (error) done(error);
});
});
it('emits after an error is raised in the middleware', function(done) {
backend.use(backend.MIDDLEWARE_ACTIONS.submit, function(request, next) {
next(new Error());
});
backend.on('submitRequestEnd', function(error, request) {
expect(error).to.be.ok;
expect(request).to.be.ok;
done();
});
var op = {op: {p: ['publicationYear'], oi: 1949}};
backend.submit(agent, 'books', '1984', op, null, function() {
// Swallow the error
});
});
});
});
});