281 lines
7.3 KiB
JavaScript
281 lines
7.3 KiB
JavaScript
|
var fs = require('fs');
|
||
|
var assert = require('assert');
|
||
|
var path = require('path');
|
||
|
var tmp = require('tmp');
|
||
|
var find = require('..');
|
||
|
|
||
|
tmp.setGracefulCleanup();
|
||
|
|
||
|
function createBy(type) {
|
||
|
return function(dir, num, ext) {
|
||
|
var targets = [];
|
||
|
num = num || 1;
|
||
|
if (Array.isArray(dir)) dir = dir[0];
|
||
|
var opts = { template: path.join(dir, '/tmp-XXXXXX' + (ext || '')) };
|
||
|
for (var i = 0; i < num; ++i) {
|
||
|
targets.push(tmp[type + 'Sync'](opts).name);
|
||
|
}
|
||
|
return targets;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function assertEqual(a, b) {
|
||
|
assert.deepEqual(a.sort(), b.sort());
|
||
|
}
|
||
|
|
||
|
|
||
|
var createFilesUnder = createBy('file');
|
||
|
var createDirUnder = createBy('dir');
|
||
|
|
||
|
function createNestedDirs(testdir) {
|
||
|
var level1 = createDirUnder(testdir)[0];
|
||
|
var level2 = createDirUnder(level1)[0];
|
||
|
var level22 = createDirUnder(level1)[0];
|
||
|
var level3 = createDirUnder(level2)[0];
|
||
|
return [level1, level2, level22, level3];
|
||
|
}
|
||
|
|
||
|
describe('API test', function() {
|
||
|
var testdir;
|
||
|
|
||
|
beforeEach(function(done) {
|
||
|
tmp.dir({unsafeCleanup: true}, function(err, dir) {
|
||
|
if (err) return done(err);
|
||
|
testdir = dir;
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('`find.file()` should find all files and returns as an array in callback', function(done) {
|
||
|
var expect = createFilesUnder(testdir, 3);
|
||
|
find.file(testdir, function(found) {
|
||
|
assertEqual(expect, found);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('`find.file()` should find recursively', function(done) {
|
||
|
var expect = createFilesUnder(testdir, 3);
|
||
|
var level1 = createDirUnder(testdir);
|
||
|
expect = expect.concat(createFilesUnder(testdir, 2));
|
||
|
|
||
|
find.file(testdir, function(found) {
|
||
|
assertEqual(expect, found);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('`find.dir()` should find all dirs just like find.file()', function(done) {
|
||
|
var expect = createNestedDirs(testdir);
|
||
|
find.dir(testdir, function(found) {
|
||
|
assertEqual(expect, found);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('`find.eachfile()` should find all files and process one by one', function(done) {
|
||
|
var expect = createFilesUnder(testdir, 3);
|
||
|
count = 0;
|
||
|
find.eachfile(testdir, function(thisfile) {
|
||
|
assert(expect.indexOf(thisfile) > -1);
|
||
|
count++;
|
||
|
}).end(function() {
|
||
|
assert(count == expect.length);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('`find.eachdir()` should find all dirs just like find.eachfile()', function(done) {
|
||
|
var expect = createNestedDirs(testdir);
|
||
|
var count = 0;
|
||
|
find.eachdir(testdir, function(thisdir) {
|
||
|
assert(expect.indexOf(thisdir) > -1);
|
||
|
count++;
|
||
|
}).end(function() {
|
||
|
assert(count == expect.length);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('`find.fileSync()` should find all files synchronously', function() {
|
||
|
var expect = createFilesUnder(testdir, 3);
|
||
|
var found = find.fileSync(testdir);
|
||
|
assertEqual(expect, found);
|
||
|
});
|
||
|
|
||
|
it('`find.dirSync()` should find all dirs synchronously', function() {
|
||
|
var expect = createNestedDirs(testdir, 3);
|
||
|
var found = find.dirSync(testdir);
|
||
|
assertEqual(expect, found);
|
||
|
});
|
||
|
|
||
|
it('`find.*` should find by name', function(done) {
|
||
|
var expect = createFilesUnder(testdir, 3);
|
||
|
var first = expect[0];
|
||
|
find.file(path.basename(first), testdir, function(found) {
|
||
|
assert.equal(first, found[0]);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('`find.*` should find by regular expression', function() {
|
||
|
var html = createFilesUnder(testdir, 1, '.html');
|
||
|
var js = createFilesUnder(testdir, 2, '.js');
|
||
|
|
||
|
htmlAll = find.fileSync(/\.html$/, testdir);
|
||
|
assert.equal( html.join(''), htmlAll.join(''));
|
||
|
|
||
|
jsAll = find.fileSync(/\.js$/, testdir);
|
||
|
assertEqual(js, jsAll);
|
||
|
});
|
||
|
|
||
|
it('`find.*` should follow file symbolic links', function(done) {
|
||
|
var files = createFilesUnder(testdir, 2);
|
||
|
var srcfile = files[0];
|
||
|
var linkfile = srcfile + '-link';
|
||
|
files.push(linkfile);
|
||
|
fs.symlinkSync(srcfile, linkfile, 'file');
|
||
|
|
||
|
var allfile = find.fileSync(testdir);
|
||
|
assertEqual(files, allfile);
|
||
|
|
||
|
find.file(testdir, function(found) {
|
||
|
assertEqual(files, found);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('`find.find(Sync)` should return the symbolic links directly which does not exist', function(done) {
|
||
|
var files = createFilesUnder(testdir, 2);
|
||
|
var srcfile = files[0];
|
||
|
var linkfile = srcfile + '-link';
|
||
|
fs.symlinkSync(srcfile, linkfile, 'file');
|
||
|
fs.unlinkSync(srcfile);
|
||
|
|
||
|
var expected = [files[1], linkfile];
|
||
|
var found = find.fileSync(testdir);
|
||
|
assertEqual(found, expected);
|
||
|
|
||
|
find.file(testdir, function(found) {
|
||
|
assertEqual(expected, found);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('`find.*` should follow direcotry symbolic links', function(done) {
|
||
|
createFilesUnder(testdir, 2);
|
||
|
var dir = createDirUnder(testdir)[0];
|
||
|
var srcdir = createDirUnder(testdir)[0];
|
||
|
var linkdir = srcdir + '-link';
|
||
|
var dirs = [dir, srcdir, linkdir];
|
||
|
|
||
|
fs.symlinkSync(srcdir, linkdir, 'dir');
|
||
|
|
||
|
var alldir = find.dirSync(testdir);
|
||
|
assertEqual(dirs, alldir);
|
||
|
|
||
|
find.dir(testdir, function(found) {
|
||
|
assertEqual(dirs, found);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('`find.dir(Sync)` should ignore circular symbolic links', function(done) {
|
||
|
var dirs = createDirUnder(testdir, 2);
|
||
|
var src = dirs[0];
|
||
|
var remaining = dirs.slice(1);
|
||
|
var a = src + '-link-a';
|
||
|
var b = src + '-link-b';
|
||
|
var c = src + '-link-c';
|
||
|
|
||
|
fs.symlinkSync(src, a, 'dir');
|
||
|
fs.symlinkSync(a, b, 'dir');
|
||
|
fs.symlinkSync(b, c, 'dir');
|
||
|
fs.rmdirSync(src);
|
||
|
fs.symlinkSync(c, src, 'dir');
|
||
|
|
||
|
var found = find.dirSync(testdir);
|
||
|
assertEqual(remaining, found);
|
||
|
|
||
|
find.dir(testdir, function(found) {
|
||
|
assertEqual(remaining, found);
|
||
|
done();
|
||
|
})
|
||
|
});
|
||
|
|
||
|
it('`find.*` should find for a symbolic directory', function(done) {
|
||
|
var expect = createFilesUnder(testdir, 2);
|
||
|
var linkdir = testdir + '-link';
|
||
|
|
||
|
fs.symlinkSync(testdir, linkdir, 'dir');
|
||
|
|
||
|
var allfiles = find.fileSync(linkdir);
|
||
|
assertEqual(
|
||
|
expect.map(function(n) { return fs.realpathSync(n) }),
|
||
|
allfiles.map(function(n) { return fs.realpathSync(n) })
|
||
|
);
|
||
|
|
||
|
find.file(linkdir, function(found) {
|
||
|
assertEqual(
|
||
|
expect.map(function(n) { return fs.realpathSync(n) }),
|
||
|
found.map(function(n) { return fs.realpathSync(n) })
|
||
|
);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('`find.*` should follow relative symbolic links', function(done) {
|
||
|
var count = 2;
|
||
|
var dir = createNestedDirs(testdir)[0];
|
||
|
createFilesUnder(dir, count);
|
||
|
|
||
|
var linkdir = dir + '-link';
|
||
|
|
||
|
// create relative symbolic link
|
||
|
process.chdir(path.dirname(dir));
|
||
|
fs.symlinkSync(path.basename(dir), linkdir, 'dir');
|
||
|
|
||
|
// move to somewhere else
|
||
|
process.chdir(__dirname);
|
||
|
var found = find.fileSync(linkdir);
|
||
|
|
||
|
assert.equal(found.length, count);
|
||
|
|
||
|
find.file(testdir, function(found) {
|
||
|
assert.equal(found.length, count);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('`.error()`should catch exceptions', function(done) {
|
||
|
var catched;
|
||
|
try {
|
||
|
find
|
||
|
.file('__not_exist', function(f) { })
|
||
|
.error(function(err) {
|
||
|
catched = true;
|
||
|
});
|
||
|
} catch(e) {
|
||
|
catched = false;
|
||
|
}
|
||
|
setTimeout(function() {
|
||
|
assert(catched);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
it('should throw exception at root which does not exist', function(done) {
|
||
|
var catched = false;
|
||
|
try {
|
||
|
find.fileSync('__not_exist');
|
||
|
} catch(e) {
|
||
|
catched = true;
|
||
|
}
|
||
|
setTimeout(function() {
|
||
|
assert(catched);
|
||
|
done();
|
||
|
});
|
||
|
});
|
||
|
|
||
|
});
|