event-storage
Version:
An optimized embedded event store for node.js
132 lines (114 loc) • 4.11 kB
JavaScript
const expect = require('expect.js');
const fs = require('fs-extra');
const path = require('path');
const Watcher = require('../src/Watcher');
const dataDirectory = __dirname + '/data';
describe('Watcher', function() {
let watchers = [];
beforeEach(function() {
fs.emptyDirSync(dataDirectory);
});
afterEach(function() {
watchers.forEach(watcher => watcher.close());
watchers = [];
});
function createWatcher(fileOrDirectory, filter) {
const watcher = new Watcher(path.resolve(dataDirectory, fileOrDirectory), filter);
watchers.push(watcher);
return watcher;
}
it('throws if file doesnt exist', function(){
expect(() => createWatcher('.file')).to.throwError();
});
it('throws if directory doesnt exist', function(){
expect(() => createWatcher('foo/')).to.throwError();
});
it('is singleton per directory', function(){
const watcher1 = createWatcher('');
const watcher2 = createWatcher('');
expect(watcher1.watcher).to.equal(watcher2.watcher);
});
it('can be closed multiple times safely', function(){
const watcher = createWatcher('');
watcher.close();
expect(() => watcher.close()).to.not.throwError();
});
it('throws when trying to bind to invalid event', function(){
const watcher = createWatcher('');
expect(() => watcher.on('foo', () => null)).to.throwError();
});
it('detects changes to files inside a directory', function(done){
const fd = fs.openSync(dataDirectory + '/.file', 'w');
const watcher = createWatcher('');
watcher.on('change', (filename) => {
expect(filename).to.be('.file');
fs.closeSync(fd);
done();
});
fs.writeSync(fd, 'foobar');
fs.fdatasyncSync(fd);
});
it('detects file creations inside a directory', function(done){
let fd;
const watcher = createWatcher('');
watcher.on('rename', (filename) => {
expect(filename).to.be('.file');
fs.closeSync(fd);
done();
});
fd = fs.openSync(dataDirectory + '/.file', 'w');
});
it('detects file renames inside a directory', function(done){
let fd = fs.openSync(dataDirectory + '/.file', 'w');
fs.closeSync(fd);
const watcher = createWatcher('');
let count = 0;
watcher.on('rename', (filename) => {
count++;
if (count === 1) {
expect(filename).to.be('.file');
} else if (count === 2) {
expect(filename).to.be('.file2');
done();
}
});
fs.renameSync(dataDirectory + '/.file', dataDirectory + '/.file2');
});
it('can watch a single file', function(done){
const fd = fs.openSync(dataDirectory + '/.file', 'w');
const fd2 = fs.openSync(dataDirectory + '/.file2', 'w');
const watcher = createWatcher('.file');
watcher.on('change', (filename) => {
expect(filename).to.be('.file');
fs.closeSync(fd);
fs.closeSync(fd2);
done();
});
fs.writeSync(fd2, 'foobar');
fs.fdatasyncSync(fd2);
fs.writeSync(fd, 'foobar');
fs.fdatasyncSync(fd);
});
it('can create multiple instances', function(done){
const fd = fs.openSync(dataDirectory + '/.file', 'w');
const watcher1 = createWatcher('.file');
const watcher2 = createWatcher('.file');
let events = 0;
watcher1.on('change', (filename) => {
expect(filename).to.be('.file');
if (++events === 2) {
fs.closeSync(fd);
done();
}
});
watcher2.on('change', (filename) => {
expect(filename).to.be('.file');
if (++events === 2) {
fs.closeSync(fd);
done();
}
});
fs.writeSync(fd, 'foobar');
fs.fdatasyncSync(fd);
});
});