make tests stricter for file events
This commit is contained in:
parent
a8f6d5c970
commit
b7b5a8d2ba
217
test.js
217
test.js
|
@ -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!');
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue