1
Fork 0

make tests stricter for file events

This commit is contained in:
Conduitry 2018-10-24 06:54:46 -04:00
parent a8f6d5c970
commit b7b5a8d2ba
1 changed files with 123 additions and 94 deletions

217
test.js
View File

@ -17,29 +17,42 @@ const rmdir =
exec(`rmdir /s /q ${path.replace(/\//g, '\\')} 2> nul`).catch(() => {}) exec(`rmdir /s /q ${path.replace(/\//g, '\\')} 2> nul`).catch(() => {})
: path => exec('rm -rf ' + path); : path => exec('rm -rf ' + path);
const sleep = (ms = 1000) => new Promise(res => setTimeout(res, ms)); const sleep = (ms = 500) => new Promise(res => setTimeout(res, ms));
function getEvents(watch) { function getEvents(watch) {
const events = new Set(); const files = new Set();
const directories = new Set();
watch.on('+', ({ path, stats, isNew }) => { watch.on('+', ({ path, stats, isNew }) => {
const event = `${isNew ? 'new' : 'updated'} ${ if (stats.isFile()) {
stats.isFile() ? 'file' : '' const event = `${isNew ? 'added' : 'updated'} ${path}`;
}${stats.isDirectory() ? 'directory' : ''} ${path}`; if (files.has(event)) {
if (stats.isFile() && events.has(event)) { throw new Error(`Duplicate event: ${event}`);
throw new Error(`Duplicate event: ${event}`); }
files.add(event);
}
if (stats.isDirectory()) {
const event = `${isNew ? 'added' : 'updated'} ${path}`;
directories.add(event);
} }
events.add(event);
}); });
watch.on('-', ({ path, stats }) => { watch.on('-', ({ path, stats }) => {
const event = `deleted ${stats.isFile() ? 'file' : ''}${ if (stats.isFile()) {
stats.isDirectory() ? 'directory' : '' const event = `deleted ${path}`;
} ${path}`; if (files.has(event)) {
if (stats.isFile() && events.has(event)) { throw new Error(`Duplicate event: ${event}`);
throw new Error(`Duplicate event: ${event}`); }
files.add(event);
}
if (stats.isDirectory()) {
const event = `deleted ${path}`;
directories.add(event);
} }
events.add(event);
}); });
return events; const clear = () => {
files.clear();
directories.clear();
};
return { files, directories, clear };
} }
(async () => { (async () => {
@ -50,103 +63,119 @@ function getEvents(watch) {
console.log('running tests ...'); console.log('running tests ...');
const watch = new CheapWatch({ dir: process.cwd() }); {
const events = getEvents(watch); const watch = new CheapWatch({ dir: process.cwd() });
const { files, directories, clear } = getEvents(watch);
await writeFile('foo', ''); await writeFile('foo', '');
await mkdir('bar'); await mkdir('bar');
await writeFile('bar/baz', ''); await writeFile('bar/baz', '');
await watch.init(); await sleep();
assert.equal(watch.paths.size, 3); await watch.init();
assert.ok(watch.paths.get('foo').isFile()); assert.equal(watch.paths.size, 3);
assert.ok(watch.paths.get('bar').isDirectory()); assert.ok(watch.paths.get('foo').isFile());
assert.ok(watch.paths.get('bar/baz').isFile()); assert.ok(watch.paths.get('bar').isDirectory());
assert.ok(watch.paths.get('bar/baz').isFile());
assert.equal(files.size, 0);
assert.equal(directories.size, 0);
await writeFile('foo', ''); await writeFile('foo', '');
await sleep(); await sleep();
assert.ok(events.has('updated file foo')); assert.equal(files.size, 1);
events.clear(); assert.ok(files.has('updated foo'));
clear();
await writeFile('bar/qux', ''); await writeFile('bar/qux', '');
await sleep(); await sleep();
assert.ok(events.has('new file bar/qux')); assert.equal(files.size, 1);
assert.ok(events.has('updated directory bar')); assert.ok(files.has('added bar/qux'));
events.clear(); assert.ok(directories.has('updated bar'));
clear();
await rmdir('bar'); await rmdir('bar');
await sleep(); await sleep();
assert.ok(events.has('deleted directory bar')); assert.ok(directories.has('deleted bar'));
assert.ok(events.has('deleted file bar/baz')); assert.equal(files.size, 2);
assert.ok(events.has('deleted file bar/qux')); assert.ok(files.has('deleted bar/baz'));
events.clear(); assert.ok(files.has('deleted bar/qux'));
clear();
await unlink('foo'); await unlink('foo');
await sleep(); await sleep();
assert.ok(events.has('deleted file foo')); assert.equal(files.size, 1);
events.clear(); assert.ok(files.has('deleted foo'));
clear();
await Promise.all([writeFile('foo', ''), writeFile('bar', '')]); await Promise.all([writeFile('foo', ''), writeFile('bar', '')]);
await sleep(); await sleep();
assert.ok(events.has('new file foo')); assert.equal(files.size, 2);
assert.ok(events.has('new file bar')); assert.ok(files.has('added foo'));
events.clear(); assert.ok(files.has('added bar'));
clear();
watch.close(); watch.close();
await writeFile('foo', ''); await writeFile('foo', '');
await sleep(); await sleep();
assert.equal(events.size, 0); assert.equal(files.size, 0);
}
const watch2 = new CheapWatch({ {
dir: process.cwd(), const watch = new CheapWatch({
filter: ({ path, stats }) => dir: process.cwd(),
(stats.isFile() && !path.includes('skip-file')) || filter: ({ path, stats }) =>
(stats.isDirectory() && !path.includes('skip-directory')), (stats.isFile() && !path.includes('skip-file')) ||
}); (stats.isDirectory() && !path.includes('skip-directory')),
const events2 = getEvents(watch2); });
const { files, directories, clear } = getEvents(watch);
await watch2.init(); await watch.init();
await writeFile('skip-file', ''); await writeFile('skip-file', '');
await sleep(); await sleep();
assert.equal(events2.size, 0); assert.equal(files.size, 0);
await writeFile('foo', ''); await writeFile('foo', '');
await sleep(); await sleep();
assert.ok(events2.has('updated file foo')); assert.equal(files.size, 1);
events2.clear(); assert.ok(files.has('updated foo'));
clear();
await mkdir('skip-directory'); await mkdir('skip-directory');
await sleep(); await sleep();
assert.equal(events2.size, 0); assert.equal(directories.size, 0);
await writeFile('skip-directory/foo', ''); await writeFile('skip-directory/foo', '');
await sleep(); await sleep();
assert.equal(events2.size, 0); assert.equal(files.size, 0);
await mkdir('included-directory'); await mkdir('included-directory');
await sleep(); await sleep();
assert.ok(events2.has('new directory included-directory')); assert.equal(directories.size, 1);
await writeFile('included-directory/foo', ''); assert.ok(directories.has('added included-directory'));
await sleep(); await writeFile('included-directory/foo', '');
events2.clear(); await sleep();
clear();
await rename('included-directory/foo', 'included-directory/foo-2'); await rename('included-directory/foo', 'included-directory/foo-2');
await sleep(); await sleep();
assert.ok(events2.has('deleted file included-directory/foo')); assert.equal(files.size, 2);
assert.ok(events2.has('new file included-directory/foo-2')); assert.ok(files.has('deleted included-directory/foo'));
assert.ok(events2.has('updated directory included-directory')); assert.ok(files.has('added included-directory/foo-2'));
events2.clear(); assert.ok(directories.has('updated included-directory'));
clear();
await rename('included-directory', 'included-directory-2'); await rename('included-directory', 'included-directory-2');
await sleep(); await sleep();
assert.ok(events2.has('deleted directory included-directory')); assert.equal(files.size, 2);
assert.ok(events2.has('deleted file included-directory/foo-2')); assert.ok(files.has('deleted included-directory/foo-2'));
assert.ok(events2.has('new directory included-directory-2')); assert.ok(files.has('added included-directory-2/foo-2'));
assert.ok(events2.has('new file included-directory-2/foo-2')); assert.ok(directories.has('deleted included-directory'));
events2.clear(); assert.ok(directories.has('added included-directory-2'));
clear();
watch2.close(); watch.close();
}
console.log('tests successful!'); console.log('tests successful!');