sharedb
Version: 
JSON OT database backend
101 lines (80 loc) • 3.1 kB
JavaScript
var Backend = require('../../../lib/backend');
var errorHandler = require('../../util').errorHandler;
var expect = require('chai').expect;
describe('DocPresenceEmitter', function() {
  var backend;
  var connection;
  var doc;
  var emitter;
  beforeEach(function(done) {
    backend = new Backend();
    connection = backend.connect();
    doc = connection.get('books', 'northern-lights');
    doc.create({title: 'Northern Lights'}, done);
    emitter = connection._docPresenceEmitter;
  });
  it('listens to an op event', function(done) {
    emitter.addEventListener(doc, 'op', function(op) {
      expect(op).to.eql([{p: ['author'], oi: 'Philip Pullman'}]);
      done();
    });
    doc.submitOp([{p: ['author'], oi: 'Philip Pullman'}], errorHandler(done));
  });
  it('stops listening to events', function(done) {
    var listener = function() {
      done(new Error('should not reach'));
    };
    emitter.addEventListener(doc, 'op', listener);
    emitter.removeEventListener(doc, 'op', listener);
    doc.submitOp([{p: ['author'], oi: 'Philip Pullman'}], done);
  });
  it('removes the listener from the doc if there are no more listeners', function() {
    expect(doc._eventsCount).to.equal(0);
    var listener = function() {};
    emitter.addEventListener(doc, 'op', listener);
    expect(doc._eventsCount).to.be.greaterThan(0);
    expect(emitter._docs).not.to.be.empty;
    expect(emitter._emitters).not.to.be.empty;
    expect(emitter._forwarders).not.to.be.empty;
    emitter.removeEventListener(doc, 'op', listener);
    expect(doc._eventsCount).to.equal(0);
    expect(emitter._docs).to.be.empty;
    expect(emitter._emitters).to.be.empty;
    expect(emitter._forwarders).to.be.empty;
  });
  it('only registers a single listener on the doc', function() {
    expect(doc._eventsCount).to.equal(0);
    var listener = function() { };
    emitter.addEventListener(doc, 'op', listener);
    var count = doc._eventsCount;
    emitter.addEventListener(doc, 'op', listener);
    expect(doc._eventsCount).to.equal(count);
  });
  it('only triggers the given event', function(done) {
    emitter.addEventListener(doc, 'op', function(op) {
      expect(op).to.eql([{p: ['author'], oi: 'Philip Pullman'}]);
      done();
    });
    emitter.addEventListener(doc, 'del', function() {
      done(new Error('should not reach'));
    });
    doc.submitOp([{p: ['author'], oi: 'Philip Pullman'}], errorHandler(done));
  });
  it('removes listeners on destroy', function(done) {
    expect(doc._eventsCount).to.equal(0);
    var listener = function() { };
    emitter.addEventListener(doc, 'op', listener);
    expect(doc._eventsCount).to.be.greaterThan(0);
    expect(emitter._docs).not.to.be.empty;
    expect(emitter._emitters).not.to.be.empty;
    expect(emitter._forwarders).not.to.be.empty;
    doc.destroy(function(error) {
      if (error) return done(error);
      expect(doc._eventsCount).to.equal(0);
      expect(emitter._docs).to.be.empty;
      expect(emitter._emitters).to.be.empty;
      expect(emitter._forwarders).to.be.empty;
      done();
    });
  });
});