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.
381 lines
12 KiB
381 lines
12 KiB
/** |
|
* Copyright (c) 2014 Yahoo! Inc. All rights reserved. |
|
* |
|
* Copyrights licensed under the MIT License. See the accompanying LICENSE file |
|
* for terms. |
|
*/ |
|
|
|
/*global describe, it, beforeEach, before, after */ |
|
|
|
var expect = require('chai').expect; |
|
var Event = require('../../lib/Event.js'); |
|
var WatcherManager = require('../../lib/WatcherManager.js'); |
|
|
|
|
|
describe('WatcherManager', function () { |
|
describe('registerWatcher', function () { |
|
it('should not register same watcher more than once for same event and path.', function () { |
|
var wm = new WatcherManager(), |
|
count = 0, |
|
watcher; |
|
|
|
watcher = function () { |
|
count += 1; |
|
}; |
|
|
|
wm.registerDataWatcher('/test', watcher); |
|
wm.registerDataWatcher('/test', watcher); |
|
|
|
wm.emit({ |
|
type : Event.NODE_DELETED, |
|
path : '/test' |
|
}); |
|
|
|
expect(count).to.equal(1); |
|
|
|
|
|
}); |
|
|
|
it('can register same watcher for different events for the same path.', function () { |
|
var wm = new WatcherManager(), |
|
count = 0, |
|
watcher; |
|
|
|
watcher = function () { |
|
count += 1; |
|
}; |
|
|
|
wm.registerDataWatcher('/test', watcher); |
|
wm.registerChildWatcher('/test', watcher); |
|
|
|
wm.emit({ |
|
type : Event.NODE_DELETED, |
|
path : '/test' |
|
}); |
|
|
|
wm.emit({ |
|
type : Event.NODE_CHILDREN_CHANGED, |
|
path : '/test' |
|
}); |
|
|
|
expect(count).to.equal(2); |
|
|
|
|
|
}); |
|
|
|
it('throws if registering something other then a function', function () { |
|
var wm = new WatcherManager(); |
|
|
|
expect(function(){ |
|
wm.registerDataWatcher('/test', {}); |
|
}).to.throw(Error, 'watcher must be a valid function.'); |
|
}); |
|
}); |
|
|
|
describe('isEmpty', function () { |
|
it('is empty if there are no watchers.', function () { |
|
var wm = new WatcherManager(); |
|
expect(wm.isEmpty()).to.be.true; |
|
}); |
|
|
|
it('is not empty if there is a data watcher.', function () { |
|
var wm = new WatcherManager(); |
|
wm.registerDataWatcher('/test', function(){}); |
|
expect(wm.isEmpty()).to.be.false; |
|
}); |
|
|
|
it('is not empty if there is a child watcher.', function () { |
|
var wm = new WatcherManager(); |
|
wm.registerChildWatcher('/test', function(){}); |
|
expect(wm.isEmpty()).to.be.false; |
|
}); |
|
|
|
it('is not empty if there is an existence watcher.', function () { |
|
var wm = new WatcherManager(); |
|
wm.registerExistenceWatcher('/test', function(){}); |
|
expect(wm.isEmpty()).to.be.false; |
|
}); |
|
}); |
|
|
|
describe('getDataWatcherPaths', function () { |
|
it('is empty if there are no data watchers.', function () { |
|
var wm = new WatcherManager(); |
|
wm.registerExistenceWatcher('/existence', function(){}); |
|
wm.registerChildWatcher('/child', function(){}); |
|
|
|
expect(wm.getDataWatcherPaths()).to.deep.equal([]); |
|
}); |
|
|
|
it('only returns paths of data watchers.', function () { |
|
var wm = new WatcherManager(); |
|
wm.registerDataWatcher('/data', function(){}); |
|
wm.registerExistenceWatcher('/existence', function(){}); |
|
wm.registerChildWatcher('/child', function(){}); |
|
expect(wm.getDataWatcherPaths()).to.deep.equal(['/data']); |
|
}); |
|
|
|
it('does not duplicate paths.', function () { |
|
var wm = new WatcherManager(); |
|
wm.registerDataWatcher('/data', function(){}); |
|
wm.registerDataWatcher('/data', function(){}); |
|
expect(wm.getDataWatcherPaths()).to.deep.equal(['/data']); |
|
}); |
|
}); |
|
|
|
describe('getExistenceWatcherPaths', function () { |
|
it('is empty if there are no existence watchers.', function () { |
|
var wm = new WatcherManager(); |
|
wm.registerDataWatcher('/data', function(){}); |
|
wm.registerChildWatcher('/child', function(){}); |
|
|
|
expect(wm.getExistenceWatcherPaths()).to.deep.equal([]); |
|
}); |
|
|
|
it('only returns paths of existence watchers.', function () { |
|
var wm = new WatcherManager(); |
|
wm.registerDataWatcher('/data', function(){}); |
|
wm.registerExistenceWatcher('/existence', function(){}); |
|
wm.registerChildWatcher('/child', function(){}); |
|
expect(wm.getExistenceWatcherPaths()).to.deep.equal(['/existence']); |
|
}); |
|
|
|
it('does not duplicate paths.', function () { |
|
var wm = new WatcherManager(); |
|
wm.registerExistenceWatcher('/existence', function(){}); |
|
wm.registerExistenceWatcher('/existence', function(){}); |
|
expect(wm.getExistenceWatcherPaths()).to.deep.equal(['/existence']); |
|
}); |
|
}); |
|
|
|
describe('getChildWatcherPaths', function () { |
|
it('is empty if there are no existence watchers.', function () { |
|
var wm = new WatcherManager(); |
|
wm.registerDataWatcher('/data', function(){}); |
|
wm.registerExistenceWatcher('/existence', function(){}); |
|
|
|
expect(wm.getChildWatcherPaths()).to.deep.equal([]); |
|
}); |
|
|
|
it('only returns paths of child watchers.', function () { |
|
var wm = new WatcherManager(); |
|
wm.registerDataWatcher('/data', function(){}); |
|
wm.registerExistenceWatcher('/existence', function(){}); |
|
wm.registerChildWatcher('/child', function(){}); |
|
expect(wm.getChildWatcherPaths()).to.deep.equal(['/child']); |
|
}); |
|
|
|
it('does not duplicate paths.', function () { |
|
var wm = new WatcherManager(); |
|
wm.registerChildWatcher('/child', function(){}); |
|
wm.registerChildWatcher('/child', function(){}); |
|
expect(wm.getChildWatcherPaths()).to.deep.equal(['/child']); |
|
}); |
|
}); |
|
|
|
describe('emit', function () { |
|
it('only emits valid objects.', function () { |
|
var wm = new WatcherManager(); |
|
|
|
expect(function(){ |
|
wm.emit(null); |
|
}).to.throw(Error, 'watcherEvent must be a valid object.'); |
|
}); |
|
|
|
it('only emits known event types.', function () { |
|
var wm = new WatcherManager(); |
|
var fakeEvent = {type: 'fake event'}; |
|
|
|
expect(function(){ |
|
wm.emit({type: 'fake event'}); |
|
}).to.throw(Error, 'Unknown event type: ' + fakeEvent.type); |
|
}); |
|
|
|
describe('NODE_CREATED events', function () { |
|
it('notifies data watchers.', function () { |
|
var wm = new WatcherManager(), |
|
count = 0; |
|
|
|
wm.registerDataWatcher('/test', function () { |
|
count += 1; |
|
}); |
|
wm.emit({ |
|
type : Event.NODE_CREATED, |
|
path : '/test' |
|
}); |
|
|
|
expect(count).to.equal(1); |
|
}); |
|
|
|
it('notifies existence watchers.', function () { |
|
var wm = new WatcherManager(), |
|
count = 0; |
|
|
|
wm.registerExistenceWatcher('/test', function () { |
|
count += 1; |
|
}); |
|
wm.emit({ |
|
type : Event.NODE_CREATED, |
|
path : '/test' |
|
}); |
|
|
|
expect(count).to.equal(1); |
|
}); |
|
|
|
it('does not notify child watchers.', function () { |
|
var wm = new WatcherManager(), |
|
count = 0; |
|
|
|
wm.registerChildWatcher('/test', function () { |
|
count += 1; |
|
}); |
|
wm.emit({ |
|
type : Event.NODE_CREATED, |
|
path : '/test' |
|
}); |
|
|
|
expect(count).to.equal(0); |
|
}); |
|
}); |
|
|
|
describe('NODE_DATA_CHANGED events', function () { |
|
it('notifies data watchers.', function () { |
|
var wm = new WatcherManager(), |
|
count = 0; |
|
|
|
wm.registerDataWatcher('/test', function () { |
|
count += 1; |
|
}); |
|
wm.emit({ |
|
type : Event.NODE_DATA_CHANGED, |
|
path : '/test' |
|
}); |
|
|
|
expect(count).to.equal(1); |
|
}); |
|
|
|
it('notifies existence watchers.', function () { |
|
var wm = new WatcherManager(), |
|
count = 0; |
|
|
|
wm.registerExistenceWatcher('/test', function () { |
|
count += 1; |
|
}); |
|
wm.emit({ |
|
type : Event.NODE_DATA_CHANGED, |
|
path : '/test' |
|
}); |
|
|
|
expect(count).to.equal(1); |
|
}); |
|
|
|
it('does not notify child watchers.', function () { |
|
var wm = new WatcherManager(), |
|
count = 0; |
|
|
|
wm.registerChildWatcher('/test', function () { |
|
count += 1; |
|
}); |
|
wm.emit({ |
|
type : Event.NODE_DATA_CHANGED, |
|
path : '/test' |
|
}); |
|
|
|
expect(count).to.equal(0); |
|
}); |
|
}); |
|
|
|
describe('NODE_CHILDREN_CHANGED events', function () { |
|
it('notifies child watchers.', function () { |
|
var wm = new WatcherManager(), |
|
count = 0; |
|
|
|
wm.registerChildWatcher('/test', function () { |
|
count += 1; |
|
}); |
|
wm.emit({ |
|
type : Event.NODE_CHILDREN_CHANGED, |
|
path : '/test' |
|
}); |
|
|
|
expect(count).to.equal(1); |
|
}); |
|
|
|
it('does not notify data watchers.', function () { |
|
var wm = new WatcherManager(), |
|
count = 0; |
|
|
|
wm.registerDataWatcher('/test', function () { |
|
count += 1; |
|
}); |
|
wm.emit({ |
|
type : Event.NODE_CHILDREN_CHANGED, |
|
path : '/test' |
|
}); |
|
|
|
expect(count).to.equal(0); |
|
}); |
|
|
|
it('does not notify existence watchers.', function () { |
|
var wm = new WatcherManager(), |
|
count = 0; |
|
|
|
wm.registerExistenceWatcher('/test', function () { |
|
count += 1; |
|
}); |
|
wm.emit({ |
|
type : Event.NODE_CHILDREN_CHANGED, |
|
path : '/test' |
|
}); |
|
|
|
expect(count).to.equal(0); |
|
}); |
|
}); |
|
|
|
describe('NODE_DELETED events', function () { |
|
it('notifies child watchers.', function () { |
|
var wm = new WatcherManager(), |
|
count = 0; |
|
|
|
wm.registerChildWatcher('/test', function () { |
|
count += 1; |
|
}); |
|
wm.emit({ |
|
type : Event.NODE_DELETED, |
|
path : '/test' |
|
}); |
|
|
|
expect(count).to.equal(1); |
|
}); |
|
|
|
it('notifies data watchers.', function () { |
|
var wm = new WatcherManager(), |
|
count = 0; |
|
|
|
wm.registerDataWatcher('/test', function () { |
|
count += 1; |
|
}); |
|
wm.emit({ |
|
type : Event.NODE_DELETED, |
|
path : '/test' |
|
}); |
|
|
|
expect(count).to.equal(1); |
|
}); |
|
|
|
it('does not notify existence watchers.', function () { |
|
var wm = new WatcherManager(), |
|
count = 0; |
|
|
|
wm.registerExistenceWatcher('/test', function () { |
|
count += 1; |
|
}); |
|
wm.emit({ |
|
type : Event.NODE_DELETED, |
|
path : '/test' |
|
}); |
|
|
|
expect(count).to.equal(0); |
|
}); |
|
}); |
|
}); |
|
});
|
|
|