Website/node_modules/ncp/test/ncp.js
2015-12-02 18:21:44 -05:00

170 lines
5.1 KiB
JavaScript

var assert = require('assert'),
fs = require('fs'),
path = require('path'),
rimraf = require('rimraf'),
readDirFiles = require('read-dir-files'),
ncp = require('../').ncp;
describe('ncp', function () {
describe('regular files and directories', function () {
var fixtures = path.join(__dirname, 'regular-fixtures'),
src = path.join(fixtures, 'src'),
out = path.join(fixtures, 'out');
before(function (cb) {
rimraf(out, function() {
ncp(src, out, cb);
});
});
describe('when copying a directory of files', function () {
it('files are copied correctly', function (cb) {
readDirFiles(src, 'utf8', function (srcErr, srcFiles) {
readDirFiles(out, 'utf8', function (outErr, outFiles) {
assert.ifError(srcErr);
assert.deepEqual(srcFiles, outFiles);
cb();
});
});
});
});
describe('when copying files using filter', function () {
before(function (cb) {
var filter = function(name) {
return name.substr(name.length - 1) != 'a';
};
rimraf(out, function () {
ncp(src, out, {filter: filter}, cb);
});
});
it('files are copied correctly', function (cb) {
readDirFiles(src, 'utf8', function (srcErr, srcFiles) {
function filter(files) {
for (var fileName in files) {
var curFile = files[fileName];
if (curFile instanceof Object)
return filter(curFile);
if (fileName.substr(fileName.length - 1) == 'a')
delete files[fileName];
}
}
filter(srcFiles);
readDirFiles(out, 'utf8', function (outErr, outFiles) {
assert.ifError(outErr);
assert.deepEqual(srcFiles, outFiles);
cb();
});
});
});
});
describe('when using clobber=false', function () {
it('the copy is completed successfully', function (cb) {
ncp(src, out, function() {
ncp(src, out, {clobber: false}, function(err) {
assert.ifError(err);
cb();
});
});
});
});
describe('when using transform', function () {
it('file descriptors are passed correctly', function (cb) {
ncp(src, out, {
transform: function(read,write,file) {
assert.notEqual(file.name, undefined);
assert.strictEqual(typeof file.mode,'number');
read.pipe(write);
}
}, cb);
});
});
describe('when using rename', function() {
it('output files are correctly redirected', function(cb) {
ncp(src, out, {
rename: function(target) {
if(path.basename(target) == 'a') return path.resolve(path.dirname(target), 'z');
return target;
}
}, function(err) {
if(err) return cb(err);
readDirFiles(src, 'utf8', function (srcErr, srcFiles) {
readDirFiles(out, 'utf8', function (outErr, outFiles) {
assert.ifError(srcErr);
assert.deepEqual(srcFiles.a, outFiles.z);
cb();
});
});
});
});
});
});
describe('symlink handling', function () {
var fixtures = path.join(__dirname, 'symlink-fixtures'),
src = path.join(fixtures, 'src'),
out = path.join(fixtures, 'out');
beforeEach(function (cb) {
rimraf(out, cb);
});
it('copies symlinks by default', function (cb) {
ncp(src, out, function (err) {
if (err) return cb(err);
assert.equal(fs.readlinkSync(path.join(out, 'file-symlink')), 'foo');
assert.equal(fs.readlinkSync(path.join(out, 'dir-symlink')), 'dir');
cb();
})
});
it('copies file contents when dereference=true', function (cb) {
ncp(src, out, { dereference: true }, function (err) {
var fileSymlinkPath = path.join(out, 'file-symlink');
assert.ok(fs.lstatSync(fileSymlinkPath).isFile());
assert.equal(fs.readFileSync(fileSymlinkPath), 'foo contents');
var dirSymlinkPath = path.join(out, 'dir-symlink');
assert.ok(fs.lstatSync(dirSymlinkPath).isDirectory());
assert.deepEqual(fs.readdirSync(dirSymlinkPath), ['bar']);
cb();
});
});
});
describe('broken symlink handling', function () {
var fixtures = path.join(__dirname, 'broken-symlink-fixtures'),
src = path.join(fixtures, 'src'),
out = path.join(fixtures, 'out');
beforeEach(function (cb) {
rimraf(out, cb);
});
it('copies broken symlinks by default', function (cb) {
ncp(src, out, function (err) {
if (err) return cb(err);
assert.equal(fs.readlinkSync(path.join(out, 'broken-symlink')), 'does-not-exist');
cb();
})
});
it('returns an error when dereference=true', function (cb) {
ncp(src, out, {dereference: true}, function (err) {
assert.equal(err.length, 1);
assert.equal(err[0].code, 'ENOENT');
cb();
});
});
});
});