filer/tests/spec/shell/find.spec.js

206 lines
4.8 KiB
JavaScript

var util = require('../../lib/test-utils.js');
var expect = require('chai').expect;
describe('FileSystemShell.find', function() {
beforeEach(function(done) {
util.setup(function() {
var fs = util.fs();
/**
* Create a basic fs layout for each test:
*
* /
* --file1
* --file2
* --dir1/
* --file3
* --subdir1/
* --dir2/
* --file4
*/
fs.writeFile('/file1', 'file1', function(err) {
if(err) throw err;
fs.writeFile('/file2', 'file2', function(err) {
if(err) throw err;
fs.mkdir('/dir1', function(err) {
if(err) throw err;
fs.writeFile('/dir1/file3', 'file3', function(err) {
if(err) throw err;
fs.mkdir('/dir1/subdir1', function(err) {
if(err) throw err;
fs.mkdir('/dir2', function(err) {
if(err) throw err;
fs.writeFile('/dir2/file4', 'file4', function(err) {
if(err) throw err;
done();
});
});
});
});
});
});
});
});
});
afterEach(util.cleanup);
it('should be a function', function() {
var shell = util.shell();
expect(shell.find).to.be.a('function');
});
it('should fail when path does not exist', function(done) {
var shell = util.shell();
shell.find('/no-such-folder', function(err, found) {
expect(err).to.exist;
expect(err.code).to.equal('ENOENT');
expect(found).not.to.exist;
done();
});
});
it('should fail when path exists but is non-dir', function(done) {
var shell = util.shell();
shell.find('/file1', function(err, found) {
expect(err).to.exist;
expect(err.code).to.equal('ENOTDIR');
expect(found).not.to.exist;
done();
});
});
it('should find all paths in the filesystem with no options', function(done) {
var shell = util.shell();
shell.find('/', function(err, found) {
expect(err).not.to.exist;
var expected = [
'/',
'/file1',
'/file2',
'/dir1/',
'/dir1/file3',
'/dir1/subdir1/',
'/dir2/',
'/dir2/file4'
];
expect(found).to.deep.equal(expected);
done();
});
});
it('should get same paths in exec as are found when complete', function(done) {
var shell = util.shell();
var pathsSeen = [];
function processPath(path, next) {
pathsSeen.push(path);
next();
}
shell.find('/', {exec: processPath}, function(err, found) {
expect(err).not.to.exist;
expect(found).to.deep.equal(pathsSeen);
done();
});
});
it('should return only paths that match a regex pattern', function(done) {
var shell = util.shell();
shell.find('/', {regex: /file\d$/}, function(err, found) {
expect(err).not.to.exist;
var expected = [
'/file1',
'/file2',
'/dir1/file3',
'/dir2/file4'
];
expect(found).to.deep.equal(expected);
done();
});
});
it('should append a / to the end of a dir path', function(done) {
var shell = util.shell();
var dirsSeen = 0;
function endsWith(str, suffix) {
var lastIndex = str.lastIndexOf(suffix);
return (lastIndex !== -1) && (lastIndex + suffix.length === str.length);
}
function processPath(path, next) {
expect(endsWith(path, '/')).to.be.true;
dirsSeen++;
next();
}
shell.find('/', {regex: /dir\d$/, exec: processPath}, function(err) {
expect(err).not.to.exist;
expect(dirsSeen).to.equal(3);
done();
});
});
it('should only look below the specified dir path', function(done) {
var shell = util.shell();
shell.find('/dir1', function(err, found) {
expect(err).not.to.exist;
var expected = [
'/dir1/',
'/dir1/file3',
'/dir1/subdir1/'
];
expect(found).to.deep.equal(expected);
done();
});
});
it('should allow using options.name to match basename with a pattern', function(done) {
var shell = util.shell();
shell.find('/', {name: 'file*'}, function(err, found) {
expect(err).not.to.exist;
var expected = [
'/file1',
'/file2',
'/dir1/file3',
'/dir2/file4'
];
expect(found).to.deep.equal(expected);
done();
});
});
it('should allow using options.path to match dirname with a pattern', function(done) {
var shell = util.shell();
shell.find('/', {name: '*ir1*'}, function(err, found) {
expect(err).not.to.exist;
var expected = [
'/dir1/',
'/dir1/subdir1/'
];
expect(found).to.deep.equal(expected);
done();
});
});
});